依賴配置 (iText 7.x)
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
<!-- 中文字體支持需額外引入 font-asian 或註冊系統字體 -->
核心工具類 PDFUtil
package com.util.pdf;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import java.io.*;
public class PDFUtil {
/** 生成 PDF
* @param content 正文內容
* @param outputPath 輸出路徑 (如 D:/demo.pdf)
* @param fontPath 中文字體文件路徑 (如 C:/Windows/Fonts/simhei.ttf)
*/
public static void createPdf(String content, String outputPath, String fontPath) throws IOException {
// 1. 註冊中文字體 (必須!否亂碼)
PdfFont font = PdfFontFactory.createFont(fontPath, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
// 2. 創建文檔
try (PdfWriter writer = new PdfWriter(outputPath);
PdfDocument pdfDoc = new PdfDocument(writer);
Document doc = new Document(pdfDoc)) {
// 3. 設置文檔屬性
pdfDoc.getDocumentInfo().setTitle("iText 7 Demo");
pdfDoc.getDocumentInfo().setAuthor("System");
pdfDoc.getDocumentInfo().setSubject("Java PDF Generation");
pdfDoc.getDocumentInfo().setKeywords("iText, PDF, Java");
// 4. 添加內容
Paragraph p = new Paragraph(content)
.setFont(font)
.setFontSize(14)
.setTextAlignment(TextAlignment.LEFT);
doc.add(p);
}
}
/** 讀取文本文件並生成 PDF */
public static void txtToPdf(String txtPath, String pdfPath, String fontPath) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(txtPath)), "UTF-8");
createPdf(content, pdfPath, fontPath);
}
public static void main(String[] args) throws IOException {
// Windows 系統字體路徑示例
String font = "C:/Windows/Fonts/simhei.ttf"; // 黑體
// String font = "C:/Windows/Fonts/simsun.ttc,1"; // 宋體 (ttc 字體集需指定索引)
PDFUtil.txtToPdf("C:/Users/zan/Desktop/demo.txt", "D:/demo.pdf", font);
System.out.println("PDF 生成成功!");
}
}
關鍵點解析
- 字體註冊:iText 7 必須顯式註冊 TTF/TTC 字體,
PdfFontFactory.createFont 支持 EmbeddingStrategy.PREFER_EMBEDDED 內嵌字體,確保跨平台顯示一致。
- TTC 字體集:Windows
simsun.ttc 包含多字體,需用 fontPath,index 格式 (如 simsun.ttc,1)。
- 內容佈局:
Document + Paragraph 是高級 API,自動換頁、對齊、分頁。複雜佈局可用 Table, List, Image。
- 資源管理:Try-with-resources 確保
PdfWriter/PdfDocument/Document 正確關閉刷新。
常見問題
| 現象 | 原因/解決 |
| 中文顯示方框/亂碼 | 未註冊字體或字體路徑錯誤,檢查 fontPath 存在性 |
| 字體授權風險 | 商業項目請使用開源字體 (如思源黑體 Source Han Sans) 或購買授權 |
| 大文件內存溢出 | 分批寫入、使用 PdfDocument.flush()、避免一次性構建巨大 Document |
總結
iText 7 是 Java 生成 PDF 的標準選擇。**字體註冊是中文項目的第一道坑**,搞定它,後續佈局、表格、圖片、水印、簽名皆可輕鬆實現。
- 上一篇文章: Java 數組排序算法實戰:冒泡排序完整代碼與優化
- 下一篇文章: Java transient 關鍵字詳解:序列化排除與最佳實踐
Copyright ©
程式碼之家 All Rights Reserved