翻譯|行業資訊|編輯:吉煒煒|2025-10-16 10:36:44.143|閱讀 9 次
概述:在企業應用、報表系統或財務工具的開發中,生成規范、專業的 PDF 文檔是常見需求。與其在代碼中硬編碼布局,不如使用模板來提高開發效率。模板不僅能加快開發進程,還能確保品牌視覺與文檔格式的一致性。本文將介紹如何使用 Spire.PDF for .NET 在 C# 中通過 HTML 模板 或 預設 PDF 模板 生成 PDF 文檔,無論是需要動態布局還是快速替換占位符,都能靈活應對。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
在企業應用、報表系統或財務工具的開發中,生成規范、專業的 PDF 文檔是常見需求。與其在代碼中硬編碼布局,不如使用模板來提高開發效率。模板不僅能加快開發進程,還能確保品牌視覺與文檔格式的一致性。
本文將介紹如何使用 Spire.PDF for .NET 在 C# 中通過 HTML 模板 或 預設 PDF 模板 生成 PDF 文檔,無論是需要動態布局還是快速替換占位符,都能靈活應對。
加入Spire技術交流QQ群(125237868),與更多開發者一起提升文檔開發技能。
Spire.PDF for .NET 是一款功能強大的 PDF 操作庫,允許 .NET 開發者無需依賴 Adobe Acrobat 即可創建、讀取、編輯和轉換 PDF 文檔。該庫提供全面的 API 接口,適用于生成報表、發票、證書及其他 PDF 格式文件,非常適合在 C# 應用中進行自動化文檔處理。
與本教程相關的主要功能包括:
要在 C# 項目中通過模板生成 PDF,首先需將 Spire.PDF 引入項目中。對于 HTML 轉 PDF 的場景,Spire.PDF 依賴外部渲染引擎(Qt WebEngine 或 Google Chrome)。本文以 Qt WebEngine為例。
步驟 1:安裝 Spire.PDF
在 Visual Studio 的 NuGet 包管理器中運行以下命令:
Install-Package Spire.PDF或從慧都網下載 Spire.PDF 安裝包,并將 DLL 文件手動導入項目。
步驟 2:下載并配置 Qt 插件
根據系統下載對應的 Qt WebEngine 插件:
解壓文件后可獲得插件目錄,例如:C:\plugins-windows-x64\plugins
在 C# 代碼中注冊插件路徑:
HtmlConverter.PluginPath = @"C:\plugins-windows-x64\plugins";
HTML 模板非常適合需要表格、頁眉頁腳或復雜樣式布局(如發票、報表)的文檔。
步驟 1:構建帶占位符的 HTML 模板
可在 HTML 中添加雙花括號包裹的動態字段,例如:
<h1>發票</h1> <p>發票編號: {{INVOICE_NUMBER}}</p> <p>日期: {{INVOICE_DATE}}</p> <p><strong>姓名: </strong> {{CUSTOMER_NAME}}</p>
步驟 2:使用運行時數據替換占位符
以下是一個生成發票 PDF 的完整示例代碼:
using Spire.Additions.Qt; using System.Drawing; using Spire.Pdf.Graphics; namespace CreatePdfFromHtmlTemplate { class Program { static void Main(string[] args) { // 帶有占位符變量的HTML模板 string htmlTemplate = @" <!DOCTYPE html> <html lang=""zh""> <head> <meta charset=""UTF-8""> <meta name=""viewport"" content=""width=device-width, initial-scale=1.0""> <title>發票</title> <style> body { font-family: ""SimHei"", ""黑體"", Tahoma, sans-serif; margin: 40px auto; padding: 20px; max-width: 800px; font-size: 20px; } h1 { text-align: right; font-size: 40px; letter-spacing: 2px; color: #222; margin: 0 0 30px 0; } .invoice-header, .invoice-footer { margin-bottom: 50px; } .invoice-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 3px solid #444; padding-bottom: 10px; } .invoice-details { margin: 20px 0; padding: 15px; background: #f5f5f5; border-radius: 6px; } .invoice-details h2 { font-size: 20px; margin-bottom: 10px; color: #444; } .info p { margin: 2px 0; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { padding: 10px; border: 1px solid #ddd; text-align: left; } th { background-color: #efefef; font-weight: 600; } tbody tr:nth-child(even) { background: #f9f9f9; } .total { margin-top: 20px; text-align: right; font-size: 15px; } .total p { margin: 5px 0; } .total p span { display: inline-block; width: 120px; } .grand-total { font-size: 18px; font-weight: bold; border-top: 2px solid #444; margin-top: 10px; padding-top: 10px; } .invoice-footer { text-align: center; font-size: 18px; color: #666; margin-top: 50px; padding-top: 10px; } </style> </head> <body> <div class=""invoice-header""> <div> <h2>公司名稱</h2> <p>123 商業街<br>重慶, 中國</p> </div> <div> <h1>發票</h1> <p>發票編號: {{INVOICE_NUMBER}}<br>日期: {{INVOICE_DATE}}</p> </div> </div> <div class=""invoice-details""> <h2>賬單寄送至</h2> <div class=""info""> <p><strong>姓名:</strong> {{BILLER_NAME}}</p> <p><strong>地址:</strong> {{BILLER_ADDRESS}}</p> <p><strong>郵箱:</strong> {{BILLER_EMAIL}}</p> </div> </div> <table> <thead> <tr> <th>描述</th> <th>數量</th> <th>單價</th> <th>行總計</th> </tr> </thead> <tbody> <tr> <td>{{ITEM_DESCRIPTION}}</td> <td>{{ITEM_QUANTITY}}</td> <td>{{ITEM_UNIT_PRICE}}</td> <td>{{ITEM_TOTAL}}</td> </tr> <!-- 這里可以添加更多行 --> </tbody> </table> <div class=""total""> <p><span>小計:</span> {{SUBTOTAL}}</p> <p><span>稅 ({{TAX_RATE}}%):</span> {{TAX}}</p> <p class=""grand-total""><span>總計:</span> {{TOTAL}}</p> </div> <div class=""invoice-footer""> <p>感謝您的惠顧!</p> <p>如有任何疑問,請聯系我們 support@example.com document.getElementById('cloak5f2cf25209fd99d2ad5ef7fb2c0e301b').innerHTML = ''; var prefix = 'ma' + 'il' + 'to'; var path = 'hr' + 'ef' + '='; var addy5f2cf25209fd99d2ad5ef7fb2c0e301b = 'support' + '@'; addy5f2cf25209fd99d2ad5ef7fb2c0e301b = addy5f2cf25209fd99d2ad5ef7fb2c0e301b + 'example' + '.' + 'com'; var addy_text5f2cf25209fd99d2ad5ef7fb2c0e301b = 'support' + '@' + 'example' + '.' + 'com';document.getElementById('cloak5f2cf25209fd99d2ad5ef7fb2c0e301b').innerHTML += '<a ' + path + '\'' + prefix + ':' + addy5f2cf25209fd99d2ad5ef7fb2c0e301b + '\'>'+addy_text5f2cf25209fd99d2ad5ef7fb2c0e301b+'<\/a>'; </p> </div> </body> </html> "; // 發票的樣本數據 - 與模板占位符匹配的鍵值對 Dictionary<string, string> invoiceData = new Dictionary<string, string>() { { "INVOICE_NUMBER", "12345" }, { "INVOICE_DATE", "2025-08-25" }, { "BILLER_NAME", "張三" }, { "BILLER_ADDRESS", "重慶市新北街123號" }, { "BILLER_EMAIL", "zhangsan@ example.com" }, { "ITEM_DESCRIPTION", "咨詢服務" }, { "ITEM_QUANTITY", "10" }, { "ITEM_UNIT_PRICE", "$100" }, { "ITEM_TOTAL", "$1000" }, { "SUBTOTAL", "$1000" }, { "TAX_RATE", "5" }, { "TAX", "$50" }, { "TOTAL", "$1050" } }; // 用實際數據值填充HTML模板 string populatedInvoice = PopulateInvoice(htmlTemplate, invoiceData); // 指定生成的PDF輸出文件路徑 string outputFile = "HtmlToPdf.pdf"; // 指定HTML轉換器的插件路徑(QT插件) string pluginPath = @"C:\plugins-windows-x64\plugins"; // 設置HTML到PDF轉換所需的插件路徑 HtmlConverter.PluginPath = pluginPath; // 使用指定設置將HTML字符串轉換為PDF HtmlConverter.Convert( populatedInvoice, outputFile, true, // 啟用JavaScript 100000, // 超時(毫秒) new SizeF(595, 842), // A4紙大小(595x842點) new PdfMargins(20), // 四周20點邊距 LoadHtmlType.SourceCode // 從源代碼字符串加載HTML ); } // 輔助方法: 用數據字典中的實際值替換模板占位符 private static string PopulateInvoice(string template, Dictionary<string, string> data) { string result = template; foreach (var entry in data) { result = result.Replace("{{" + entry.Key + "}}", entry.Value); } return result; } } }
實現原理
輸出結果:
有時設計團隊會提供帶有占位符(如 {PROJECT_NAME})的靜態 PDF 模板。通過簡單的文本替換即可將這些模板快速填充成正式文檔。
示例:填充項目報告模板
using Spire.Pdf; using Spire.Pdf.Texts; using static Spire.Pdf.Texts.PdfTextReplaceOptions; namespace GeneratePdfFromPdfTemplate { class Program { static void Main(string[] args) { // 創建一個PdfDocument對象 PdfDocument doc = new PdfDocument(); // 加載一個PDF文件 doc.LoadFromFile(@"C:\Users\Administrator\Desktop\Template.pdf"); // 創建一個PdfTextReplaceOptions對象并指定選項 PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions(); textReplaceOptions.ReplaceType = ReplaceActionType.WholeWord; // 替換類型設置為整詞替換 // 獲取特定頁面 PdfPageBase page = doc.Pages[0]; // 基于頁面創建一個PdfTextReplacer對象 PdfTextReplacer textReplacer = new PdfTextReplacer(page); textReplacer.Options = textReplaceOptions; // 舊字符串和新字符串的字典 Dictionary<string, string> replacements = new Dictionary<string, string>() { { "{PROJECT_NAME}", "新網站開發" }, { "{PROJECT_NO}", "2023-001" }, { "{PROJECT MANAGER}", "愛麗絲·約翰遜" }, { "{PERIOD}", "2023年第三季度" }, { "{START_DATE}", "2023年7月1日" }, { "{END_DATE}", "2023年9月30日" } }; // 遍歷字典進行文本替換 foreach (var pair in replacements) { textReplacer.ReplaceText(pair.Key, pair.Value); } // 將文檔保存為另一個PDF文件 doc.SaveToFile("FromPdfTemplate.pdf"); doc.Close(); } } }
實現原理
限制說明: 此方法僅適用于短文本(如姓名、編號、日期等)的替換。對于多行文本或動態擴展的內容,它的效果不佳,因為PDF不會自動重新排版文本。對于較大的內容塊,請使用HTML或Word模板。
輸出結果:
選擇合適的模板類型
占位符設計
測試與驗證
模板管理
可以。對于復雜 HTML、CSS 或現代 JavaScript,建議使用 ChromeHtmlConverter 類,它能生成更精確的 PDF。
PDF 布局固定,替換文本不會自動重排。當新文本過長可能溢出,過短則留白。適用于可預測的字段內容(如姓名、日期等)。對于多行文本或動態內容,可使用 HTML 或 Word 模板,或借助 Spire.PDF 的繪圖 API 直接繪制新文本塊。
Spire.PDF 主要用于 PDF 操作,如需根據 Word 模板生成PDF,可使用 Spire.Doc for .NET 替換 Word 模板內容,然后再保存為 PDF。
這樣即可輕松添加公司 Logo、水印或電子簽名。
使用 Spire.PDF 在 C# 中基于模板生成 PDF,是提升文檔自動化效率的理想方式。無論選擇 HTML 模板還是現有 PDF 模板,開發者都能輕松創建內容準確、版面統一、外觀專業的文件。通過在開發流程中引入模板機制,不僅能顯著減少重復性工作,還能確保品牌風格與格式的一致性。
在實施過程中,合理選擇模板類型、規范占位符設計,并在部署前充分測試真實數據,能夠幫助你獲得更穩定的輸出效果。隨著項目的深入,還可以結合 Spire.PDF 的高級功能,如數字簽名、加密與批注等,實現更安全、更智能的文檔處理方案。
通過這一方法,你的團隊將能夠在保證質量與一致性的同時,大幅提升 PDF 文檔的生成速度與管理效率,從而讓自動化辦公與報告生成更加高效、可控。
————————————————————————————————————————
關于慧都科技:
慧都科技(EVGET)成?于2003年,是?家?業數字化解決?案公司,?期專注于軟件、油?與制造?業。公司基于深?的業務理解與管理洞察,以系統化的業務建模驅動技術落地,幫助企業實現智能化運營與?期競爭優勢。在軟件工程領域,我們提供開發控件、研發管理、代碼開發、部署運維等軟件開發全鏈路所需的產品,提供正版授權采購、技術選型、個性化維保等服務,幫助客戶實現技術合規、降本增效與風險可控。慧都科技E-iceblue的官方授權代理商,提供E-iceblue系列產品免費試用,咨詢,正版銷售等于一體的專業化服務。E-iceblue旗下Spire系列產品是國產文檔處理領域的優秀產品,支持國產化信創,幫助企業高效構建文檔處理的應用程序。
歡迎下載|體驗更多E-iceblue產品
獲取更多信息請咨詢 ;技術交流Q群(125237868)
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網