Como migrar do gerador de PDF NReco para o IronPDF em C#
Por que migrar do Gerador de PDF NReco para o IronPDF?
Problemas críticos de segurança com o gerador de PDF NReco
O Gerador de PDF NReco utiliza o binário wkhtmltopdf, que está obsoleto, herdando todas as suas vulnerabilidades de segurança. Essa não é uma preocupação teórica — existem mais de 20 CVEs documentadas sem correções disponíveis desde que o wkhtmltopdf foi abandonado em 2020:
- CVE-2020-21365: Falsificação de solicitação do lado do servidor (SSRF)
- CVE-2022-35583: Leitura de arquivo local via injeção de HTML
- CVE-2022-35580: Potencial de execução remota de código
Essas vulnerabilidades não podem ser corrigidas porque o projeto subjacente wkhtmltopdf não recebe mais manutenção.
Limitações adicionais do gerador de PDF da NReco
-
Versão gratuita com marca d'água: O uso em produção requer uma licença paga com preços pouco transparentes, sendo necessário entrar em contato com o departamento de vendas.
-
Mecanismo de renderização obsoleto: WebKit Qt (por volta de 2012) oferece suporte limitado à web moderna:
- Sem CSS Grid ou Flexbox
- Sem JavaScript moderno (ES6+)
- Suporte limitado a fontes da web
- Sem variáveis CSS ou propriedades personalizadas
-
Dependência binária externa: Requer o gerenciamento de binários wkhtmltopdf por plataforma (
wkhtmltopdf.exe,wkhtmltox.dll). -
Sem desenvolvimento ativo: o wrapper recebe manutenção sem que o mecanismo subjacente seja atualizado.
- Suporte assíncrono limitado: a API síncrona bloqueia threads em aplicações web.
Comparação entre Gerador de PDF NReco e IronPDF
| Aspecto | Gerador de PDF NReco | IronPDF |
|---|---|---|
| Motor de renderização | WebKit Qt (2012) | Cromo (atual) |
| Segurança | Mais de 20 vulnerabilidades CVE, sem correções. | Atualizações de segurança ativas |
| Suporte a CSS | CSS2.1, CSS3 limitado | CSS3 completo, Grid, Flexbox |
| JavaScript | ES5 básico | ES6+ completo, async/await |
| Dependências | Binário wkhtmltopdf externo | Autossuficiente |
| Suporte assíncrono | Somente síncrono | assíncrono/await completo |
| Fontes da Web | Limitado | Fontes completas do Google, @font-face |
| Licenciamento | Preços pouco transparentes, entre em contato com o departamento de vendas. | Preços transparentes |
| Teste grátis | Com marca d'água | Funcionalidade completa |
Para equipes que planejam a adoção do .NET 10 e do C# 14 até 2025 e 2026, o IronPDF oferece uma base preparada para o futuro, com desenvolvimento ativo e recursos modernos de renderização.
Antes de começar
Pré-requisitos
- Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
- Licença do IronPDF : Obtenha sua chave de licença em IronPDF
Alterações no pacote NuGet
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf
Remova também os binários do wkhtmltopdf da sua instalação:
- Excluir
wkhtmltopdf.exe,wkhtmltox.dlldo projeto - Remova quaisquer scripts de instalação do wkhtmltopdf
- Excluir pastas binárias específicas da plataforma
Configuração de licença
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Identificar a utilização do gerador de PDF NReco
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
Referência completa da API
Mapeamentos de Classes Principais
| Gerador de PDF NReco | IronPDF |
|---|---|
HtmlToPdfConverter |
ChromePdfRenderer |
PageMargins |
Propriedades de margem individuais |
PageOrientation |
PdfPaperOrientation |
PageSize |
PdfPaperSize |
Mapeamentos de Métodos de Renderização
| Gerador de PDF NReco | IronPDF |
|---|---|
GeneratePdf(html) |
RenderHtmlAsPdf(html) |
GeneratePdfFromFile(url, output) |
RenderUrlAsPdf(url) |
GeneratePdfFromFile(htmlPath, output) |
RenderHtmlFileAsPdf(path) |
| (Assíncrono não suportado) | RenderHtmlAsPdfAsync(html) |
| (Assíncrono não suportado) | RenderUrlAsPdfAsync(url) |
Mapeamentos de configuração de página
| Gerador de PDF NReco | IronPDF |
|---|---|
PageWidth = 210 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
PageHeight = 297 |
RenderingOptions.SetCustomPaperSizeinMilimeters(w, h) |
Orientation = PageOrientation.Landscape |
RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
Size = PageSize.A4 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
Mapeamentos de Margem
| Gerador de PDF NReco | IronPDF |
|---|---|
Margins.Top = 10 |
RenderingOptions.MarginTop = 10 |
Margins.Bottom = 10 |
RenderingOptions.MarginBottom = 10 |
Margins.Left = 10 |
RenderingOptions.MarginLeft = 10 |
Margins.Right = 10 |
RenderingOptions.MarginRight = 10 |
new PageMargins { ... } |
Propriedades individuais |
Mapeamento de espaços reservados para cabeçalho/rodapé
| Gerador de PDF NReco (wkhtmltopdf) | IronPDF |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
Mapeamentos de tratamento de saída
| Gerador de PDF NReco | IronPDF |
|---|---|
byte[] pdfBytes = GeneratePdf(html) |
PdfDocument pdf = RenderHtmlAsPdf(html) |
File.WriteAllBytes(path, bytes) |
pdf.SaveAs(path) |
return pdfBytes |
return pdf.BinaryData |
new MemoryStream(pdfBytes) |
pdf.Stream |
Exemplos de migração de código
Exemplo 1: HTML básico para PDF
Antes (Gerador de PDF NReco):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("output.pdf", pdfBytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
A diferença fundamental reside no tipo de retorno e no padrão de salvamento. O gerador de PDF NReco HtmlToPdfConverter.GeneratePdf() retorna um byte[] que você deve gravar manualmente no disco usando File.WriteAllBytes(). O ChromePdfRenderer.RenderHtmlAsPdf() do IronPDF retorna um objeto PdfDocument com um método SaveAs() embutido.
Essa abordagem orientada a objetos oferece benefícios adicionais: você pode manipular o PDF (adicionar marcas d'água, mesclar documentos, adicionar segurança) antes de salvar. Se você precisar dos bytes brutos para compatibilidade com o código existente, use pdf.BinaryData. Consulte a documentação de conversão de HTML para PDF para obter opções de renderização adicionais.
Exemplo 2: Tamanho de página personalizado com margens
Antes (Gerador de PDF NReco):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
htmlToPdf.PageWidth = 210
htmlToPdf.PageHeight = 297
htmlToPdf.Margins = New PageMargins With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("custom-size.pdf", pdfBytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("custom-size.pdf")
End Sub
End Class
O gerador de PDF NReco usa dimensões numéricas (PageWidth = 210, PageHeight = 297) e um objeto PageMargins. O IronPDF usa a enumeração PdfPaperSize (que inclui tamanhos padrão como A4, Carta, Legal) e propriedades de margem individuais no objeto RenderingOptions.
As principais alterações de migração:
PageHeight→RenderingOptions.PaperSize = PdfPaperSize.A4new PageMargins { Top = 10, ... }→ Individual properties:RenderingOptions.MarginTop = 10
Para tamanhos de papel personalizados não cobertos pela enumeração, use RenderingOptions.SetCustomPaperSizeinMilimeters(width, height). Saiba mais sobre as opções de configuração da página .
Exemplo 3: Conversão de URL para PDF
Antes (Gerador de PDF NReco):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf As New HtmlToPdfConverter()
Dim pdfBytes As Byte() = htmlToPdf.GeneratePdfFromFile("https://www.example.com", Nothing)
File.WriteAllBytes("webpage.pdf", pdfBytes)
End Sub
End Class
Após (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
O gerador de PDF NReco usa o método com nome confuso GeneratePdfFromFile() tanto para arquivos locais quanto para URLs, com um segundo parâmetro que pode ser nulo. O IronPDF fornece métodos dedicados: RenderUrlAsPdf() para URLs e RenderHtmlFileAsPdf() para arquivos HTML locais.
A abordagem do IronPDF é mais limpa e intuitiva. Para aplicações web assíncronas, use await renderer.RenderUrlAsPdfAsync(url) para evitar o bloqueio de threads — algo que o Gerador de PDF NReco simplesmente não consegue fazer.
Notas críticas sobre migração
Conversão de valor de zoom
O gerador de PDF NReco usa valores de ponto flutuante (0,0-2,0), enquanto o IronPDF usa números inteiros percentuais:
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
' NReco PDF Generator: Zoom = 0.9F (90%)
' IronPDF: Zoom = 90
' Conversion formula:
Dim ironPdfZoom As Integer = CInt(nrecoZoom * 100)
Atualização de sintaxe do marcador de posição
Todos os espaços reservados para cabeçalho/rodapé devem ser atualizados:
| Gerador de PDF NReco | IronPDF |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[title] |
{html-title} |
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
Imports NReco.PdfGenerator
Imports IronPdf
' NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>"
' IronPDF:
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div>Page {page} of {total-pages}</div>",
.MaxHeight = 20
}
Alteração do tipo de retorno
O gerador de PDF NReco retorna byte[] diretamente; IronPDF retorna PdfDocument:
// Gerador de PDF NReco pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
// Gerador de PDF NReco pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
' Gerador de PDF NReco pattern:
Dim pdfBytes As Byte() = converter.GeneratePdf(html)
File.WriteAllBytes("output.pdf", pdfBytes)
' IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
Segurança e reutilização de roscas
O Gerador de PDF NReco normalmente cria um novo conversor a cada chamada. O ChromePdfRenderer do IronPDF é thread-safe e pode ser reutilizado:
// Gerador de PDF NReco pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
// IronPDF pattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Gerador de PDF NReco pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
// IronPDF pattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
Imports NReco.PdfGenerator
Imports IronPdf
' Gerador de PDF NReco pattern (creates new each time):
Public Function Generate(html As String) As Byte()
Dim converter As New HtmlToPdfConverter()
Return converter.GeneratePdf(html)
End Function
' IronPDF pattern (reuse renderer, thread-safe):
Private ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
Suporte assíncrono (Nova funcionalidade)
O IronPDF oferece suporte a padrões assíncronos/await que o Gerador de PDF NReco não consegue fornecer:
// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports System.Threading.Tasks
' NReco PDF Generator: No async support available
' IronPDF: Full async support
Public Async Function GenerateAsync(html As String) As Task(Of Byte())
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
Solução de problemas
Problema 1: Conversor HtmlToPdf não encontrado
Problema: a classe HtmlToPdfConverter não existe no IronPDF.
Solução: Use ChromePdfRenderer:
// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
' NReco PDF Generator
Dim converter As New HtmlToPdfConverter()
' IronPDF
Dim renderer As New ChromePdfRenderer()
Problema 2: GeneratePdf retorna tipo incorreto
Problema: O código espera byte[] mas recebe PdfDocument.
Solução: Acesse a propriedade .BinaryData:
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
' NReco PDF Generator
Dim pdfBytes As Byte() = converter.GeneratePdf(html)
' IronPDF
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
Problema 3: Objeto PageMargins não encontrado
Problema: a classe PageMargins não existe no IronPDF.
Solução: Utilize propriedades de margem individuais:
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
' NReco PDF Generator
converter.Margins = New PageMargins With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
' IronPDF
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
Problema 4: Números de página não aparecem
Problema: os marcadores [page] e [topage] não funcionam.
Solução: Atualize para a sintaxe de marcador de posição do IronPDF :
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
Imports NReco.PdfGenerator
Imports IronPdf
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>"
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div>Page {page} of {total-pages}</div>",
.MaxHeight = 20
}
Lista de verificação para migração
Pré-migração
- Inventariar todos os usos de
NReco.PdfGeneratorna base de código - Documente todos os valores
CustomWkHtmlArgseCustomWkHtmlPageArgs - Listar todos os modelos HTML de cabeçalho/rodapé com espaços reservados
- Identificar requisitos assíncronos (controladores web, serviços)
- Analise as configurações de zoom e margem.
- Faça backup das saídas em PDF existentes para comparação.
- Obtenha a chave de licença do IronPDF
Alterações no pacote
- Remover o pacote NuGet
NReco.PdfGenerator - Instale o pacote NuGet
IronPdf:dotnet add package IronPdf - Atualizar importações de namespace de
using NReco.PdfGenerator;parausing IronPdf;
Alterações no código
- Adicionar configuração de chave de licença na inicialização
- Substitua
HtmlToPdfConverterporChromePdfRenderer - Substitua
GeneratePdf(html)porRenderHtmlAsPdf(html) - Substitua
GeneratePdfFromFile(url, null)porRenderUrlAsPdf(url) - Converter o objeto
PageMarginsem propriedades de margem individuais - Atualizar valores de zoom de ponto flutuante para porcentagem
- Atualizar a sintaxe do marcador de posição:
[page]→{page},[topage]→{total-pages} - Substitua
File.WriteAllBytes()porpdf.SaveAs() - Converter chamadas síncronas em assíncronas sempre que for vantajoso.
Pós-migração
- Remover os binários do wkhtmltopdf do projeto/implantação
- Atualize os arquivos Docker para remover a instalação do wkhtmltopdf
- Execute testes de regressão comparando a saída em PDF.
- Verifique se os espaços reservados para cabeçalho/rodapé estão sendo exibidos corretamente.
- Testar em todas as plataformas alvo (Windows, Linux, macOS)
- Atualizar o pipeline de CI/CD para remover as etapas do wkhtmltopdf
- Atualize a verificação de segurança para confirmar a remoção da CVE.

