Como gerar PDFs dinamicamente em .NET usando o IronPDF
A geração dinâmica de PDFs permite que seus aplicativos .NET produzam faturas personalizadas, relatórios de dados em tempo real e certificados personalizados sob demanda, tudo isso sem precisar usar um único modelo estático. O IronPDF simplifica isso ao expor um mecanismo de renderização baseado no Chrome que converte HTML, CSS e JavaScript diretamente em documentos PDF com qualidade de imagem perfeita, permitindo que você se concentre na lógica de negócios em vez dos detalhes internos de baixo nível do PDF.
Este guia apresenta todas as principais técnicas para produzir PDFs orientados a dados em .NET: instalação da biblioteca, aplicação de modelos de espaço reservado, criação programática de tabelas, uso de blocos de conteúdo condicional e execução de JavaScript antes da renderização. Cada seção inclui um exemplo de código C# funcional e uma explicação de quando utilizar essa estratégia específica. Ao final, você terá conhecimento prático suficiente para construir um sistema completo de geração dinâmica de PDFs, adaptado aos requisitos específicos da sua aplicação.

O que é geração dinâmica de PDF em .NET?
A geração dinâmica de PDFs significa criar documentos PDF em tempo real, onde cada elemento de conteúdo — nomes, números, datas, tabelas, gráficos — provém de dados em tempo real, em vez de um layout fixo. A estrutura do documento pode permanecer a mesma, mas seu conteúdo muda a cada solicitação.
Aqui estão os cenários em que essa abordagem oferece o maior valor:
- Geração de faturas -- os itens, totais, taxas de impostos e condições de pagamento variam para cada transação.
- Relatórios financeiros -- gráficos e tabelas de resumo extraídos de um banco de dados atualizado ao longo do dia
- Certificados e diplomas -- os nomes dos destinatários, as datas de conclusão e os detalhes do curso variam conforme o registro.
- Documentos legais -- contratos incorporam cláusulas específicas do cliente e regras de jurisdição
- Registros médicos — dados demográficos do paciente, resultados de exames e planos de tratamento exigem formatação individual.
A alternativa convencional é manter uma biblioteca de modelos estáticos e editá-los manualmente para cada variação. Essa abordagem se torna ineficaz rapidamente à medida que o volume de documentos aumenta e as regras de negócio se multiplicam. Com o mecanismo de conversão de HTML para PDF do IronPDF , você escreve a lógica de geração uma única vez e produz milhares de PDFs formatados corretamente e com dados precisos, sem qualquer intervenção manual.
O IronPDF funciona no Windows, Linux, macOS, Docker e Azure — a mesma API funciona de forma idêntica em todas as plataformas. Essa consistência entre plataformas significa que você pode desenvolver localmente e implantar em um contêiner na nuvem sem quaisquer ajustes específicos da plataforma. A biblioteca é compatível com o .NET 6 e versões posteriores, oferecendo suporte tanto às versões mais recentes do .NET quanto às versões com suporte de longo prazo.

Como instalar e configurar a biblioteca?
O IronPDF é distribuído como um pacote NuGet e integra-se a qualquer projeto .NET 6 ou posterior, incluindo ASP.NET Core, Blazor e aplicativos de console. Instale-o através do Console do Gerenciador de Pacotes ou da CLI do .NET :
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Após a instalação do pacote, você pode começar a gerar PDFs imediatamente — nenhum arquivo de configuração ou chave de API é necessário durante o período de avaliação gratuita. Para licenciamento de produção, visite a página de licenciamento do IronPDF e escolha o plano que melhor se adapta ao seu modelo de implementação.
O ponto de entrada para toda a renderização é ChromePdfRenderer. O trecho de código abaixo mostra o código mínimo necessário para transformar uma string HTML dinâmica em um arquivo PDF salvo:
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 lida internamente com toda a complexidade de renderização. A interpolação de strings ($"""...""") insere variáveis C# em HTML no ponto de chamada, mantendo os modelos legíveis e eliminando a necessidade de uma biblioteca de modelos dedicada para casos simples.
Para obter orientações completas sobre a configuração, incluindo a configuração de visualizações MVC e projetos de servidor Blazor , consulte a documentação do IronPDF .
Saída

Como aplicar a geração de PDFs baseada em modelos?
A geração baseada em modelos separa o design do documento da vinculação de dados. Um designer cria o layout HTML uma única vez, inserindo marcadores nomeados ({{TOKEN}}) onde os valores em tempo de execução devem aparecer, e seu aplicativo substitui esses marcadores antes da renderização. Este é o padrão recomendado nas discussões sobre geração de PDFs do Stack Overflow para projetos em que os modelos mudam com mais frequência do que o código do aplicativo.
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")
Os marcadores ({{...}}) indicam exatamente onde os dados entram no documento, tornando os modelos legíveis para pessoas sem conhecimento de programação. Armazenar modelos como arquivos externos significa que um designer pode atualizar o layout sem alterar o código-fonte do aplicativo. Para uma explicação mais detalhada deste padrão, consulte o tutorial do modelo IronPDF .

Como criar PDFs programaticamente a partir de dados?
Quando o conteúdo do documento depende de loops, agregações ou formatação condicional, construir a string HTML em código oferece o maior controle. Essa abordagem é comum em relatórios financeiros e operacionais, onde o número de linhas é desconhecido em tempo de compilação. Ela também permite aplicar regras de formatação diretamente em C#, em vez de incorporá-las em um modelo estático.
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 lida com grandes strings HTML de forma eficiente. O loop foreach se expande para quantas linhas sua fonte de dados fornecer, e o cálculo em execução grandTotal mostra como a lógica de negócios se integra naturalmente à construção do HTML. Para conjuntos de dados muito grandes, essa abordagem combina bem com as opções de renderização de várias páginas do IronPDF .
Saída

Como lidar com tabelas dinâmicas que abrangem várias páginas?
Os relatórios gerados a partir de bancos de dados frequentemente contêm contagens de linhas imprevisíveis. Lidar corretamente com quebras de página automáticas — sem cortar uma linha ao meio — requer CSS específico, além das opções de renderização do IronPDF. A regra page-break-inside: avoid, combinada com a configuração correta das margens, mantém cada linha intacta à medida que a tabela flui entre as páginas.
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} e {total-pages} são tokens integrados do IronPDF para numeração automática de rodapé. As margens mantêm o conteúdo afastado das bordas em todas as páginas, conferindo ao relatório final uma aparência profissional, mesmo quando a tabela se estende por dezenas de páginas.
Para obter orientações sobre a formatação de layouts de tabelas complexos, incluindo células mescladas, consulte a referência de opções de renderização do IronPDF .
Como adicionar conteúdo condicional a um PDF?
Muitos tipos de documentos incluem seções que devem aparecer somente quando determinadas condições forem verdadeiras — um selo premium para clientes de nível superior, um bloco de desconto quando uma promoção se aplica, um aviso quando uma conta está em atraso. A lógica condicional do C# se adapta diretamente a esse requisito e, como a condição é avaliada antes da construção da string HTML, nenhum elemento de espaço reservado vazio acaba no PDF final.
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")
Você pode estender o mesmo padrão a qualquer conteúdo baseado em regras: avisos legais específicos de cada jurisdição, seções promocionais acionadas pelo valor do carrinho ou alertas de segurança acionados pela categoria do produto. O PDF resultante contém exatamente o conteúdo que deveria conter – nada mais, nada menos.
Saída

Como renderizar gráficos gerados por JavaScript em um PDF?
Painéis de controle modernos geralmente dependem de bibliotecas de gráficos JavaScript , como Chart.js ou D3.js, para desenhar gráficos no momento da renderização. O IronPDF pode executar o JavaScript antes de capturar a página, de modo que o gráfico seja renderizado completamente antes da captura da imagem em PDF. Isso significa que você não precisa de um serviço de captura de tela separado nem de uma biblioteca de renderização de gráficos no servidor.
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 ativa a execução de scripts dentro do mecanismo Chrome sem interface gráfica. RenderDelay(1500) adiciona uma pausa de 1,5 segundos após o carregamento da página, dando tempo para que a renderização assíncrona do gráfico seja concluída antes da captura da imagem. A configuração animation: false nas opções do Chart.js impede que os quadros animados sejam capturados durante a transição.
Essa técnica funciona com qualquer biblioteca JavaScript . Você pode passar dados do servidor para o bloco <script> usando interpolação de strings em C#, para que cada gráfico reflita os valores reais do banco de dados no momento da geração. Para obter mais detalhes sobre a configuração do JavaScript , consulte o guia de renderização em JavaScript do IronPDF .
Como exportar e entregar o PDF gerado?
Assim que RenderHtmlAsPdf retornar um objeto PdfDocument, você terá diversas opções de entrega, dependendo do tipo de sua aplicação. Salvar em disco é a abordagem mais simples e funciona para trabalhos em lote em segundo plano. Para APIs web e controladores MVC, transmitir os bytes diretamente para a resposta HTTP evita a gravação de arquivos temporários e mantém o sistema de arquivos do servidor limpo.
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 retorna os bytes brutos como um byte[], que mapeia diretamente para o resultado do ASP.NET Core File(). O navegador recebe o tipo MIME correto (application/pdf) e aciona uma caixa de diálogo de download com um nome de arquivo significativo.
As funcionalidades adicionais de saída incluem fusão de PDFs , assinaturas digitais , formato de arquivo PDF/A , proteção por senha e extração de texto e imagem . Esses recursos operam no mesmo objeto PdfDocument retornado pelo renderizador, permitindo encadear operações sem criar arquivos intermediários.

Quais são os seus próximos passos?
A geração dinâmica de PDFs em .NET se resume a três elementos básicos: uma string HTML que varia de acordo com seus dados, um conversor para essa string em um PDF e o mecanismo de entrega adequado à sua aplicação. O IronPDF cuida de tudo o mais: quebras de página, cabeçalhos e rodapés, execução de JavaScript e compatibilidade entre plataformas.
Para passar da leitura à construção, comece instalando o pacote e executando um dos exemplos acima com seus próprios dados:
dotnet add package IronPdf
dotnet add package IronPdf
A partir daí, explore a documentação do IronPDF para obter informações sobre a configuração específica da plataforma (Azure, Docker, Linux), opções avançadas de renderização e a referência completa da API. Quando estiver pronto para implementar, visite a página de licenciamento para escolher um plano que se adeque ao seu volume de produção. O período de teste gratuito oferece acesso completo a todos os recursos, sem necessidade de cartão de crédito, permitindo que você valide a implementação antes de se comprometer.
Guias adicionais que combinam bem com a geração dinâmica:
- Gerar um PDF a partir de um modelo HTML em C# Converter URL em PDF
- Unir e dividir documentos PDF
- Adicionar assinaturas digitais a PDFs
- Conformidade com o padrão PDF/A para documentos arquivados


Perguntas frequentes
O que é geração dinâmica de PDF?
A geração dinâmica de PDFs refere-se à criação de documentos PDF em tempo real, com base em dados inseridos no momento, em vez de usar modelos estáticos preexistentes.
Como o IronPDF pode ajudar na geração dinâmica de PDFs em .NET?
O IronPDF simplifica a geração dinâmica de PDFs, permitindo que os desenvolvedores criem PDFs a partir de HTML, imagens ou outras fontes, concentrando-se na lógica de negócios em vez da renderização complexa do PDF.
Quais são os benefícios de usar o IronPDF para gerar PDFs dinâmicos?
Utilizar o IronPDF para PDFs dinâmicos permite personalização, integração de dados em tempo real e redução da complexidade na criação de documentos PDF diretamente de aplicações .NET.
O IronPDF pode ser usado para gerar faturas personalizadas em uma plataforma de comércio eletrônico?
Sim, o IronPDF pode gerar faturas personalizadas dinamicamente, integrando dados em tempo real, o que o torna ideal para plataformas de comércio eletrônico.
Que tipos de aplicações se beneficiam da geração dinâmica de PDFs?
Aplicações como plataformas de comércio eletrônico, sistemas de relatórios e plataformas educacionais se beneficiam da geração dinâmica de PDFs, fornecendo documentos personalizados em tempo real.
O IronPDF é adequado para gerar relatórios em PDF com dados em tempo real?
Sem dúvida, o IronPDF foi projetado para gerar relatórios em PDF a partir de dados em tempo real, o que o torna perfeito para a geração dinâmica de documentos.
Como o IronPDF lida com as complexidades da renderização de PDFs?
O IronPDF abstrai as complexidades da renderização de PDFs, permitindo que os desenvolvedores se concentrem na lógica de negócios de seus aplicativos enquanto criam PDFs de alta qualidade.
O IronPDF consegue criar certificados educacionais dinamicamente?
Sim, o IronPDF pode gerar certificados educacionais dinamicamente, utilizando dados de entrada para criar certificados personalizados e com aparência profissional.
O IronPDF permite criar PDFs a partir de conteúdo HTML?
O IronPDF permite criar PDFs a partir de conteúdo HTML, possibilitando que desenvolvedores convertam páginas da web ou strings HTML diretamente para o formato PDF.
Como o IronPDF melhora a produtividade dos desenvolvedores?
O IronPDF melhora a produtividade dos desenvolvedores ao fornecer uma API simples para geração de PDFs, reduzindo o tempo e o esforço necessários para criar documentos dinâmicos.


