翻譯|行業(yè)資訊|編輯:吉煒煒|2025-09-05 10:05:48.880|閱讀 19 次
概述:在本文中,我們將介紹如何使用 Spire.PDF for Java 通過(guò)模板生成 PDF 文件。文章不僅涵蓋 HTML 模板和 PDF 模板的使用方法,還會(huì)提供一些高效生成文檔的最佳實(shí)踐和常見(jiàn)問(wèn)題解答,幫助你在實(shí)際項(xiàng)目中更好地應(yīng)用。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,生成 PDF 文檔是一項(xiàng)非常常見(jiàn)的需求。無(wú)論是發(fā)票、報(bào)告、合同,還是其他業(yè)務(wù)文檔,開(kāi)發(fā)人員通常都需要一種高效、穩(wěn)定的方式來(lái)創(chuàng)建 PDF。與其逐行繪制 PDF 內(nèi)容,不如直接利用 模板 ——常見(jiàn)的模板形式包括 HTML 模板 和 PDF 模板 ,開(kāi)發(fā)者只需將動(dòng)態(tài)數(shù)據(jù)填充進(jìn)去,就能快速生成所需文檔。
E-iceblue旗下Spire系列產(chǎn)品,是文檔處理領(lǐng)域的佼佼者,支持國(guó)產(chǎn)化信創(chuàng)。在本文中,我們將介紹如何使用 Spire.PDF for Java 通過(guò)模板生成 PDF 文件。文章不僅涵蓋 HTML 模板和 PDF 模板的使用方法,還會(huì)提供一些高效生成文檔的最佳實(shí)踐和常見(jiàn)問(wèn)題解答,幫助你在實(shí)際項(xiàng)目中更好地應(yīng)用。
加入Spire技術(shù)交流QQ群(125237868),與更多開(kāi)發(fā)者一起提升文檔開(kāi)發(fā)技能。
Spire.PDF for Java是一個(gè)功能強(qiáng)大的 PDF 庫(kù),提供用于創(chuàng)建、讀取、編輯和轉(zhuǎn)換 PDF 文件的完整 API。它支持以下功能:
安裝:
<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>//repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf</artifactId> <version>11.8.3</version> </dependency> </dependencies>
HTML 模板非常靈活,允許你通過(guò) CSS 樣式 自定義文檔布局和外觀。在模板中,你可以定義 占位符 (使用 {{ }} 包裹),在運(yùn)行時(shí)動(dòng)態(tài)替換成實(shí)際數(shù)據(jù),從而生成個(gè)性化的 PDF 文檔。
安裝 HTML 轉(zhuǎn) PDF 渲染引擎
Spire.PDF 依賴(lài)外部引擎來(lái)將 HTML 渲染為 PDF,可以選擇 Qt WebEngine或 Google Chrome 。在本指南中,我們將使用 Qt WebEngine 。
下載適用于操作系統(tǒng)的 Qt WebEngine 插件:
將下載的文件解壓到本地文件夾,并找到 plugins 目錄,例如:C:\plugins-windows-x64\plugins
在代碼中配置插件路徑:
HtmlConverter.setPluginPath("C:\\plugins-windows-x64\\plugins");
完成插件配置后,Spire.PDF 就可以將 HTML 完整渲染為 PDF,并支持 CSS 樣式,實(shí)現(xiàn)高保真的文檔轉(zhuǎn)換。
示例:從 HTML 模板生成發(fā)票 PDF
import com.spire.pdf.graphics.PdfMargins; import com.spire.pdf.htmlconverter.LoadHtmlType; import com.spire.pdf.htmlconverter.qt.HtmlConverter; import com.spire.pdf.htmlconverter.qt.Size; import java.util.HashMap; import java.util.Map; public class CreatePdfFromHtmlTemplate { public static void main(String[] args) { // HTML 模板,使用雙大括號(hào) {{}} 作為占位符變量 String htmlTemplate = "<!DOCTYPE html>\n" + "<html lang=\"zh\">\n" + "<head>\n" + " <meta charset=\"UTF-8\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" + " <title>發(fā)票</title>\n" + " <style>\n" + " body {\n" + " font-family: 宋體, sans-serif;\n" + " margin: 20px;\n" + " padding: 20px;\n" + " font-size: 12pt;\n" + " }\n" + " h1 {\n" + " text-align: left;\n" + " font-size: 30pt;\n" + " }\n" + " h2 {\n" + " font-size: 18pt;\n" + " }\n" + " .invoice-header, .invoice-footer {\n" + " text-align: left;\n" + " margin-bottom: 20px;\n" + " }\n" + " .invoice-details {\n" + " margin-bottom: 20px;\n" + " }\n" + " table {\n" + " width: 100%;\n" + " border-collapse: collapse;\n" + " }\n" + " th, td {\n" + " border: 1px solid #ccc;\n" + " padding: 8px;\n" + " text-align: left;\n" + " }\n" + " th {\n" + " background-color: #f2f2f2;\n" + " }\n" + " .total {\n" + " font-weight: bold;\n" + " }\n" + " </style>\n" + "</head>\n" + "<body>\n" + " <div class=\"invoice-header\">\n" + " <h1>發(fā)票</h1>\n" + " <p>發(fā)票編號(hào): {{INVOICE_NUMBER}}</p>\n" + " <p>日期: {{INVOICE_DATE}}</p>\n" + " </div>\n" + " <div class=\"invoice-details\">\n" + " <h2 style=\"margin-top: 50px;\">開(kāi)票給:</h2>\n" + " <p>姓名: {{BILLER_NAME}}</p>\n" + " <p>地址: {{BILLER_ADDRESS}}</p>\n" + " <p>郵箱: {{BILLER_EMAIL}}</p>\n" + " </div>\n" + " <table>\n" + " <thead>\n" + " <tr>\n" + " <th>描述</th>\n" + " <th>數(shù)量</th>\n" + " <th>單價(jià)</th>\n" + " <th>總計(jì)</th>\n" + " </tr>\n" + " </thead>\n" + " <tbody>\n" + " <tr>\n" + " <td>{{ITEM_DESCRIPTION}}</td>\n" + " <td>{{ITEM_QUANTITY}}</td>\n" + " <td>{{ITEM_UNIT_PRICE}}</td>\n" + " <td>{{ITEM_TOTAL}}</td>\n" + " </tr>\n" + " <!-- 如有需要,可添加更多項(xiàng)目 -->\n" + " </tbody>\n" + " </table>\n" + " <div class=\"total\" style=\"text-align: right;\">\n" + " <p>小計(jì): {{SUBTOTAL}}</p>\n" + " <p>稅率 ({{TAX_RATE}}%): {{TAX}}</p>\n" + " <p>總計(jì): {{TOTAL}}</p>\n" + " </div>\n" + " <div class=\"invoice-footer\">\n" + " <p>感謝您的惠顧!</p>\n" + " </div>\n" + "</body>\n" + "</html>"; // 發(fā)票示例數(shù)據(jù) - 與模板占位符對(duì)應(yīng)的鍵值對(duì) Map<String, String> invoiceData = new HashMap<>(); invoiceData.put("INVOICE_NUMBER", "12345"); invoiceData.put("INVOICE_DATE", "2025-08-25"); invoiceData.put("BILLER_NAME", "張三"); invoiceData.put("BILLER_ADDRESS", "北京市朝陽(yáng)區(qū)123號(hào)"); invoiceData.put("BILLER_EMAIL", "zhangsan@example.com document.getElementById('cloak05a0bc07693e7fd0df1ec689a1a701df').innerHTML = ''; var prefix = 'ma' + 'il' + 'to'; var path = 'hr' + 'ef' + '='; var addy05a0bc07693e7fd0df1ec689a1a701df = 'zhangsan' + '@'; addy05a0bc07693e7fd0df1ec689a1a701df = addy05a0bc07693e7fd0df1ec689a1a701df + 'example' + '.' + 'com'; var addy_text05a0bc07693e7fd0df1ec689a1a701df = 'zhangsan' + '@' + 'example' + '.' + 'com';document.getElementById('cloak05a0bc07693e7fd0df1ec689a1a701df').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy05a0bc07693e7fd0df1ec689a1a701df + '\'>'+addy_text05a0bc07693e7fd0df1ec689a1a701df+'<\/a>'; "); invoiceData.put("ITEM_DESCRIPTION", "咨詢(xún)服務(wù)"); invoiceData.put("ITEM_QUANTITY", "10"); invoiceData.put("ITEM_UNIT_PRICE", "¥100"); invoiceData.put("ITEM_TOTAL", "¥1000"); invoiceData.put("SUBTOTAL", "¥1000"); invoiceData.put("TAX_RATE", "5"); invoiceData.put("TAX", "¥50"); invoiceData.put("TOTAL", "¥1050"); // 用實(shí)際數(shù)據(jù)填充 HTML 模板 String populatedInvoice = populateInvoice(htmlTemplate, invoiceData); // 指定生成 PDF 的輸出路徑 String outputFile = "output/HtmlToPdf.pdf"; // 指定 HTML 轉(zhuǎn) PDF 轉(zhuǎn)換器插件路徑(QT 插件) String pluginPath = "C:\\plugins-windows-x64\\plugins"; // 設(shè)置 HTML 轉(zhuǎn) PDF 所需的插件路徑 HtmlConverter.setPluginPath(pluginPath); // 將 HTML 字符串轉(zhuǎn)換為 PDF 并指定相關(guān)設(shè)置 HtmlConverter.convert(populatedInvoice, outputFile, true, // 啟用 JavaScript 100000, // 超時(shí)時(shí)間(毫秒) new Size(595, 842), // A4 頁(yè)面大?。?95x842磅) new PdfMargins(20), // 四邊 20 點(diǎn)邊距 LoadHtmlType.Source_Code); // 從 HTML 源代碼字符串加載 } // 輔助方法:用數(shù)據(jù) Map 中的實(shí)際值替換模板占位符 private static String populateInvoice(String template, Map<String, String> data) { String result = template; for (Map.Entry<String, String> entry : data.entrySet()) { result = result.replace("{{" + entry.getKey() + "}}", entry.getValue()); } return result; } }
工作原理
這種方法非常適合 發(fā)票、收據(jù)和報(bào)表 等對(duì)格式有要求的文檔生成場(chǎng)景。
效果圖:
如果你已經(jīng)有一個(gè)預(yù)先設(shè)計(jì)好的 PDF 表單或模板,可以直接在 PDF 內(nèi)部 替換占位符 來(lái)生成新的文檔。
示例:替換 PDF 模板中的文本
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.texts.PdfTextReplaceOptions; import com.spire.pdf.texts.PdfTextReplacer; import com.spire.pdf.texts.ReplaceActionType; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; public class CreatePdfFromPdfTemplate { public static void main(String[] args) { // 創(chuàng)建 PdfDocument 對(duì)象 PdfDocument doc = new PdfDocument(); // 加載現(xiàn)有 PDF 文件 doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Template.pdf"); // 創(chuàng)建 PdfTextReplaceOptions 對(duì)象并指定替換選項(xiàng) PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions(); textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord)); // 獲取指定頁(yè)面(此處為第一頁(yè)) PdfPageBase page = doc.getPages().get(0); // 基于頁(yè)面創(chuàng)建 PdfTextReplacer 對(duì)象 PdfTextReplacer textReplacer = new PdfTextReplacer(page); textReplacer.setOptions(textReplaceOptions); // 定義舊字符串和新字符串的字典 Map<String, String> replacements = new HashMap<>(); replacements.put("{PROJECT_NAME}", "新網(wǎng)站開(kāi)發(fā)"); replacements.put("{PROJECT_NO}", "2023-001"); replacements.put("{PROJECT MANAGER}", "王五"); replacements.put("{PERIOD}", "2023年第3季度"); replacements.put("{START_DATE}", "2023年7月1日"); replacements.put("{END_DATE}", "2023年9月30日"); // 遍歷字典,替換占位符文本 for (Map.Entry<String, String> pair : replacements.entrySet()) { textReplacer.replaceText(pair.getKey(), pair.getValue()); } // 保存修改后的 PDF 到新的文件 doc.saveToFile("output/ModifyTemplate.pdf"); doc.dispose(); } }
工作原理
注意事項(xiàng)
多行文本的替代方案
效果圖:
可以,但需要使用 Spire.Doc for Java。它允許你替換 Word 文檔中的占位符,然后將結(jié)果導(dǎo)出為 PDF。
可以。使用 Spire.PDF,無(wú)論是基于 HTML 模板生成,還是修改現(xiàn)有 PDF 模板,都可以嵌入圖片、圖表和形狀。
是的,需要插件來(lái)準(zhǔn)確渲染帶樣式和 CSS 的 HTML。
建議:簡(jiǎn)單文檔使用 Qt WebEngine,要求與最新瀏覽器渲染效果一致時(shí)使用 Google Chrome。
支持。Spire.PDF 完全支持 Unicode,可以生成包含多種語(yǔ)言(如英文、中文、阿拉伯語(yǔ)或印地語(yǔ))的 PDF,且不會(huì)丟失格式。
通過(guò)將 Spire.PDF集成到 Java 項(xiàng)目中,你可以從 HTML 模板 或 PDF 模板 高效生成專(zhuān)業(yè)的 PDF 文檔。根據(jù)不同場(chǎng)景的需求:
如果你的工作流程已經(jīng)依賴(lài) Word 模板,可以考慮使用 Spire.Doc for Java ,它能夠:
這種靈活性讓你可以根據(jù)模板格式選擇合適的工具 —— Spire.PDF 或 Spire.Doc ,從而確保 PDF 輸出既高效又高質(zhì)量。
————————————————————————————————————————
關(guān)于慧都科技:
慧都科技是一家行業(yè)數(shù)字化解決方案公司,長(zhǎng)期專(zhuān)注于軟件、油氣與制造行業(yè)。公司基于深入的業(yè)務(wù)理解與管理洞察,以系統(tǒng)化的業(yè)務(wù)建模驅(qū)動(dòng)技術(shù)落地,幫助企業(yè)實(shí)現(xiàn)智能化運(yùn)營(yíng)與長(zhǎng)期競(jìng)爭(zhēng)優(yōu)勢(shì)。在軟件工程領(lǐng)域,我們提供開(kāi)發(fā)控件、研發(fā)管理、代碼開(kāi)發(fā)、部署運(yùn)維等軟件開(kāi)發(fā)全鏈路所需的產(chǎn)品,提供正版授權(quán)采購(gòu)、技術(shù)選型、個(gè)性化維保等服務(wù),幫助客戶實(shí)現(xiàn)技術(shù)合規(guī)、降本增效與風(fēng)險(xiǎn)可控。慧都科技E-iceblue的官方授權(quán)代理商,提供E-iceblue系列產(chǎn)品免費(fèi)試用,咨詢(xún),正版銷(xiāo)售等于一體的專(zhuān)業(yè)化服務(wù)。E-iceblue旗下Spire系列產(chǎn)品是國(guó)產(chǎn)文檔處理領(lǐng)域的優(yōu)秀產(chǎn)品,支持國(guó)產(chǎn)化信創(chuàng),幫助企業(yè)高效構(gòu)建文檔處理的應(yīng)用程序。
歡迎下載|體驗(yàn)更多E-iceblue產(chǎn)品
獲取更多信息請(qǐng)咨詢(xún) ;技術(shù)交流Q群(125237868)
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)