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

Java 純後端實現 PDF 線上預覽、列印與下載 (FreeMarker + iText + Flying Saucer)

     編輯:Java 相關知識

方案架構:Controller 準備資料 → 自訂 JSP Tag (繼承 BodyTagSupport) 驅動 FreeMarker 渲染 HTML → Flying Saucer (core-renderer) 將 HTML+CSS 轉 PDF → iText 輸出 PDF 流供下載/列印,HTML 同時回傳瀏覽器預覽。

依賴 JAR (版本建議)

  • core-renderer.jar (Flying Saucer R8+)
  • freemarker-2.3.16.jar
  • iText-2.0.8.jar (注意:iText 5+ 版權變更,2.0.8 為最後 LGPL 版)
  • iTextAsian.jar (中文字體支援)

核心類別設計

1. 抽象基類 PDFTag

封裝通用流程:解析 JSON 參數 → 合併資料模型 → FreeMarker 處理模板 → 生成暫存 HTML → 輸出至 Response (預覽) 與檔案 (供 PDF 轉換)。定義四個模板方法讓子類實作業務邏輯:

  • setConfigParams():設定模板路徑、輸出檔名、編碼等。
  • doServiceStart():填充預覽階段資料 (flag=0)。
  • doServiceDoing():切換列印階段資料 (flag=1),同一模板產出不同風格。
  • doServiceEnd():清理資源。

2. 具體實作 ViewPDFTag

注入專案屬性 (專案性質、書名、編碼),實作上述四方法,並定義 PDFConfigurationInterface 內部介面集中管理 Tag 屬性配置。

3. TLD 註冊

<tag>
  <name>print</name>
  <tagclass>com.iris.taglib.web.PreviewPDFTag</tagclass>
  <attribute><name>json</name><required>true</required></attribute>
  <attribute><name>prjNature</name><required>true</required></attribute>
  ...
</tag>

4. JSP 頁面使用

<%@ taglib prefix="pdf" uri="/WEB-INF/tld/pdf.tld" %>
<pdf:print json="${json}" prjNature="${prjNature}" bookName="${bookName}" tempDir="${tempDir}" prjCode="${prjCode}" />

5. Action/Controller 組裝資料

查詢業務資料,放入 Map 或直接傳遞 JSON 字串給 Tag,同時傳遞字體路徑、水印圖片路徑、靜態資源根路徑等上下文參數。

關鍵技術點

  • Flying Saucer 支援 CSS 2.1 大部分屬性,適合將既有 HTML 報表直接轉 PDF。
  • 中文需在 CSS 指定字體:font-family: "SimSun"; 並確保 iTextAsian 可用。
  • 預覽與列印同模板、不同 Flag 控制樣式 (如分頁、水印),避免維護兩套模板。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved