跳至頁尾內容
使用IRONPDF

PDF到PDFA在C#中(開發者教程)

現代的網路應用程式需要的不僅僅是靜態文件建立。 無論是生成個性化的發票,建立由資料驅動的PDF報告,還是生成自定義的表單欄位,開發人員都需要強大的工具來在運行時生成PDF文件。IronPDF成為領先的解決方案,提供基於Chrome的強大渲染,與C#無縫整合,用於在C#和.NET Framework環境中動態生成PDF。

如何在C#中動態生成PDF:圖1 - 跨平台

What is Dynamic PDF Generation in C#?

在C#中動態生成PDF是在運行時利用多個資料源的變數資料(包括資料庫、API或使用者輸入)建立PDF文件。 與靜態PDF文件不同,運行時生成允許個性化內容、條件部分和由資料驅動的佈局; 這些對於能夠適應不斷變化需求的發票、PDF報告、證書和表單至關重要。 這種編程式地建立PDF的方法已成為現代.NET Framework和.NET Core應用程式的重要組成部分。

如何在C#中動態生成PDF:圖2 - 跨平台

開始使用IronPDF

首先通過Visual Studio中的Package Manager Console安裝IronPDF NuGet包:

Install-Package IronPdf

如何在C#中動態生成PDF:圖3 - 安裝

或使用NuGet套件管理器介面下載並安裝。 初始化ChromePdfRenderer以生成完美像素的PDF。

using IronPdf;
// Create Chrome renderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
using IronPdf;
// Create Chrome renderer instance
var renderer = new ChromePdfRenderer();
// Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
Imports IronPdf

' Create Chrome renderer instance
Dim renderer As New ChromePdfRenderer()

' Configure rendering options for PDF format
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
renderer.RenderingOptions.PrintHtmlBackgrounds = True
$vbLabelText   $csharpLabel

ChromePdfRenderer類提供了在運行時生成PDF的基礎。設置邊距可確保有頁眉和頁腳的空間,而PrintHtmlBackgrounds則保留設計元素。 這種配置有助於根據HTML準確地建立PDF文件。 了解更多渲染選項以自定義您的PDF文件。

如何使用模板動態建立PDF文件

建立可重用的HTML模板,其中包含用於動態資料注入的占位符:

// Define HTML string template with placeholders
string invoiceTemplate = @"
<html>
<body>
    <h1>Invoice #[[INVOICE_NUMBER]]</h1>
    <p>Date: [[DATE]]</p>
    <p>Customer: [[CUSTOMER_NAME]]</p>
    <table>
        <tr><th>Item</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>";
// Replace placeholders with dynamic data
var invoiceData = new {
    InvoiceNumber = "INV-2025-001",
    Date = DateTime.Now.ToString("yyyy-MM-dd"),
    CustomerName = "John Doe",
    Total = 1250.00m
};
string finalHtml = invoiceTemplate
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber)
    .Replace("[[DATE]]", invoiceData.Date)
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName)
    .Replace("[[TOTAL]]", invoiceData.Total.ToString());
// Generate PDF from populated HTML content
var pdf = renderer.RenderHtmlAsPdf(finalHtml);
pdf.SaveAs("invoice.pdf");
// Define HTML string template with placeholders
string invoiceTemplate = @"
<html>
<body>
    <h1>Invoice #[[INVOICE_NUMBER]]</h1>
    <p>Date: [[DATE]]</p>
    <p>Customer: [[CUSTOMER_NAME]]</p>
    <table>
        <tr><th>Item</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>";
// Replace placeholders with dynamic data
var invoiceData = new {
    InvoiceNumber = "INV-2025-001",
    Date = DateTime.Now.ToString("yyyy-MM-dd"),
    CustomerName = "John Doe",
    Total = 1250.00m
};
string finalHtml = invoiceTemplate
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber)
    .Replace("[[DATE]]", invoiceData.Date)
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName)
    .Replace("[[TOTAL]]", invoiceData.Total.ToString());
// Generate PDF from populated HTML content
var pdf = renderer.RenderHtmlAsPdf(finalHtml);
pdf.SaveAs("invoice.pdf");
' Define HTML string template with placeholders
Dim invoiceTemplate As String = "
<html>
<body>
    <h1>Invoice #[[INVOICE_NUMBER]]</h1>
    <p>Date: [[DATE]]</p>
    <p>Customer: [[CUSTOMER_NAME]]</p>
    <table>
        <tr><th>Item</th><th>Price</th></tr>
        [[ITEMS]]
    </table>
    <p><strong>Total: $[[TOTAL]]</strong></p>
</body>
</html>"

' Replace placeholders with dynamic data
Dim invoiceData = New With {
    .InvoiceNumber = "INV-2025-001",
    .Date = DateTime.Now.ToString("yyyy-MM-dd"),
    .CustomerName = "John Doe",
    .Total = 1250.00D
}

Dim finalHtml As String = invoiceTemplate _
    .Replace("[[INVOICE_NUMBER]]", invoiceData.InvoiceNumber) _
    .Replace("[[DATE]]", invoiceData.Date) _
    .Replace("[[CUSTOMER_NAME]]", invoiceData.CustomerName) _
    .Replace("[[TOTAL]]", invoiceData.Total.ToString())

' Generate PDF from populated HTML content
Dim pdf = renderer.RenderHtmlAsPdf(finalHtml)
pdf.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

這種模板方法將展示與資料分開,允許設計師修改複雜的佈局,而開發者專注於資料整合。 Replace方法使用運行時值替換模板ID佔位符,建立個性化的PDF文件。 為轉換具有重複段落的HTML內容, 在PDF轉換之前使用迴圈動態生成HTML。 探索更多HTML轉PDF範例以進行高級模板設計。

輸出

如何在C#中動態生成PDF:圖4 - PDF輸出

高級資料綁定與異步處理

使用異步方法擴展您的PDF生成以進行高容量處理:

// Async batch generation for multiple PDF documents
public async Task GenerateMonthlyReportsAsync(List<Customer> customers)
{
    var renderer = new ChromePdfRenderer();
    var tasks = new List<Task>();
    foreach (var customer in customers)
    {
        tasks.Add(Task.Run(async () =>
        {
            // Create HTML content with dynamic data
            string html = $@"
                <h2>Monthly Report - {customer.Name}</h2>
                <p>Account Balance: ${customer.Balance:F2}</p>
                <p>Transactions: {customer.TransactionCount}</p>
                <div style='page-break-after: always;'></div>";
            // Convert HTML to PDF format
            var document = await renderer.RenderHtmlAsPdfAsync(html);
            await document.SaveAs($"reports/{customer.Id}_report.pdf");
        }));
    }
    await Task.WhenAll(tasks);
}
// Async batch generation for multiple PDF documents
public async Task GenerateMonthlyReportsAsync(List<Customer> customers)
{
    var renderer = new ChromePdfRenderer();
    var tasks = new List<Task>();
    foreach (var customer in customers)
    {
        tasks.Add(Task.Run(async () =>
        {
            // Create HTML content with dynamic data
            string html = $@"
                <h2>Monthly Report - {customer.Name}</h2>
                <p>Account Balance: ${customer.Balance:F2}</p>
                <p>Transactions: {customer.TransactionCount}</p>
                <div style='page-break-after: always;'></div>";
            // Convert HTML to PDF format
            var document = await renderer.RenderHtmlAsPdfAsync(html);
            await document.SaveAs($"reports/{customer.Id}_report.pdf");
        }));
    }
    await Task.WhenAll(tasks);
}
Imports System.Threading.Tasks
Imports System.Collections.Generic

' Async batch generation for multiple PDF documents
Public Async Function GenerateMonthlyReportsAsync(customers As List(Of Customer)) As Task
    Dim renderer = New ChromePdfRenderer()
    Dim tasks = New List(Of Task)()

    For Each customer In customers
        tasks.Add(Task.Run(Async Function()
                               ' Create HTML content with dynamic data
                               Dim html As String = $"
                                   <h2>Monthly Report - {customer.Name}</h2>
                                   <p>Account Balance: ${customer.Balance:F2}</p>
                                   <p>Transactions: {customer.TransactionCount}</p>
                                   <div style='page-break-after: always;'></div>"
                               ' Convert HTML to PDF format
                               Dim document = Await renderer.RenderHtmlAsPdfAsync(html)
                               Await document.SaveAs($"reports/{customer.Id}_report.pdf")
                           End Function))
    Next

    Await Task.WhenAll(tasks)
End Function
$vbLabelText   $csharpLabel

異步模式使同時生成PDF成為可能,當以批處理方式生成PDF時顯著提高吞吐量。 Task.WhenAll確保所有PDF文件完成後再進行下一步。 上述程式碼使用CSS頁面分隔屬性控制分頁,確保每個客戶的報告都從新頁開始。 查看企業網路應用程式的異步PDF生成文件。

動態建立互動式PDF表單

將具有HTML表單的網頁轉換為程式化填寫的PDF:

// Enable form fields creation in rendering options
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Define HTML string with form elements
string formHtml = @"
<form>
    <h2>Customer Survey</h2>
    <label>Name: 
    <label>Email: 
    <label>Satisfaction:
        <select name='satisfaction'>
            <option>Excellent</option>
            <option>Good</option>
            <option>Fair</option>
        </select>
    </label><br>
    <label>Comments: <textarea name='comments'></textarea></label>
</form>";
// Create a PDF with interactive form fields
var pdfDocument = renderer.RenderHtmlAsPdf(formHtml);
pdfDocument.SaveAs("survey_form.pdf");
// Enable form fields creation in rendering options
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;
// Define HTML string with form elements
string formHtml = @"
<form>
    <h2>Customer Survey</h2>
    <label>Name: 
    <label>Email: 
    <label>Satisfaction:
        <select name='satisfaction'>
            <option>Excellent</option>
            <option>Good</option>
            <option>Fair</option>
        </select>
    </label><br>
    <label>Comments: <textarea name='comments'></textarea></label>
</form>";
// Create a PDF with interactive form fields
var pdfDocument = renderer.RenderHtmlAsPdf(formHtml);
pdfDocument.SaveAs("survey_form.pdf");
' Enable form fields creation in rendering options
renderer.RenderingOptions.CreatePdfFormsFromHtml = True
' Define HTML string with form elements
Dim formHtml As String = "
<form>
    <h2>Customer Survey</h2>
    <label>Name: 
    <label>Email: 
    <label>Satisfaction:
        <select name='satisfaction'>
            <option>Excellent</option>
            <option>Good</option>
            <option>Fair</option>
        </select>
    </label><br>
    <label>Comments: <textarea name='comments'></textarea></label>
</form>"
' Create a PDF with interactive form fields
Dim pdfDocument = renderer.RenderHtmlAsPdf(formHtml)
pdfDocument.SaveAs("survey_form.pdf")
$vbLabelText   $csharpLabel

設置CreatePdfFormsFromHtml可將HTML表單元素轉換為互動式PDF表單字段。 使用者可以填寫、保存和電子提交這些PDF文件。 此功能通過消除紙質表單而保持熟悉的HTML開發模式來簡化工作流程。 PDFDocument物件提供程式化操作表單字段的存取。 了解PDF表單操控以進行高級實現,包括數位簽章。

輸出

如何在C#中動態生成PDF:圖5 - 互動式PDF表單輸出

為何選擇IronPDF而非其他方法

IronPDF的Chrome渲染引擎確保生成的PDF具有像素級準確性,消除了舊WebKit渲染引擎解決方案的妥協。 與需要外部執行檔或無頭瀏覽器設置的開源庫替代方案不同,IronPDF整合無縫且無依賴。 流暢的API和高級API設計使其優於內建類或複雜的Crystal Reports實現。

如何在C#中動態生成PDF:圖6 - 功能

Key advantages for dynamic PDF generation in C

  • 完整的JavaScript執行,與其他方法不同
  • 適用於網路應用程式的執行緒安全操作
  • 與以下範例模式全面的異步支持
  • 頁碼和字體大小控制通過簡單的API端點配置
  • HTML到PDF轉換完全符合Chrome

如何在C#中動態生成PDF:圖7 - 動態PDF生成 - IronPDF

授權開始於$999對於單一開發者授權,並提供團隊和企業選項。 每個包都有其自身的優勢,通過節省開發時間來收回投資。 購買後立即獲得API金鑰。 查看授權選項以找到適合您專案的NuGet包。

如何在C#中動態生成PDF:圖8 - 授權

總結

在C#中動態生成PDF改變了應用程式在運行時提供個性化文件的方式。IronPDF提供生成來自HTML內容、網頁和資料源的PDF文件所需的重要工具。 其基於Chrome的渲染可確保您的PDF在C#中完全符合設計規範,而異步支持則允許企業級的處理。

以下命令開始您的旅程:Install-Package IronPdf。 使用IronPDF,您可以轉換HTML字串、建立包含圖像和表格的複雜PDF、新增頁碼、控制字體大小,並從任何資料源生成PDF報告。 每個新文件無論是建立簡單的var頁面還是具有多個var文件實例的複雜佈局,都能從像素級別的渲染中受益。

從IronPDF的免費30天試用套件開始。

常見問題

什麼是 C# 中的動態 PDF 生成?

C#中的動態PDF生成指的是在運行時建立PDF文件,通常使用資料驅動內容或個性化模板。IronPDF通過提供強大的工具無縫整合C#和.NET Framework來促進這一過程。

為什麼使用IronPDF進行PDF生成?

IronPDF是一個領先的動態生成PDF的解決方案,因其強大的基於Chrome的渲染引擎,確保了高品質輸出。它能與C#和.NET Framework無縫整合,非常適合於現代Web應用程式。

IronPDF如何支援C#開發者?

IronPDF通過提供一套全面的動態PDF生成功能支持C#開發者,包括能夠建立個性化發票、資料驅動報告和定製的表單欄位,全部在C#環境中實現。

在IronPDF中基於Chrome的渲染有什麼好處?

IronPDF中的基於Chrome的渲染提供了高保真度的PDF文件,這些文件能保持複雜佈局和樣式的完整性,保證生成的PDF在不同環境中外觀一致。

IronPDF能從HTML內容生成PDF嗎?

是的,IronPDF可以從HTML內容生成PDF,讓開發者能夠將網頁、HTML字串或模板轉換為專業品質的PDF文件。

IronPDF是否與.NET Framework相容?

IronPDF完全相容於.NET Framework,這使得它成為一個在此環境中動態生成PDF的多功能工具。

使用IronPDF能建立哪些型別的文件?

使用IronPDF,開發者可以建立多種文件,包括個性化的發票、資料驅動的報告和定製的表單欄位,所有這些都能夠從C#應用程式中動態生成。

IronPDF支持多語言PDF嗎?

是的,IronPDF支持生成多語言PDF,允許開發者建立滿足多種語言需求的文件。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話