iText 產生 PDF 時,英文可用內建字體,中文必須載入外部 TTF 字體檔。本文提供完整範例:建立文件、載入中英文字體、設定文字位置、大小、顏色、寫入內容並關閉文件。
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class ITextChineseDemo {
public static void main(String[] args) {
Rectangle pageSize = new Rectangle(300, 400);
Document doc = new Document(pageSize);
try {
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("test_chinese.pdf"));
doc.open();
PdfContentByte cb = writer.getDirectContent();
// 1. 英文字體(內建)
BaseFont bfEn = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
// 2. 中文字體(外部 TTF,需確保檔案存在)
BaseFont bfCn = BaseFont.createFont("D:/fonts/msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// Linux 範例:/usr/share/fonts/chineses/TrueType/msyh.ttf
// --- 英文測試 ---
cb.saveState();
cb.beginText();
cb.moveText(20, 300);
cb.setFontAndSize(bfEn, 12);
cb.setColorFill(BaseColor.RED);
cb.showText("This is an English test.");
cb.endText();
cb.restoreState();
// --- 中文測試 ---
cb.saveState();
cb.beginText();
cb.moveText(20, 280);
cb.setFontAndSize(bfCn, 12);
cb.setColorFill(BaseColor.BLUE);
cb.showText("這是一個中文測試。It can also English.");
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
e.printStackTrace();
} finally {
doc.close();
}
}
}
| 項目 | 說明 |
|---|---|
| BaseFont.IDENTITY_H | Unicode 水平書寫編碼,中文必須使用 |
| BaseFont.NOT_EMBEDDED | 不嵌入字體檔(檔案較小),但目標機器必須有該字體;若需跨平台閱讀請用 BaseFont.EMBEDDED |
| cb.moveText(x, y) | 座標原點為頁面左下角,x 向右、y 向上 |
| cb.setColorFill() | 設定文字填滿顏色(非描邊) |
| saveState/restoreState | 隔離圖形狀態,避免相互影響 |
IDENTITY_H。moveText 為相對位移,連續呼叫會累加;改用 setTextMatrix(x, y) 設定絕對位置。低層 PdfContentByte 不支援自動換行。需使用高層 API:
Font cnFont = new Font(bfCn, 12, Font.NORMAL, BaseColor.BLACK);
Paragraph p = new Paragraph("長段落中文內容...", cnFont);
p.setAlignment(Element.ALIGN_LEFT);
doc.add(p); // 自動分頁、換行