実際のプロジェクト開発では、安定性や効率性の観点から、車輪の再発明は推奨されません。しかし、学習プロセスにおいてホイールを構築することは間違いなく自分自身にとって有益であり、有害ではなく、特にシステムプログラミング能力を向上させることができる手段です。
今日は、私がよく使用するいくつかのオープンソース ツール ライブラリを共有します。
1. MyExcel: メモリ使用量が少なく、優れたパフォーマンスを備えたフル機能の Excel 処理ツール。
2. OSHI: JNAベースの (ネイティブ) オペレーティング システムおよびJava 言語用の ハードウェア リポジトリ。
3. JsonPath: JSON を読み取るための Java DSL
4. カフェイン: 強力なローカル キャッシュ
5. Hutool: 完全な Java ツール ライブラリ
以下に詳細を紹介しますので、友人がすぐに始められるように読んで、自分のプロジェクトに使用して生産効率を向上させることをお勧めします。
MyExcel:Excel処理
プロジェクト紹介
EasyExcel は誰もが知っているはずです。これは Ali によってオープンソース化されている Excel 処理ツールで、大きなファイルのメモリ オーバーフローの問題を回避できます。私はこのプロジェクトを以前に何度か推奨しました。
MyExcel は Excel 処理ツールでもあり、大きなファイルのメモリ オーバーフローの問題も回避でき、より包括的な機能、より低いメモリ使用量、より優れたパフォーマンスを備えています (公式テストの比較結果による)。
プロジェクト Wiki のテスト データによると、次のようになります。
2430 万 Excel、500,000 行、8 列、40 読み取りサイクル、平均メモリ使用量は約 75 メガバイト、Ali EasyExcel (V2.1.6) の同じファイル テストと比較して、メモリ使用量は MyExcel の約 3 分の 1
MyExcel と EasyExcel のメモリ使用量の比較
MyExcel の主な利点は次のとおりです。
MyExcel の主な利点
情報に頼る
Maven リポジトリのアドレス: https://mvnrepository.com/artifact/com.github.liaochong/myexcel 。
メイブン :
<dependency>
<groupId>com.github.liaochong</groupId>
<artifactId>myexcel</artifactId>
<version>4.3.0.RC4</version>
</dependency>
グラドル:
implementation 'com.github.liaochong:myexcel:4.3.0.RC4'
デモ
MyExcel には多くの機能があります。ここでは個別の紹介のみを選択します。詳細な紹介については、公式 Wiki: https://github.com/liaochong/myexcel/wikiを参照してください 。
1.ストリームエクスポート
MyExcel はストリーミング エクスポートをサポートし、プロデューサー/コンシューマー モードを採用し、データをバッチで取得でき、メモリ使用量が非常に低くなります。さらに、ストリーミング エクスポートは、zip アーカイブなどの独自の機能をサポートします。
DefaultStreamExcelBuilder<ArtCrowd> streamExcelBuilder = DefaultStreamExcelBuilder
.of(ArtCrowd.class) // 如导出Map类型数据,请使用of(Map.class)
.threadPool(Executors.newFixedThreadPool(10))// 线程池,可选
.templateHandler(FreemarkerTemplateHandler.class)// 追加模板数据,可选,适合极度个性化数据导出
.capacity(10_000)// 容量设定,在主动划分excel使用,可选
.start();
2. カスタムスタイル
MyExcel は、幅、高さ、背景色、境界線、フォント、その他のスタイルの調整を含むカスタム スタイルをサポートしています。詳細については、https: //github.com/liaochong/myexcel/wiki/Style-supportを参照してください 。
タイトル (タイトル) スタイルのカスタマイズ:
ExcelColumn(style={"title->color:red","cell->color:green"})
Integer age;
コンテンツ行スタイルのカスタマイズ:
@ExcelColumn(style="cell->color:green")
Integer age;
メソッド呼び出しによりスタイルが設定されます。
DefaultExcelBuilder.of(ArtCrowd.class)
.style("title->color:red","background-color:green;")
.build(dataList);
3. ドロップダウンリスト
MyExcel はドロップダウン リストの生成をサポートしており、List または Array パラメータを渡すだけです。
@ExcelColumn(title="下拉列表")
List<String> options;
関連アドレス
-
プロジェクトアドレス: https://github.com/liaochong/myexcel
-
公式ドキュメント: https://github.com/liaochong/myexcel/wiki
OSHI: ローカルマシン情報の取得
プロジェクト紹介
OSHI は、 JNAベースの (ネイティブ) オペレーティング システムおよびJava 言語の ハードウェア リポジトリです。
[JNA(Java Native Access)](https://github.com/java-native-access/jna "JNA(Java Native Access "JNA(Java Native Access)")") は、オープンソースの Java フレームワークです。 Sun 社が発表したローカル メソッド呼び出し技術は、古典的な JNI をベースにしたフレームワークです。JNA が JNI の代替と言われる理由は、JNA がローカル メソッドを呼び出すプロセスを大幅に簡素化し、非常に使いやすく、基本的に Java 環境を離れることなく完了できるためです。
JNI (Java Native Interface) は、Java と他のプログラミング言語の間にブリッジを構築する Java ネイティブ インターフェイスで、Java プログラムが他の言語 (特に C/C++) で書かれたプログラムやコード ライブラリを呼び出すことができるようにします。さらに、JDK 自体の実装でも、ローカル C ライブラリを呼び出すために JNI テクノロジが広範囲に使用されています。
OSHI を使用すると、メモリと CPU の使用状況、ディスクとパーティションの使用状況、デバイス、センサーなどを表示するために他のネイティブ ライブラリをインストールする必要はありません。
OSHI は、システム情報を取得するためのクロスプラットフォーム実装を提供し、Windows、Linux、MacOS、Unix などの主流のオペレーティング システムをサポートすることを目指しています。
oshi の公式紹介は次のとおりです (翻訳 Chrome プラグイン: Mate Translate ):
oshi を使用すると、次の図に示すように、プロジェクトでよく使用されるシステム監視機能を簡単に作成できます。
情報に頼る
Maven リポジトリのアドレス: https://mvnrepository.com/artifact/com.github.oshi/oshi-core 。
メイビン:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-parent</artifactId>
<version>6.4.1</version>
<type>pom</type>
</dependency>
グラドル:
implementation 'com.github.oshi:oshi-core:6.4.1'
デモ
ハードウェア情報オブジェクトを取得しますHardwareAbstractionLayer
。
//系统信息
SystemInfo si = new SystemInfo();
//操作系统信息
OperatingSystem os = si.getOperatingSystem();
//硬件信息
HardwareAbstractionLayer hal = si.getHardware();
// 磁盘信息
List<HWDiskStore> diskStores = hal.getDiskStores();
ハードウェア情報を表すオブジェクトができたのでHardwareAbstractionLayer
、ハードウェア関連の情報を取得できるようになりました。
以下は、メモリと CPU 関連の情報を取得する簡単なデモンストレーションです。
1. メモリ関連情報の取得
//内存相关信息
GlobalMemory memory = hal.getMemory();
//获取内存总容量
String totalMemory = FormatUtil.formatBytes(memory.getTotal());
//获取可用内存的容量
String availableMemory = FormatUtil.formatBytes(memory.getAvailable());
合計メモリ容量と使用可能なメモリ容量を使用して、現在のメモリ使用率を計算できます。
2. CPU関連情報の取得
//CPU相关信息
CentralProcessor processor = hal.getProcessor();
//获取CPU名字
String processorName = processor.getProcessorIdentifier().getName();
//获取物理CPU数
int physicalPackageCount = processor.getPhysicalPackageCount();
//获取物理核心数
int physicalProcessorCount = processor.getPhysicalProcessorCount();
関連アドレス
-
プロジェクトアドレス:https: //github.com/oshi/oshi
-
公式サイト: https: //www.oshi.ooo/
JsonPath: JSON を読み取るための Java DSL
プロジェクト紹介
JsonPath は、JSON 構造のクエリ言語です。XML の XPATH およびリレーショナル データベースの SQL に相当し、これらは比較的一般的な DSL です。
JsonPath は、Java、JavaScript、Python、PHP、Ruby、Go などの複数の言語で実装を提供します。ここでは Java 版の実装を例に挙げます。
情報に頼る
Maven リポジトリのアドレス: https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path 。
メイビン:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.8.0</version>
</dependency>
グラドル:
implementation 'com.jayway.jsonpath:json-path:2.8.0'
デモ
テスト用の json ドキュメントの内容は次のとおりです。
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
すべての本の著者を読むには:
List<String> authors = JsonPath.read(json, "$.store.book[*].author");
すべての本を読んでフィルタリングします。
// 所有价格低于 10 的书籍
List<Map<String, Object>> books = JsonPath.parse(json)
.read("$.store.book[?(@.price < 10)]");
// 也可以通过 Filter API 来进行过滤
Filter cheapFictionFilter = filter(
where("category").is("fiction").and("price").lte(10D)
);
List<Map<String, Object>> books = JsonPath.parse(json).read("$.store.book[?]", cheapFictionFilter);
関連アドレス
-
プロジェクトアドレス: https://github.com/json-path/JsonPath
-
JSONPath の概要: https://goessner.net/articles/JsonPath/
カフェイン: 強力なローカル キャッシュ
プロジェクト紹介
Caffeine は私が最もよく使用するローカル キャッシュで、 Caffeine に似ています ConcurrentMap
が、より包括的なキャッシュ機能と強力なパフォーマンスを提供します。
パフォーマンスはどのくらいですか? 詳細な答えは、公式ドキュメントのベンチマーク テスト (アドレス: https://github.com/ben-manes/caffeine/wiki/Benchmarks ) に記載されています 。
以下の図は、 最大容量で構成されたキャッシュ上で8 つのスレッドが同時読み取りおよび書き込みを実行する 場合の、一般的なローカル キャッシュ実装のパフォーマンスの比較を示しています。
同時読み取り:
一般的なローカル キャッシュの同時読み取りパフォーマンスの比較
同時書き込み:
一般的なローカル キャッシュの同時書き込みパフォーマンスの比較
基本的なキャッシュ機能に加えて、Caffeine は有効期限や非同期ロードなどの機能も提供します。
Caffeine はローカル キャッシュに最適であると考えられており、Redisson、Cassandra、Hbase、Neo4j、Druid などの有名なオープンソース プロジェクトはすべて Caffeine を使用しています。
情報に頼る
Maven リポジトリのアドレス: https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine 。
Java 11 以降で使用され 3.x
、それ以外の場合に使用されます2.x
。
メイビン:
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.5</version>
</dependency>
グラドル:
implementation 'com.github.ben-manes.caffeine:caffeine:3.1.5'
デモ
カフェインと API は Guava に非常に似ており、Guava の設計を借用しています。
キャッシュを作成します。
Cache<Key, Graph> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10_000)
.build();
キャッシュを手動で削除します。
// 单个key
cache.invalidate(key)
// 批量key
cache.invalidateAll(keys)
// 所有key
cache.invalidateAll()
統計:
// 统计缓存命中率、缓存回收数量、加载新值的平均时间
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.recordStats()
.build();
関連アドレス
-
プロジェクトアドレス: https://github.com/ben-manes/caffeine
-
公式ドキュメント: https://github.com/ben-manes/caffeine/wiki
Hutool: 完全な Java ツール ライブラリ
プロジェクト紹介
Hutool は、ファイル、ストリーム、暗号化と復号化、トランスコーディング、正規化、スレッド、XML などの JDK メソッドをカプセル化する、非常に便利な Java ツール ライブラリです。
本当に、包括的な機能を備えた優れたツール ライブラリであり、独自のプロジェクトでの使用に非常に適しています。
Hutool の公式紹介は次のとおりです。
ヒューツールの紹介
情報に頼る
Maven ウェアハウスのアドレス: https://mvnrepository.com/artifact/cn.hutool/hutool-all 。
メイビン:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
グラドル:
implementation 'cn.hutool:hutool-all:5.8.16'
デモ
私が個人的により実用的だと思ういくつかの関数の簡単なデモンストレーション。
型変換
Convert
クラスは、一般的な Java 型への変換をカプセル化します。
long[] b = {1,2,3,4,5};
String bStr = Convert.toStr(b);//"[1, 2, 3, 4, 5]"
double a = 67556.32;
String digitUppercase = Convert.digitToChinese(a);//"陆万柒仟伍佰伍拾陆元叁角贰分"
郵便
Javaでのメール送信は主に javax.mail
パッケージに依存しますが、使い方が面倒なのでHutoolでカプセル化しています。
src/main/resources
クラスパスの config ディレクトリの下に新しいファイルを作成します(標準 Maven プロジェクト内) mail.setting
。完全な構成は次のとおりです (メール サーバーは SMTP プロトコルをサポートし、開く必要があります)。
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,否则发送失败)
from = [email protected]
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3
メールの送信は非常に簡単です。
MailUtil.send("[email protected]", "测试", "邮件来自Hutool测试", false);
サポートグループの送信:
ArrayList<String> tos = CollUtil.newArrayList(
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]");
MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false);
1 つ以上の添付ファイルの追加をサポートします。
MailUtil.send("[email protected]", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml"));
このメソッドは、構成ファイルを使用してグローバル アカウントを定義するだけでなく、メール サーバー情報を記録する共通 Bean であるオブジェクトMailUtil.send
を渡すオーバーロードされたメソッドも提供します。MailAccount
MailAccount account = new MailAccount();
account.setHost("smtp.yeah.net");
account.setPort("25");
account.setAuth(true);
account.setFrom("[email protected]");
account.setUser("hutool");
account.setPass("q1w2e3");
MailUtil.send(account, CollUtil.newArrayList("[email protected]"), "测试", "邮件来自Hutool测试", false);
一意のID
分散環境では固有 ID の生成が広く使われており、その生成方法も多様ですが、Hutool はいくつかの一般的な生成戦略に対応したシンプルなパッケージを作成しています。
Hutool が提供する一意の ID 生成ツール クラスは以下をカバーします。
-
UUID
-
オブジェクトID(MongoDB)
-
スノーフレーク(Twitter)
UUIDを例に挙げてみましょう。
Hutool で書き換えたロジックはjava.util.UUID
class に対応しているcn.hutool.core.lang.UUID
ため、 - のない UUID 文字列の生成では文字置換が不要となり、パフォーマンスが約 1 倍向上します。
//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();
HTTPリクエストツールクラス
最も一般的に使用される GET リクエストと POST リクエストについては、HttpUtil は 2 つのメソッドをカプセル化します。
-
HttpUtil.get
-
HttpUtil.post
GETリクエスト:
// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");
// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result3= HttpUtil.get("https://www.baidu.com", paramMap);
POSTリクエスト:
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result= HttpUtil.post("https://www.baidu.com", paramMap);
ファイルのアップロード:
HashMap<String, Object> paramMap = new HashMap<>();
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put("file", FileUtil.file("D:\\face.jpg"));
String result= HttpUtil.post("https://www.baidu.com", paramMap);
キャッシュ
Hutool は、いくつかの一般的なキャッシュ戦略の実装を提供します。
-
FIFO(先入れ先出し) : 先入れ先出しポリシー。
-
LFU(最も頻繁に使用されない) : 最も頻繁に使用されない戦略。
-
LRU(最近使用されていない) : 戦略は長期間使用されていません。
-
Timed : タイミング戦略。
-
Weak : 弱い参照戦略。
さらに、Hutool は、小さなファイルを byte[]
の形式でコンテンツにキャッシュし、ファイル アクセスを削減し、頻繁なファイル読み取りによって引き起こされるパフォーマンスの問題を解決することもサポートしています。
FIFO (先入れ先出し) ポリシー キャッシュは以下を使用します。
Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3);
//加入元素,每个元素可以设置其过期时长,DateUnit.SECOND.getMillis()代表每秒对应的毫秒数,在此为3秒
fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);
//由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);
//value1为null
String value1 = fifoCache.get("key1");
コンソール印刷パッケージ
通常の状況では、情報はコンソールに出力されるため、友人はそれをよく知っているはずです。
System.out.println("Hello World");
ただし、このアプローチは多くのシナリオのニーズを満たしていません。
-
パラメータはサポートされていないため、オブジェクトの印刷では文字列を連結する必要があります
-
配列は直接出力できないため、手動で呼び出す必要があります
Arrays.toString
この目的のために、Hutool はConsole
オブジェクトをカプセル化します。
Console
オブジェクトの使用は、console.log()
JavaScript のメソッドにより似ています。JavaScript も JS から借用した構文糖です。
String[] a = {"java", "c++", "c"};
Console.log(a);//控制台输出:[java, c++, c]
Console.log("This is Console log for {}.", "test");//控制台输出:This is Console log for test.
暗号化とデコード
Hutool は、対称暗号化、非対称暗号化、ダイジェスト暗号化、メッセージ認証コード アルゴリズム、および国家秘密をサポートします。
ここでは国家秘密アルゴリズムを例に挙げますが、Hutool はBouncy Castle
国家秘密アルゴリズムの SM2、SM3、SM4 を実装するための簡易パッケージを作成しています。
National Secret アルゴリズムでは、Bouncy Castle
ライブラリの依存関係を導入する必要があります。
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency>
SM2 は、カスタム キー ペアを使用して暗号化または復号化します 。
String text = "JavaGuide:一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!";
System.out.println("原文:" + text);
KeyPair pair = SecureUtil.generateKeyPair("SM2");
// 公钥
byte[] privateKey = pair.getPrivate().getEncoded();
// 私钥
byte[] publicKey = pair.getPublic().getEncoded();
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
System.out.println("加密后:" + encryptStr);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("解密后:" + decryptStr);
SM2 署名と検証 :
//加签
String sign = sm2.signHex(HexUtil.encodeHexStr(text));
System.out.println("签名:" + sign);
//验签
boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(text), sign);
System.out.println("验签:" + verify);
スレッドプール
Hutool はビルダー パターンを使用したカスタム スレッド プールの作成をサポートしているため、見やすくなります。
private static ExecutorService pool = ExecutorBuilder.create()
.setCorePoolSize(10)//初始池大小
.setMaxPoolSize(20) //最大池大小
.setWorkQueue(new LinkedBlockingQueue<>(100))//最大等待数为100
.setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build())// 线程池命名
.build();
実際のプロジェクトでは、オブジェクトに多くの属性がある場合、ビルダー パターンを使用してオブジェクトを作成することについて限定的に考慮する必要があります。
さらに、Hutool はグローバル スレッド プールも提供しており、すべての非同期メソッドはデフォルトでこのスレッド プールで実行されます。
-
ThreadUtil.execute
: パブリック スレッド プールでスレッドを直接実行します。 -
ThreadUtil.execAsync
: 非同期メソッドを実行します。 -
……
Hutool 自体は、 ThreadUtil
センシティブ ワード ツール クラスなど、 広く使用されていますSensitiveUtil
。
public static void init(final Collection<String> sensitiveWords, boolean isAsync){
if(isAsync){
// 异步初始化敏感词树
ThreadUtil.execAsync(new Callable<Boolean>(){
@Override
public Boolean call() throws Exception {
init(sensitiveWords);
return true;
}
});
}else{
// 同步初始化敏感词树
init(sensitiveWords);
}
}
関連アドレス
-
プロジェクトアドレス: https://github.com/dromara/hutool
-
公式サイト:https ://hutool.cn/
追記
Java の利点の 1 つは、Java が特に優れたエコロジーを備えており、多くの便利なツール ライブラリやフレームワークが含まれており、ほぼすべての需要シナリオをカバーしていることです。多くのことを最初から行う必要はまったくなく、既存の安定した信頼性の高いツール ライブラリを使用することで、開発効率を大幅に向上させることができます。
たとえば、Excel ドキュメント処理の場合は、次のオープン ソース ツール ライブラリを検討できます。
-
easyexcel[1] : OOM を回避する高速でシンプルな Java 処理 Excel ツール。
-
Excel-streaming-reader[2]: 標準 POI API の構文を保持しながら、Apache POI パッケージに基づいた Excel ストリーミング コード スタイルの読み取りツール (XLSX ファイルの読み取りのみをサポート)。
-
myexcel[3]: Excel のインポート、エクスポート、暗号化などの複数の機能を統合したツールキット。
もう 1 つの例は、PDF ドキュメントの処理です。
-
pdfbox[4] : PDF ドキュメントを処理するためのオープンソース Java ツール。このプロジェクトでは、新しい PDF ドキュメントの作成、既存のドキュメントの操作、ドキュメントからのコンテンツの抽出が可能です。PDFBox には、いくつかのコマンド ライン ユーティリティも含まれています。PDFBox は、Apache バージョン 2.0 ライセンスに基づいてリリースされています。
-
OpenPDF[5]: OpenPDF は、LGPL および MPL オープン ソース ライセンスに基づいて PDF ファイルを作成および編集するための無料の Java ライブラリです。OpenPDF は iText のフォークに基づいています。
-
itext7[6]: iText 7 は、PDF を活用したい開発者向けのより高いレベルの SDK を表します。iText 7 は、より優れたドキュメント エンジン、高レベルおよび低レベルのプログラミング機能、PDF ドキュメントの作成、編集、拡張機能を備えており、ほぼすべてのワークフローにメリットをもたらします。
-
FOP[7] : Apache FOP プロジェクトの主な出力ターゲットは PDF です。
Java 開発で一般的に使用されるいくつかのツール ライブラリは、私の Web サイト (https://javaguide.cn/open-source-project/tool-library.html) にまとめられており、参考として使用できます。
参考文献
[1]
easyexcel: https://github.com/alibaba/easyexcel
[2]
Excel-ストリーミング-リーダー: https://github.com/monitorjbl/excel-streaming-reader
[3]
myexcel: https://github.com/liaochong/myexcel
[4]
pdfbox: https://github.com/apache/pdfbox
[5]
OpenPDF: https://github.com/LibrePDF/OpenPDF
[6]
itext7: https://github.com/itext/itext7
[7]
FOP: https://xmlgraphics.apache.org/fop/