首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 動態生成 PDF 報表:iText 模板填充實戰指南

     編輯:程式設計疑難解答

需求

根據數據庫動態數據,填充 PDF 模板(含標題、正文、表格),生成報表/合同/證書等。

技術選型:iText 7 (AGPL) / iText 5 (舊版) / Apache PDFBox

  • iText 7:功能最強、文檔豐富、支持 PDF/UA、簽名、表單、表格佈局(Table、Cell),**商業項目需購買授權或開源項目遵守 AGPL**。
  • PDFBox:Apache 2.0 許可證,免費商用,API 相對底層,表格需手工繪製。
  • 模板策略:
    ① AcroForm 域填充:PDF 預置表單域(setField),適合固定版面證書/表單。
    ② 動態佈局構建:代碼構建 Document、Table、Paragraph,適合數據驅動報表。
    ③ HTML → PDF:pdfHTML 插件將 HTML/CSS 模板轉 PDF,前端同事可維護模板,靈活度最高。

iText 7 動態表格填充核心代碼


// 1. 讀取模板或創建新文檔
PdfDocument pdfDoc = new PdfDocument(new PdfWriter("report.pdf"));
Document doc = new Document(pdfDoc);

// 2. 標題
doc.add(new Paragraph("月度銷售報表").setTextAlignment(TextAlignment.CENTER).setFontSize(18));

// 3. 動態表格
Table table = new Table(new float[]{2, 3, 2, 2, 2}); // 列寬比例
table.addHeaderCell("產品").addHeaderCell("規格").addHeaderCell("單價").addHeaderCell("數量").addHeaderCell("金額");

// 4. 數據庫查詢數據填充
List items = saleService.findMonthly(month);
for (SaleItem item : items) {
    table.addCell(item.getProduct());
    table.addCell(item.getSpec());
    table.addCell(String.valueOf(item.getPrice()));
    table.addCell(String.valueOf(item.getQty()));
    table.addCell(String.valueOf(item.getAmount()));
}

// 5. 合計行
table.addCell(new Cell(1,4).add("合計").setTextAlignment(TextAlignment.RIGHT));
table.addCell(String.valueOf(totalAmount));

doc.add(table);
doc.close();

進階技巧

  • 分頁處理:table.setKeepTogether(false) 允許跨頁,setHorizontalAlignment() 控制對齊。
  • 中文字體:PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", true) 或嵌入 msyh.ttf。
  • 數字格式化:NumberFormat.getCurrencyInstance(Locale.CHINA).format(amount)。
  • 性能優化**:大數據量分批寫入、關閉 doc.setRenderer() 緩衝、使用 PdfDocument.flush()。

參考資源

完整教程:iText 動態生成 PDF 詳解

選對策略(AcroForm/動態構建/HTML轉PDF),iText 可滿足從簡單證書到複雜財務報表的全譜系需求。

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