如何使用 IronPDF 在 .NET 中動態生成 PDF
動態 PDF 生成功能可讓您的 .NET 應用程式按需產生個人化發票、即時資料報告和自訂憑證——所有這些都無需修改任何靜態範本。 IronPDF透過公開基於 Chrome 的渲染引擎,將 HTML、CSS 和 JavaScript 直接轉換為像素級完美的 PDF 文件,從而簡化了這一過程,讓您可以專注於業務邏輯,而不是底層 PDF 內部機制。
本指南將引導您了解在 .NET 中產生資料驅動型 PDF 的每項主要技術:安裝程式庫、應用程式佔位符範本、以程式設計方式建立表格、使用條件內容區塊以及在渲染之前執行 JavaScript。 每個章節都包含一個可運行的 C# 程式碼範例,並解釋了何時應該採用該特定策略。 到最後,您將掌握足夠的知識,能夠建立一個完整的動態 PDF 生成系統,以滿足您的應用程式的特定需求。
使用 IronPDF 進行 .NET 動態 PDF 產生:圖 1 - IronPDF
.NET 中的動態 PDF 產生是什麼?
動態 PDF 生成是指在運行時建立 PDF 文檔,其中每個內容(名稱、數字、日期、表格、圖表)都來自即時數據,而不是固定佈局。 文件結構可能保持不變,但其有效負載會隨著每次請求而改變。
以下幾種情況最能體現這種方法的價值:
-發票產生-每筆交易的明細項目、總計、稅率和付款條款均不相同 -財務報告-圖表和總表均來自全天更新的資料庫。 證書和文憑-每份記錄的得獎者姓名、完成日期和課程詳情均有所不同。 法律文件-合約中包含針對特定客戶的條款和司法管轄區規則。 -醫療記錄-病人人口統計資料、檢驗結果和護理計劃需要單獨的格式。
傳統的做法是維護一個靜態範本庫,並針對每個變體手動編輯這些範本。 隨著文件數量的增長和業務規則的增多,這種方法很快就會失效。 透過IronPDF 的 HTML 到 PDF 轉換引擎,您只需編寫一次生成邏輯,即可產生數千個格式正確、數據準確的 PDF 文件,而無需任何人工幹預。
IronPDF 可在 Windows、Linux、macOS、Docker 和 Azure 上運作——相同的 API 在所有平台上都能以相同的方式運作。 這種跨平台一致性意味著您可以在本地開發並部署到雲端容器,而無需任何特定於平台的調整。 該程式庫面向 .NET 6 及更高版本,支援最新的 .NET 版本和長期支援版本。
如何安裝並設定此函式庫?
IronPDF 以 NuGet 套件的形式分發,並可與任何 .NET 6 或更高版本的項目集成,包括 ASP.NET Core、Blazor 和控制台應用程式。 可透過套件管理器控制台或 .NET CLI 安裝:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
安裝好軟體包後,即可立即開始產生 PDF 檔案-免費試用期間無需設定檔或 API 金鑰。 如需生產許可,請造訪IronPDF 許可頁面,並選擇與您的部署模型相符的方案。
所有渲染的入口點是 ChromePdfRenderer。 以下程式碼片段展示了將動態 HTML 字串轉換為已儲存的 PDF 檔案所需的最少程式碼:
using IronPdf;
var renderer = new ChromePdfRenderer();
var customerName = "Alexandra Chen";
var orderNumber = "ORD-2025-001";
var totalAmount = 1499.99m;
var html = $"""
<h1>Order Confirmation</h1>
<p>Dear {customerName},</p>
<p>Thank you for your order #{orderNumber}.</p>
<p>Total amount: ${totalAmount:F2}</p>
<p>Your order will be processed within 24 hours.</p>
""";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("order-confirmation.pdf");
// Stream the bytes directly in a web response if needed
byte[] pdfBytes = pdf.BinaryData;
using IronPdf;
var renderer = new ChromePdfRenderer();
var customerName = "Alexandra Chen";
var orderNumber = "ORD-2025-001";
var totalAmount = 1499.99m;
var html = $"""
<h1>Order Confirmation</h1>
<p>Dear {customerName},</p>
<p>Thank you for your order #{orderNumber}.</p>
<p>Total amount: ${totalAmount:F2}</p>
<p>Your order will be processed within 24 hours.</p>
""";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("order-confirmation.pdf");
// Stream the bytes directly in a web response if needed
byte[] pdfBytes = pdf.BinaryData;
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim customerName As String = "Alexandra Chen"
Dim orderNumber As String = "ORD-2025-001"
Dim totalAmount As Decimal = 1499.99D
Dim html As String = $"
<h1>Order Confirmation</h1>
<p>Dear {customerName},</p>
<p>Thank you for your order #{orderNumber}.</p>
<p>Total amount: ${totalAmount:F2}</p>
<p>Your order will be processed within 24 hours.</p>
"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("order-confirmation.pdf")
' Stream the bytes directly in a web response if needed
Dim pdfBytes As Byte() = pdf.BinaryData
ChromePdfRenderer 在內部處理所有渲染複雜度。 字串插值($"""...""")在呼叫點將 C# 變數插入 HTML 中,保持範本的可讀性,並消除簡單情況下的專用範本庫。
有關完整的設定指南,包括 MVC 視圖和 Blazor 伺服器專案的配置,請參閱IronPDF 文件。
輸出
如何應用基於模板的PDF生成?
基於模板的產生方式將文件設計與資料綁定分開。 設計師只需建立一次 HTML 佈局,在運行時值應該出現的地方放置命名佔位符({{TOKEN}}),然後應用程式在渲染之前替換這些標記。 Stack Overflow 的 PDF 生成討論中推薦了這種模式,適用於模板更改頻率高於應用程式程式碼的項目。
using IronPdf;
// Reusable template -- stored in a file or database in production
var htmlTemplate = """
<style>
.invoice { font-family: Arial; max-width: 800px; margin: auto; }
.header { background: #f0f0f0; padding: 20px; }
.label { font-weight: bold; }
</style>
<div class='invoice'>
<div class='header'>
<h2>Invoice #{{INVOICE_NUMBER}}</h2>
<p>Date: {{INVOICE_DATE}}</p>
</div>
<p>Bill to: {{CUSTOMER_NAME}}</p>
<p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
</div>
""";
var invoiceHtml = htmlTemplate
.Replace("{{INVOICE_NUMBER}}", "INV-2025-1234")
.Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy"))
.Replace("{{CUSTOMER_NAME}}", "TechCorp Industries")
.Replace("{{TOTAL_AMOUNT}}", "5,750.00");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Invoice",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(invoiceHtml);
pdf.SaveAs("invoice.pdf");
using IronPdf;
// Reusable template -- stored in a file or database in production
var htmlTemplate = """
<style>
.invoice { font-family: Arial; max-width: 800px; margin: auto; }
.header { background: #f0f0f0; padding: 20px; }
.label { font-weight: bold; }
</style>
<div class='invoice'>
<div class='header'>
<h2>Invoice #{{INVOICE_NUMBER}}</h2>
<p>Date: {{INVOICE_DATE}}</p>
</div>
<p>Bill to: {{CUSTOMER_NAME}}</p>
<p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
</div>
""";
var invoiceHtml = htmlTemplate
.Replace("{{INVOICE_NUMBER}}", "INV-2025-1234")
.Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy"))
.Replace("{{CUSTOMER_NAME}}", "TechCorp Industries")
.Replace("{{TOTAL_AMOUNT}}", "5,750.00");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Invoice",
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(invoiceHtml);
pdf.SaveAs("invoice.pdf");
Imports IronPdf
' Reusable template -- stored in a file or database in production
Dim htmlTemplate As String = "
<style>
.invoice { font-family: Arial; max-width: 800px; margin: auto; }
.header { background: #f0f0f0; padding: 20px; }
.label { font-weight: bold; }
</style>
<div class='invoice'>
<div class='header'>
<h2>Invoice #{{INVOICE_NUMBER}}</h2>
<p>Date: {{INVOICE_DATE}}</p>
</div>
<p>Bill to: {{CUSTOMER_NAME}}</p>
<p class='label'>Amount due: ${{TOTAL_AMOUNT}}</p>
</div>
"
Dim invoiceHtml As String = htmlTemplate _
.Replace("{{INVOICE_NUMBER}}", "INV-2025-1234") _
.Replace("{{INVOICE_DATE}}", DateTime.Now.ToString("MMM dd, yyyy")) _
.Replace("{{CUSTOMER_NAME}}", "TechCorp Industries") _
.Replace("{{TOTAL_AMOUNT}}", "5,750.00")
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Invoice",
.DrawDividerLine = True
}
Dim pdf = renderer.RenderHtmlAsPdf(invoiceHtml)
pdf.SaveAs("invoice.pdf")
標記({{...}})精確地標記資料進入文件的位置,使非開發人員也能閱讀範本。 將範本儲存為外部檔案意味著設計人員無需修改應用程式程式碼庫即可更新佈局。 若要深入了解此模式,請參閱IronPDF 範本教學。
如何透過程式設計方式從數據生成 PDF 文件?
當文件內容依賴循環、聚合或條件格式時,在程式碼中建立 HTML 字串可以讓你獲得最大的控制權。 這種方法在財務和營運報告中很常見,因為在編譯時行數是未知的。它還允許您直接在 C# 中套用格式規則,而不是將其嵌入靜態範本中。
using IronPdf;
using System.Text;
var orderItems = new[]
{
new { Product = "Premium License", Quantity = 5, Price = 399.00m },
new { Product = "Support Package", Quantity = 1, Price = 299.00m },
new { Product = "Training Session", Quantity = 2, Price = 150.00m }
};
var sb = new StringBuilder();
sb.Append("<h2>Order Summary</h2>");
sb.Append("<table style='width:100%; border-collapse:collapse;'>");
sb.Append("<tr style='background:#333; color:white;'>");
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>");
sb.Append("</tr>");
decimal grandTotal = 0;
foreach (var item in orderItems)
{
var lineTotal = item.Quantity * item.Price;
grandTotal += lineTotal;
sb.Append($"""
<tr>
<td style='padding:10px;'>{item.Product}</td>
<td style='text-align:center;'>{item.Quantity}</td>
<td style='text-align:right;'>${item.Price:F2}</td>
<td style='text-align:right;'>${lineTotal:F2}</td>
</tr>
""");
}
sb.Append($"""
<tr style='font-weight:bold; background:#f0f0f0;'>
<td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
<td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
</tr>
""");
sb.Append("</table>");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());
pdf.SaveAs("order-summary.pdf");
// Get bytes for a web download response
byte[] pdfData = pdf.BinaryData;
using IronPdf;
using System.Text;
var orderItems = new[]
{
new { Product = "Premium License", Quantity = 5, Price = 399.00m },
new { Product = "Support Package", Quantity = 1, Price = 299.00m },
new { Product = "Training Session", Quantity = 2, Price = 150.00m }
};
var sb = new StringBuilder();
sb.Append("<h2>Order Summary</h2>");
sb.Append("<table style='width:100%; border-collapse:collapse;'>");
sb.Append("<tr style='background:#333; color:white;'>");
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>");
sb.Append("</tr>");
decimal grandTotal = 0;
foreach (var item in orderItems)
{
var lineTotal = item.Quantity * item.Price;
grandTotal += lineTotal;
sb.Append($"""
<tr>
<td style='padding:10px;'>{item.Product}</td>
<td style='text-align:center;'>{item.Quantity}</td>
<td style='text-align:right;'>${item.Price:F2}</td>
<td style='text-align:right;'>${lineTotal:F2}</td>
</tr>
""");
}
sb.Append($"""
<tr style='font-weight:bold; background:#f0f0f0;'>
<td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
<td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
</tr>
""");
sb.Append("</table>");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(sb.ToString());
pdf.SaveAs("order-summary.pdf");
// Get bytes for a web download response
byte[] pdfData = pdf.BinaryData;
Imports IronPdf
Imports System.Text
Dim orderItems = New() {
New With {.Product = "Premium License", .Quantity = 5, .Price = 399.0D},
New With {.Product = "Support Package", .Quantity = 1, .Price = 299.0D},
New With {.Product = "Training Session", .Quantity = 2, .Price = 150.0D}
}
Dim sb = New StringBuilder()
sb.Append("<h2>Order Summary</h2>")
sb.Append("<table style='width:100%; border-collapse:collapse;'>")
sb.Append("<tr style='background:#333; color:white;'>")
sb.Append("<th style='padding:10px;'>Product</th><th>Qty</th><th>Unit Price</th><th>Total</th>")
sb.Append("</tr>")
Dim grandTotal As Decimal = 0
For Each item In orderItems
Dim lineTotal = item.Quantity * item.Price
grandTotal += lineTotal
sb.Append($"
<tr>
<td style='padding:10px;'>{item.Product}</td>
<td style='text-align:center;'>{item.Quantity}</td>
<td style='text-align:right;'>${item.Price:F2}</td>
<td style='text-align:right;'>${lineTotal:F2}</td>
</tr>
")
Next
sb.Append($"
<tr style='font-weight:bold; background:#f0f0f0;'>
<td colspan='3' style='padding:10px; text-align:right;'>Grand total:</td>
<td style='text-align:right; padding:10px;'>${grandTotal:F2}</td>
</tr>
")
sb.Append("</table>")
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(sb.ToString())
pdf.SaveAs("order-summary.pdf")
' Get bytes for a web download response
Dim pdfData As Byte() = pdf.BinaryData
StringBuilder 能夠有效率地處理大型 HTML 字串。 foreach 循環會擴展到資料來源提供的任何行數,而正在運行的 grandTotal 計算顯示了業務邏輯如何自然地與 HTML 構造整合。 對於非常大的資料集,這種方法與IronPDF 的多頁渲染選項搭配使用效果很好。
輸出
如何處理跨越多頁的動態表格?
從資料庫產生的報告通常包含不可預測的行數。 正確處理自動分頁符號(而不將一行切成兩半)需要特定的 CSS 以及 IronPDF 的渲染選項。 page-break-inside: avoid 規則與正確的邊距配置結合,可使表格在跨頁顯示時保持每一行完整。
using IronPdf;
var salesData = Enumerable.Range(1, 30).Select(i => new
{
Month = $"Month {i}",
Revenue = 10_000 + (i * 500),
Growth = 2.5 + (i * 0.3)
});
var tableHtml = """
<style>
table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
th { background: #2c3e50; color: white; padding: 12px; }
td { padding: 8px; border-bottom: 1px solid #ddd; }
tr:nth-child(even) { background: #f9f9f9; }
tr { page-break-inside: avoid; page-break-after: auto; }
</style>
<h2>Sales Performance Report</h2>
<table>
<thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
<tbody>
""";
foreach (var row in salesData)
{
tableHtml += $"""
<tr>
<td>{row.Month}</td>
<td>${row.Revenue:N0}</td>
<td>{row.Growth:F1}%</td>
</tr>
""";
}
tableHtml += "</tbody></table>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "{page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf(tableHtml);
pdf.SaveAs("sales-report.pdf");
using IronPdf;
var salesData = Enumerable.Range(1, 30).Select(i => new
{
Month = $"Month {i}",
Revenue = 10_000 + (i * 500),
Growth = 2.5 + (i * 0.3)
});
var tableHtml = """
<style>
table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
th { background: #2c3e50; color: white; padding: 12px; }
td { padding: 8px; border-bottom: 1px solid #ddd; }
tr:nth-child(even) { background: #f9f9f9; }
tr { page-break-inside: avoid; page-break-after: auto; }
</style>
<h2>Sales Performance Report</h2>
<table>
<thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
<tbody>
""";
foreach (var row in salesData)
{
tableHtml += $"""
<tr>
<td>{row.Month}</td>
<td>${row.Revenue:N0}</td>
<td>{row.Growth:F1}%</td>
</tr>
""";
}
tableHtml += "</tbody></table>";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "{page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf(tableHtml);
pdf.SaveAs("sales-report.pdf");
Imports IronPdf
Dim salesData = Enumerable.Range(1, 30).Select(Function(i) New With {
.Month = $"Month {i}",
.Revenue = 10000 + (i * 500),
.Growth = 2.5 + (i * 0.3)
})
Dim tableHtml As String = "
<style>
table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
th { background: #2c3e50; color: white; padding: 12px; }
td { padding: 8px; border-bottom: 1px solid #ddd; }
tr:nth-child(even) { background: #f9f9f9; }
tr { page-break-inside: avoid; page-break-after: auto; }
</style>
<h2>Sales Performance Report</h2>
<table>
<thead><tr><th>Period</th><th>Revenue</th><th>Growth %</th></tr></thead>
<tbody>
"
For Each row In salesData
tableHtml += $"
<tr>
<td>{row.Month}</td>
<td>${row.Revenue:N0}</td>
<td>{row.Growth:F1}%</td>
</tr>
"
Next
tableHtml += "</tbody></table>"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "{page} of {total-pages}",
.FontSize = 10
}
Dim pdf = renderer.RenderHtmlAsPdf(tableHtml)
pdf.SaveAs("sales-report.pdf")
{page} 和 {total-pages} 是 IronPDF 內建的自動頁尾編號的標記。 頁邊距使每頁的內容遠離邊緣,即使表格長達數十頁,也能讓最終報告看起來專業美觀。
有關包含合併儲存格在內的複雜表格佈局的格式指南,請參閱IronPDF 渲染選項參考。
如何為 PDF 新增條件內容?
許多文件類型都包含一些僅在滿足特定條件時才應顯示的章節——例如,頂級客戶的高級徽章、促銷活動適用時的折扣提示、帳戶逾期時的警告。 C# 條件邏輯直接滿足此要求,並且由於條件是在建立 HTML 字串之前進行評估的,因此最終 PDF 中不會出現空的佔位符元素。
using IronPdf;
var customer = new
{
Name = "Global Tech Solutions",
IsPremium = true,
HasDiscount = true,
DiscountPct = 15,
LoyaltyPoints = 2500
};
var html = $"""<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>""";
if (customer.IsPremium)
{
html += """<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>""";
}
if (customer.HasDiscount)
{
html += $"""<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>""";
}
if (customer.LoyaltyPoints > 0)
{
html += $"""<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>""";
}
html += "</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("customer-profile.pdf");
using IronPdf;
var customer = new
{
Name = "Global Tech Solutions",
IsPremium = true,
HasDiscount = true,
DiscountPct = 15,
LoyaltyPoints = 2500
};
var html = $"""<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>""";
if (customer.IsPremium)
{
html += """<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>""";
}
if (customer.HasDiscount)
{
html += $"""<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>""";
}
if (customer.LoyaltyPoints > 0)
{
html += $"""<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>""";
}
html += "</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("customer-profile.pdf");
Imports IronPdf
Dim customer = New With {
.Name = "Global Tech Solutions",
.IsPremium = True,
.HasDiscount = True,
.DiscountPct = 15,
.LoyaltyPoints = 2500
}
Dim html = $"<h2>Customer Profile: {customer.Name}</h2><div style='border:1px solid #ddd; padding:20px;'>"
If customer.IsPremium Then
html += "<div style='background:gold; padding:10px; margin-bottom:10px;'>PREMIUM MEMBER -- Exclusive benefits applied</div>"
End If
If customer.HasDiscount Then
html += $"<div style='background:#e8f5e9; padding:10px; margin-bottom:10px;'>Special discount: {customer.DiscountPct}% off all orders</div>"
End If
If customer.LoyaltyPoints > 0 Then
html += $"<div style='background:#f3e5f5; padding:10px;'>Loyalty points balance: {customer.LoyaltyPoints:N0} points</div>"
End If
html += "</div>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("customer-profile.pdf")
您可以將相同的模式擴展到任何基於規則的內容:特定司法管轄區的法律免責聲明、由購物車金額觸發的促銷部分,或由產品類別觸發的安全警告。 產生的 PDF 檔案包含的內容完全正確,不多也不少。
輸出
如何在 PDF 中渲染 JavaScript 圖表?
現代儀錶板通常依賴Chart.js或D3.js等 JavaScript 圖表庫在渲染時繪製圖表。 IronPDF 可以在擷取頁面之前執行 JavaScript,因此圖表會在拍攝 PDF 快照之前完全渲染完畢。 這意味著您不需要單獨的螢幕截圖服務或伺服器端圖表渲染庫。
using IronPdf;
var chartHtml = """
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<canvas id='revenueChart' width='500' height='250'></canvas>
<script>
var ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
datasets: [{
label: 'Revenue (thousands)',
data: [120, 195, 230, 285],
backgroundColor: '#3498db'
}]
},
options: { animation: false }
});
</script>
""";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1500);
var pdf = renderer.RenderHtmlAsPdf(chartHtml);
pdf.SaveAs("revenue-chart.pdf");
using IronPdf;
var chartHtml = """
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<canvas id='revenueChart' width='500' height='250'></canvas>
<script>
var ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
datasets: [{
label: 'Revenue (thousands)',
data: [120, 195, 230, 285],
backgroundColor: '#3498db'
}]
},
options: { animation: false }
});
</script>
""";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1500);
var pdf = renderer.RenderHtmlAsPdf(chartHtml);
pdf.SaveAs("revenue-chart.pdf");
Imports IronPdf
Dim chartHtml As String = "
<script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
<canvas id='revenueChart' width='500' height='250'></canvas>
<script>
var ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: ['Q1', 'Q2', 'Q3', 'Q4'],
datasets: [{
label: 'Revenue (thousands)',
data: [120, 195, 230, 285],
backgroundColor: '#3498db'
}]
},
options: { animation: false }
});
</script>
"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(1500)
Dim pdf = renderer.RenderHtmlAsPdf(chartHtml)
pdf.SaveAs("revenue-chart.pdf")
EnableJavaScript = true 啟用無頭 Chrome 引擎內部的腳本執行。 RenderDelay(1500) 在頁面載入後新增 1.5 秒的暫停,以便非同步圖表渲染有時間完成,然後再進行快照。 在 Chart.js 選項中設定 animation: false 可防止在過渡過程中捕捉動畫影格。
此技術適用於任何 JavaScript 程式庫。 您可以使用 C# 字串插值將伺服器端資料傳遞到 <script> 區塊中,這樣每個圖表都能反映生成時的即時資料庫資料。 有關 JavaScript 配置的更多詳細信息,請參閱IronPDF 的 JavaScript 渲染指南。
如何匯出和交付產生的PDF文件?
一旦 RenderHtmlAsPdf 返回 PdfDocument 對象,您將根據應用程式類型有多種交付選項。 儲存到磁碟是最簡單的方法,適用於後台批次作業。 對於 Web API 和 MVC 控制器,將位元組直接串流到 HTTP 回應可以避免寫入臨時文件,並保持伺服器檔案系統的清潔。
using IronPdf;
using Microsoft.AspNetCore.Mvc;
// In an ASP.NET Core controller action:
public IActionResult DownloadInvoice(int orderId)
{
var renderer = new ChromePdfRenderer();
var html = BuildInvoiceHtml(orderId); // your data-binding method
var pdf = renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
using IronPdf;
using Microsoft.AspNetCore.Mvc;
// In an ASP.NET Core controller action:
public IActionResult DownloadInvoice(int orderId)
{
var renderer = new ChromePdfRenderer();
var html = BuildInvoiceHtml(orderId); // your data-binding method
var pdf = renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
' In an ASP.NET Core controller action:
Public Function DownloadInvoice(orderId As Integer) As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim html = BuildInvoiceHtml(orderId) ' your data-binding method
Dim pdf = renderer.RenderHtmlAsPdf(html)
Return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf")
End Function
pdf.BinaryData 傳回原始位元組作為 byte[],它直接對應到 ASP.NET Core 的 File() 結果。 瀏覽器接收到正確的 MIME 類型(application/pdf),並觸發一個具有有意義檔案名稱的下載對話方塊。
其他輸出功能包括PDF 合併、數位簽章、 PDF/A 檔案格式、密碼保護以及文字和影像擷取。 這些功能會對渲染器傳回的同一個 PdfDocument 物件進行操作,因此您可以鍊式執行操作而無需建立中間檔案。
下一步計劃是什麼?
.NET 中的動態 PDF 生成歸根結底由三個構建塊組成:一個隨資料變化的 HTML 字串、將該字串轉換為 PDF 的 ChromePdfRenderer 以及適合您應用程式的交付機制。 IronPDF 可以處理所有中間環節——分頁符號、頁首和頁尾、JavaScript 執行力以及跨平台相容性。
要從閱讀過渡到構建,首先需要安裝軟體包,然後針對您自己的資料運行上述範例之一:
dotnet add package IronPdf
dotnet add package IronPdf
從那裡開始,探索IronPDF 文檔,以了解特定平台的設定(Azure、Docker、Linux)、進階渲染選項和完整的 API 參考。 準備部署時,請造訪授權頁面,選擇適合您生產規模的方案。 免費試用版提供完整功能存取權限,無需信用卡,因此您可以在正式購買前驗證您的實施方案。
與動態生成相輔相成的其他指南:
-使用 C# 從 HTML 模板產生 PDF 將 URL 轉換為 PDF 合併和拆分 PDF 文檔 -為PDF檔案新增數位簽名 -符合PDF/A標準的存檔文件
常見問題解答
什麼是動態 PDF 生成?
動態 PDF 產生是指根據即時資料輸入即時建立 PDF 文件,而非使用預先存在的靜態範本。
IronPDF 如何幫助 .NET 中的動態 PDF 生成?
IronPDF 簡化了動態 PDF 的產生,允許開發人員從 HTML、圖片或其他來源建立 PDF,專注於商業邏輯而非複雜的 PDF 渲染。
使用 IronPDF 生成動态 PDF 有哪些好處?
使用 IronPDF 製作動態 PDF,可以實現個人化、即時資料整合,並降低直接從 .NET 應用程式建立 PDF 文件的複雜度。
IronPDF 可以用於在電子商務平台中產生個人化的發票嗎?
是的,IronPDF 可以透過整合即時資料動態產生個人化的發票,因此非常適合電子商務平台。
哪些類型的應用程式可受益於動態 PDF 生成?
電子商務平台、報表系統和教育平台等應用程式可透過提供客製化的即時文件,從動態 PDF 生成中獲益。
IronPDF 適合用於產生具有即時資料的 PDF 報表嗎?
絕對的,IronPDF 藉由拉取即時資料來產生 PDF 報表,使其成為動態文件產生的完美工具。
IronPDF 如何處理複雜的 PDF 渲染?
IronPDF 將複雜的 PDF 演算抽象化,讓開發人員在建立高品質 PDF 的同時,也能專注於應用程式的商業邏輯。
IronPDF 可以動態創建教育證書嗎?
是的,IronPDF 可以透過資料輸入動態產生教育證書,以建立個人化且外觀專業的證書。
IronPDF 是否支援從 HTML 內容建立 PDF?
IronPDF 支援從 HTML 內容建立 PDF,讓開發人員可以直接將網頁或 HTML 字串轉換成 PDF 格式。
IronPDF 如何提高開發人員的工作效率?
IronPDF 透過提供直接的 PDF 生成 API 來提高開發人員的生產力,減少建立動態文件所需的時間和精力。



