如何使用 IronPDF 在 .NET 中动态生成 PDF
动态 PDF 生成功能让您的 .NET 应用程序能够按需生成个性化发票、实时数据报告和自定义证书——所有这些都无需修改任何静态模板。 IronPDF通过公开一个基于 Chrome 的渲染引擎,将 HTML、CSS 和 JavaScript 直接转换为像素级完美的 PDF 文档,从而简化了这一过程,让您可以专注于业务逻辑,而不是底层 PDF 内部机制。
本指南将引导您了解在 .NET 中生成数据驱动型 PDF 的每一项主要技术:安装库、应用占位符模板、以编程方式构建表格、使用条件内容块以及在渲染之前执行 JavaScript。 每个章节都包含一个可运行的 C# 代码示例,并解释了何时应该采用该特定策略。 到最后,您将掌握足够的知识,能够构建一个完整的动态 PDF 生成系统,以满足您的应用程序的特定需求。
!a href="/static-assets/pdf/blog/dynamic-pdf-generation/dynamic-pdf-generation-1.webp">Dynamic PDF Generation .NET Using IronPDF:图片 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 模板教程。
!a href="/static-assets/pdf/blog/dynamic-pdf-generation/dynamic-pdf-generation-3.webp">Dynamic PDF Generation .NET Using IronPDF:图像 3 - Dynamic PDF Generation .NET - 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 的多页渲染选项配合使用效果很好。
输出
!a href="/static-assets/pdf/blog/dynamic-pdf-generation/dynamic-pdf-generation-7.webp">Dynamic PDF Generation .NET Using IronPDF:图像 7 - HTML 到 PDF 输出。
如何处理跨越多页的动态表格?
从数据库生成的报告通常包含不可预测的行数。 正确处理自动分页符(而不将一行切成两半)需要特定的 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标准的存档文件
!a href="/static-assets/pdf/blog/dynamic-pdf-generation/dynamic-pdf-generation-6.webp">Dynamic PDF Generation .NET Using IronPDF:图像 6 - 跨平台兼容性

常见问题解答
什么是动态 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 来提高开发人员的工作效率,减少创建动态文档所需的时间和精力。



