如何在 C# 中動態生成 PDF
現代Web應用程式需要的不僅僅是建立靜態文件。 無論是產生個人化發票、建立資料驅動的 PDF 報告,還是產生自訂表單字段,開發人員都需要強大的工具來在運行時產生 PDF 文件。 IronPDF 憑藉其強大的基於 Chrome 的渲染功能脫穎而出,成為領先的解決方案,能夠創建 PDF 文檔,並與 C# 無縫集成,從而在 C# 和 .NET Framework 環境中實現動態 PDF 生成。
What is Dynamic PDF Generation in C#?
C# 中的動態 PDF 產生功能可在執行時使用來自多個資料來源(包括資料庫、API 或使用者輸入)的可變資料建立 PDF 文件。 與靜態 PDF 檔案不同,執行時間產生能夠實現個人化內容、條件部分和資料驅動佈局,這些對於發票、PDF 報告、憑證和能夠適應不斷變化的需求的表單至關重要。 這種以程式設計方式建立 PDF 的方法對於現代.NET Framework和 .NET Core 應用程式來說至關重要。
開始使用 IronPDF
首先透過 Visual Studio 中的套件管理器控制台安裝 IronPDF NuGet 套件:
Install-Package IronPdf
或使用 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
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")
這種模板方法將展示與資料分離,使設計人員能夠修改複雜的佈局,而開發人員則專注於資料整合。 Replace 方法會將範本 ID 佔位符替換為執行時間值,從而建立個人化的 PDF 文件。 對於包含重複部分的 HTML 內容轉換,請在進行 PDF 轉換之前使用循環動態建立 HTML。 探索更多HTML 轉 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
非同步模式支援並發生成 PDF,在大量產生 PDF 文件時可顯著提高吞吐量。 Task.WhenAll 確保所有 PDF 檔案都已完成才繼續執行。 上述程式碼使用 CSS 分頁屬性來控制分頁,確保每位客戶的報告都從新的一頁開始。 查閱企業級Web應用程式的非同步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")
設定 CreatePdfFormsFromHtml 會將 HTML 表單元素轉換為互動式 PDF 表單欄位。 使用者可以電子方式填寫、儲存和提交這些PDF文件。 此功能透過消除紙本表格來簡化工作流程,同時保持熟悉的 HTML 開發模式。 PDFDocument 物件提供了以程式設計方式操作表單欄位的功能。 了解 PDF 表單操作的高級應用,包括數位簽章。
輸出
為什麼選擇 IronPDF 而不是其他方法
IronPDF 的 Chrome 渲染引擎可確保在建立 PDF 時達到像素級的精確度,消除了舊版 WebKit 渲染引擎解決方案的妥協。 與需要外部可執行檔或無頭瀏覽器設定的開源庫替代方案不同,IronPDF 可以無縫集成,無需任何依賴項。 流暢的 API 和進階 API 設計使其優於內建類別或複雜的 Crystal Reports 實作。
Key advantages for dynamic PDF generation in C#
- 完全執行 JavaScript,與其他方法不同
- Web應用程式的執行緒安全操作
- 提供全面的非同步支援,並附有以下範例模式
- 透過簡單的 API 端點設定控制頁碼和字體大小
- HTML 轉 PDF 轉換與 Chrome 完全一致
如何在 C# 中動態產生 PDF:圖 7 - 動態 PDF 產生 - IronPDF
單一開發者授權的起價為 $799 ,另有團隊和企業選項可供選擇。 每個軟體包都有其自身的優勢,並且透過節省開發時間,投資可以收回成本。 購買後即可立即取得您的 API 金鑰。 查看授權選項,找到適合您專案的 NuGet 套件。
結論
C# 中的動態 PDF 生成功能徹底改變了應用程式在運行時交付個人化文件的方式。 IronPDF 提供了一系列必要的工具,可以從 HTML 內容、網頁和資料來源產生 PDF 檔案。 其基於 Chrome 的渲染功能可確保您的 C# PDF 與設計規格完全匹配,而非同步支援則可實現企業級處理。
以下命令開始您的旅程: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 集成,使其成為現代網路應用程序的理想選擇。
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 的生成,讓開發人員能夠創建滿足多種語言要求的文檔。



