<!-- Maven -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version> <!-- 5.x 為 LGPL/MPL,7.x 為 AGPL -->
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
// Gradle (Kotlin DSL)
implementation("com.itextpdf:itextpdf:5.5.13.3")
implementation("com.itextpdf:itext-asian:5.2.0")
| 類別 | 用途 |
|---|---|
Document | 文件容器,設定頁面大小、邊距 |
PdfWriter | PDF 輸出器,綁定 Document 與 OutputStream |
Paragraph | 段落(可設定縮進、對齊、字型) |
Chapter / Section | 章節結構,自動產生書籤 |
Font | 字型規格:家族、大小、樣式、顏色 |
List / ListItem | 有序/無序清單 |
Table / Cell | 表格佈局(舊版),新版建議用 PdfPTable |
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
public class HelloPdf {
public static void main(String[] args) throws Exception {
// 1. 建立文件
Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
// 2. 綁定輸出器
PdfWriter.getInstance(doc, new FileOutputStream("hello.pdf"));
// 3. 開啟文件
doc.open();
// 4. 寫入內容
Font titleFont = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);
doc.add(new Paragraph("Hello, iText!", titleFont));
Font bodyFont = new Font(Font.FontFamily.HELVETICA, 12);
doc.add(new Paragraph("這是第一個動態產生的 PDF 文件。", bodyFont));
// 5. 關閉文件(必要!)
doc.close();
System.out.println("PDF 生成完成:hello.pdf");
}
}
iText 5 預設不含中文字型,直接寫中文會顯示 □。三種方案:
// 需加入 itext-asian 依賴
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font chineseFont = new Font(bf, 12);
// 將微軟正黑體 .ttf 放入 resources/fonts/
BaseFont bf = BaseFont.createFont(
"fonts/MicrosoftJhengHei.ttf",
BaseFont.IDENTITY_H,
BaseFont.EMBEDDED // 關鍵:嵌入字型檔進 PDF
);
Font chineseFont = new Font(bf, 12);
iText 7 重寫核心,支援複雜文字排版(阿拉伯文、印地文等),但授權為 AGPL,商業用途需購買授權。
public class ReportGenerator {
public void generate(OutputStream out, List orders) throws DocumentException {
Document doc = new Document(PageSize.A4.rotate(), 36, 36, 36, 36); // 橫向
PdfWriter writer = PdfWriter.getInstance(doc, out);
// 頁首/頁尾事件
writer.setPageEvent(new HeaderFooterEvent());
doc.open();
// 標題
doc.add(new Paragraph("訂單報表", titleFont));
doc.add(Chunk.NEWLINE);
// 表格
PdfPTable table = new PdfPTable(new float[]{1, 3, 2, 2, 1.5f});
table.setWidthPercentage(100);
addTableHeader(table);
for (Order o : orders) addOrderRow(table, o);
doc.add(table);
doc.close();
}
}
doc.close() → PDF 損毀、0 bytes。PdfPTable 串流寫入或分頁處理。| 函式庫 | 授權 | 特色 |
|---|---|---|
| Apache PDFBox | Apache 2.0 | 純 Java、低層控制、文字提取強 |
| OpenPDF | LGPL/MPL | iText 4 分支、免費商業友善 |
| Flying Saucer | LGPL | HTML/CSS → PDF、排版優 |
| pdfbox-layout | Apache 2.0 | PDFBox 上層封裝、類 iText API |