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

iText 生成 PDF 文檔實戰:從 Hello World 到複雜表格佈局

     編輯:Java 程式設計入門

依賴與環境

<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    2.1.7
</dependency>

最小化生成流程

import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.Color;
import java.io.FileOutputStream;

public class PDFCreate {
    public static void main(String[] args) throws Exception {
        Document document = new Document(PageSize.A4);
        PdfWriter.getInstance(document, new FileOutputStream("C:/HelloWorld.pdf"));
        document.open();

        // 中文字體支持(需 iTextAsian.jar)
        Font cnFont = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", 12);
        document.add(new Paragraph("Hello World! 您好!hehe!", cnFont));

        // 複用表格邏輯(同 RTF 示例)
        Table table = new Table(3);
        table.setBorderWidth(1);
        table.setBorderColor(Color.BLUE);
        table.setPadding(5);
        table.setSpacing(5);
        Cell header = new Cell("Header");
        header.setHeader(true);
        header.setColspan(3);
        table.addCell(header);
        table.endHeaders();
        // ... 添加數據行、合併單元格 ...
        document.add(table);

        document.close();
    }
}

PDF 專屬進階功能

功能關鍵類/方法說明
頁碼/頁眉頁腳 PdfPageEventHelper 實現 onEndPage Writer.setPageEvent(new MyFooter())
水印 PdfContentByte 繪製文本/圖片,設置透明度 writer.getDirectContentUnder()
書籤/大綱 Chapter、Section、Anchor 自動生成 PDF 大綱面板
表單域 PdfFormField、TextField、ButtonField 生成可填寫 PDF 表單
數字簽名 PdfSignatureAppearance、PdfPKCS7 需簽名證書鏈
字體嵌入 BaseFont.createFont(..., BaseFont.EMBEDDED) 確保跨平台顯示一致

表格佈局最佳實踐(PDF 專用 PdfPTable)

iText 2.x 中 Table 同時服務 PDF/RTF/HTML,但 PdfPTable 針對 PDF 引擎優化,支持:

  • 精確列寬控制:table.setWidths(new float[]{2, 3, 5})
  • 單元格事件:cell.setCellEvent(new MyCellEvent()) 實現斜線、背景圖等。
  • 大表格分頁性能:table.setSplitLate(false) 避免最後一行孤立。

中文顯示完整方案

// 1. 註冊系統字體(一次性)
FontFactory.register("c:/windows/fonts/simsun.ttc", "SimSun");

// 2. 創建字體對象
BaseFont bfChinese = BaseFont.createFont("SimSun", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bfChinese, 12);

// 3. 使用
new Paragraph("中文內容", font);

性能與內存優化

  1. 流式寫入:PdfWriter 默認緩衝頁面,大文檔調用 document.close() 前定期 document.newPage() 釋放內存。
  2. 圖片複用:同一圖片多次使用時,用 Image.getInstance(url) 緩存實例,避免重複解碼。
  3. 字體緩存:BaseFont 對象線程安全且重量級,全局單例複用。

版本遷移提示

  • iText 5+ (AGPL) :包結構變為 com.itextpdf.*,Table 棄用,全面轉向 PdfPTable、PdfPCell。
  • iText 7+ :重寫架構,模塊化(kernel/layout/io/sign/pdfa),API 不兼容 5.x。
  • 商業項目若不願承擔 AGPL,可選 OpenPDF (LGPL/MPL)、Apache PDFBox、pdfbox-layout。

總結

iText 2.1.7 以 Document → PdfWriter → Table/Paragraph 經典鏈路,提供了極低門檻的 PDF 生成能力。掌握中文字體嵌入、PdfPTable 精準佈局、頁面事件擴展三大核心,即可應對發票、報表、合同等主流業務場景。新項目建議直接起步 iText 7 或 OpenPDF,享受現代 API 與長期維護保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved