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

Web 應用中動態生成 PDF 實戰:基於 iText 與 Servlet 的完整方案

     編輯:Java 相關知識

專案需求:用戶查詢出貨資訊,以 PDF 格式返回,支援瀏覽器下載與 Acrobat Reader 閱讀。團隊選擇開源純 Java 庫 iText 實現伺服器端動態生成。

一、iText 核心特性

  • 支援 PDF/FDF、多種頁面尺寸與方向、頁邊距、表格、分頁、頁首/尾/碼、條碼、字體、顏色、加密、圖片、列表、陰影、浮水印、模板、RTF/XML 輸出
  • 雙授權:MPL / LGPL
  • 官網:lowagie.com/iText

二、兩種生成策略對比

策略說明優/缺點
A:檔案系統用 FileOutputStream 寫入伺服器磁碟,HTTP GET 下載集群環境下若無 Session Affinity 易失效
B:記憶體流(推薦)用 ByteArrayOutputStream 在記憶體生成,Servlet 輸出流直傳客戶端無磁碟 I/O,天然支援集群,本文採用

三、核心實現:PDFServlet

關鍵類別

  • Document:PDF 文件的物件模型描述
  • PdfWriter:綁定 OutputStream,將 Document 序列化為 PDF 位元組
  • Paragraph、Phrase、Table、Cell、HeaderFooter:內容構建元素

生成流程

// 1. 建立記憶體輸出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();

// 2. 綁定 Document 與 PdfWriter
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, baos);
doc.open();

// 3. 添加內容
doc.add(new Paragraph("動態生成於 " + new java.util.Date()));
// 表格、圖片、分頁等豐富排版...

// 4. 關閉文件(觸發序列化)
doc.close();
writer.close();

// 5. 取得 PDF 位元組
return baos;

HTTP 響應頭關鍵設定

Header值範例用途
Content-Typeapplication/pdf告知瀏覽器 MIME 類型
Content-Dispositioninline; filename=report.pdf / attachment; filename=report.pdf內嵌顯示或作為附件下載
Content-Lengthbaos.size()必須準確,否則瀏覽器顯示異常
Cache-Controlmax-age=30 / no-store / must-revalidate控制快取策略

注意:Header 必須在寫入輸出流之前設定。

輸出傳輸

ServletOutputStream sos = resp.getOutputStream();
baos.writeTo(sos);
sos.flush();

四、部署與測試

  1. 將 itext-0.99.jar 放入 WAR 的 WEB-INF/lib
  2. 部署至 Tomcat(預設 8080 埠)
  3. 瀏覽器請求 https://host:8080/pdfservlet/createpdf 即可獲取 PDF

五、進階方案與替代選擇

  • 模板填充:Word 設計表單 → Acrobat 轉 PDF 模板 → iText 填充數據 → 輸出成品
  • 報表引擎:JasperReports 提供更高層抽象,適合複雜報表場景
  • 其他庫:JPedal、PDFBox、Apache FOP

六、參考資源

  • iText 官網:lowagie.com/iText
  • HTTP 1.1 規範、RFC 2183 (Content-Disposition)
  • PDF 相關社群:planetpdf.com、pdfzone.com、dmoz.org

掌握 iText 核心 API 與 Servlet 輸出機制,即可在任何 Java Web 應用中靈活實現動態 PDF 生成與下載。

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