如何在 Blazor 中顯示 PDF(指南)
動態PDF生成讓您的.NET應用程式能夠生成個性化帳單、即時資料報告和自定義證書,全程不需觸碰任何靜態模板。 IronPDF 讓這變得簡單,提供基於Chrome的渲染引擎,直接將HTML、CSS和JavaScript轉換成像素完美的PDF文件,因此您可以專注於業務邏輯而不是低階PDF細節。
本指南將帶您探索在.NET中資料驅動PDF生成的每個主要技術:安裝程式庫、應用佔位符模板、以程式化方式構建表格、使用條件內容塊,並在渲染前執行JavaScript。 每個章節都包含一個可運行的C#程式碼範例,並解釋何時應使用該特定策略。 最後,您將擁有足夠的工作知識,以構建一個完整的動態PDF生成系統,以滿足您應用程式的特定需求。

在.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
一旦安裝完畢,您可以立即開始生成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字串。 grandTotal計算顯示了業務邏輯如何與HTML結構自然整合。 對於非常大的資料集,這種方法與IronPDF的多頁渲染選項搭配良好。
輸出

如何處理跨多頁的動態表格?
從資料庫生成的報告通常包含無法預測的行數。 正確處理自動分頁隔斷——不將行切成兩半——需要在IronPDF的渲染選項中應用特定的CSS。 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")
{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驅動的圖表?
現代儀表板通常依賴於JavaScript圖表程式庫,如Chart.js或D3.js來在渲染時繪製圖形。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")
RenderDelay(1500)在頁面載入完成後增加1.5秒的暫停,讓異步圖表渲染在快照拍攝前完成。 在Chart.js選項中設定animation: false可防止動畫框在過渡中被捕獲。
這一技術適用於任何JavaScript程式庫。 您可以使用C#字串插值將伺服器端資料傳入<script>塊,以便每個圖表在生成時均反映出即時的資料庫資料。 如需更多有關JavaScript配置的細節,請參閱IronPDF的JavaScript渲染指南。
如何導出並交付生成的PDF?
一旦PdfDocument物件,您可以根據您的應用程式型別選擇多個交付選項。 存到磁碟是最簡單的方法,適用於背景批處理作業。 對於網路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
byte[],這直接對映到ASP.NET Core的File()結果。 瀏覽器獲取正確的MIME型別(application/pdf),並彈出具有意義的文件名的下載對話框。
額外的輸出功能包括PDF合併、數位簽章、PDF/A歸檔格式,密碼保護和文字提取和圖像提取。 這些功能在渲染器返回的相同PdfDocument物件上操作,因此您可以連結操作而不建立中間文件。

下一步如何?
在.NET中動態PDF生成歸結為三個構件:HTML字串隨您的資料變化,ChromePdfRenderer 將該字串轉換為PDF,以及適合您應用程式的交付機制。 IronPDF處理內部所有過程——分頁、頁眉和頁腳、JavaScript執行以及跨平台的相容性。
從閱讀到構建的過程,首先安裝包,使用您自己的資料運行上述例子之一:
dotnet add package IronPdf
從那裡開始,探索IronPDF文件,了解平台特定的設置(Azure、Docker、Linux)、先進的渲染選項和完整的API參考。 當您準備好部署時,請存取授權頁面以選擇適合您生產量的計劃。 免費試用允許您全功能存取且不需要信用卡,因此可以在提交之前驗證您的實施。
與動態生成非常匹配的其他指南:


常見問題
什麼是動態PDF生成?
動態PDF生成是指在不使用已有的靜態模板的情況下,基於實時資料輸入動態建立PDF文件。
IronPDF如何幫助在.NET中進行動態PDF生成?
IronPDF通過允許開發者從HTML、圖片或其他來源製作PDF來簡化動態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來提高開發者的生產力,減少建立動態文件所需的時間和精力。

