翻譯|行業資訊|編輯:吉煒煒|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紙大?。?95x842點)
                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年,是?家?業數字化解決?案公司,?期專注于軟件、油?與制造?業。公司基于深?的業務理解與管理洞察,以系統化的業務建模驅動技術落地,幫助企業實現智能化運營與?期競爭優勢。在軟件工程領域,我們提供開發控件、研發管理、代碼開發、部署運維等軟件開發全鏈路所需的產品,提供正版授權采購、技術選型、個性化維保等服務,幫助客戶實現技術合規、降本增效與風險可控?;鄱伎萍糆-iceblue的官方授權代理商,提供E-iceblue系列產品免費試用,咨詢,正版銷售等于一體的專業化服務。E-iceblue旗下Spire系列產品是國產文檔處理領域的優秀產品,支持國產化信創,幫助企業高效構建文檔處理的應用程序。
歡迎下載|體驗更多E-iceblue產品
獲取更多信息請咨詢 ;技術交流Q群(125237868)
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網