Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

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

  1. 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.

  2. 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
  3. Dependência binária externa: Requer o gerenciamento de binários wkhtmltopdf por plataforma (wkhtmltopdf.exe, wkhtmltox.dll).

  4. Sem desenvolvimento ativo: o wrapper recebe manutenção sem que o mecanismo subjacente seja atualizado.

  5. 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

  1. Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
  3. 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
SHELL

Remova também os binários do wkhtmltopdf da sua instalação:

  • Excluir wkhtmltopdf.exe, wkhtmltox.dll do 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"
$vbLabelText   $csharpLabel

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" .
SHELL

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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:

  • PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • new 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
}
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
}
$vbLabelText   $csharpLabel

Lista de verificação para migração

Pré-migração

  • Inventariar todos os usos de NReco.PdfGenerator na base de código
  • Documente todos os valores CustomWkHtmlArgs e CustomWkHtmlPageArgs
  • 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; para using IronPdf;

Alterações no código

  • Adicionar configuração de chave de licença na inicialização
  • Substitua HtmlToPdfConverter por ChromePdfRenderer
  • Substitua GeneratePdf(html) por RenderHtmlAsPdf(html)
  • Substitua GeneratePdfFromFile(url, null) por RenderUrlAsPdf(url)
  • Converter o objeto PageMargins em 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() por pdf.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.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim