首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 生成 PDF 實戰:iText 7 中文支持完整代碼

     編輯:Java 相關知識

依賴配置 (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 正確關閉刷新。

常見問題

總結

iText 7 是 Java 生成 PDF 的標準選擇。**字體註冊是中文項目的第一道坑**,搞定它,後續佈局、表格、圖片、水印、簽名皆可輕鬆實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因/解決
中文顯示方框/亂碼未註冊字體或字體路徑錯誤,檢查 fontPath 存在性
字體授權風險商業項目請使用開源字體 (如思源黑體 Source Han Sans) 或購買授權
大文件內存溢出分批寫入、使用 PdfDocument.flush()、避免一次性構建巨大 Document