IRONSOFTWAREHOME
VÍDEOS

Como converter RTF para PDF usando C#

Curtis Chau
Curtis Chau
Updated: 19 de julho de 2026

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 da NReco envolve o binário wkhtmltopdf, herdando suas conhecidas vulnerabilidades de segurança. O último lançamento estável do projeto wkhtmltopdf foi o 0.12.6 (Junho de 2020) e o repositório upstream foi arquivado em 2 de janeiro de 2023, então não virão patches:

  • CVE-2020-21365: Travessia de diretório / leitura de arquivo local via HTML construído (fraqueza da mesma política de origem)
  • CVE-2022-35583: Server-side request forgery (SSRF) via injected <iframe> in 0.12.6 (CVSS 9.8)

Limitações adicionais do gerador de PDF da NReco

  1. Atrito de Licenciamento em Escala: Gratuito para implantações de produção de um único servidor não-SaaS; Cenários de SaaS, multi-servidor ou de redistribuição exigem o pacote de código-fonte empresarial de $199 do nrecosite.com.

  2. Motor de Renderização Obsoleto: WebKit Qt (cerca de 2012) com suporte CSS3/JS limitado:

    • Sem CSS Grid ou Flexbox
    • SemJavaScriptmoderno (ES6+)
    • Suporte limitado a fontes da web
    • Sem variáveis ​​CSS ou propriedades personalizadas
  3. Dependência Binária Externa: Requer gerenciamento dos binários wkhtmltopdf por plataforma (wkhtmltopdf.exe, wkhtmltox.dll).

  4. Manutenção Parada: O NReco.PdfGenerator 1.2.1 foi publicado em 8 de janeiro de 2023 e não teve mais lançamentos no nuget.org; o motor wkhtmltopdf subjacente não é mais 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

AspectoGerador de PDF NRecoIronPDF
Motor de renderizaçãoWebKit Qt (2012)Cromo (atual)
SegurançaVárias CVEs não corrigidas (por exemplo, CVE-2020-21365, CVE-2022-35583); motor arquivado em 2 de janeiro de 2023Atualizações de segurança ativas
Suporte a CSSCSS2.1, CSS3 limitadoCSS3 completo, Grid, Flexbox
JavaScriptES5 básicoES6+ completo, async/await
DependênciasBinário wkhtmltopdf externoAutossuficiente
Suporte assíncronoSomente síncronoassíncrono/await completo
Fontes da WebLimitadoFontes completas do Google, @font-face
LicenciamentoGratuito para servidor único não-SaaS; $199 pacote empresarial para SaaS / multi-servidorPreços comerciais transparentes
Nível gratuitoGratuito sob licença de servidor único não-SaaSTeste não requer marca d'água

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
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";

Identificar a utilização do gerador de PDF NReco

# 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 NRecoIronPDF
HtmlToPdfConverterChromePdfRenderer
PageMarginsPropriedades de margem individuais
PageOrientationPdfPaperOrientation
PageSizePdfPaperSize

Mapeamentos de Métodos de Renderização

Gerador de PDF NRecoIronPDF
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 NRecoIronPDF
PageWidth = 210RenderingOptions.PaperSize = PdfPaperSize.A4
PageHeight = 297RenderingOptions.SetCustomPaperSizeinMilimeters(w, h)
Orientation = PageOrientation.LandscapeRenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Size = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4

Mapeamentos de Margem

Gerador de PDF NRecoIronPDF
Margins.Top = 10RenderingOptions.MarginTop = 10
Margins.Bottom = 10RenderingOptions.MarginBottom = 10
Margins.Left = 10RenderingOptions.MarginLeft = 10
Margins.Right = 10RenderingOptions.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 NRecoIronPDF
byte[] pdfBytes = GeneratePdf(html)PdfDocument pdf = RenderHtmlAsPdf(html)
File.WriteAllBytes(path, bytes)pdf.SaveAs(path)
return pdfBytesreturn pdf.BinaryData
new MemoryStream(pdfBytes)new MemoryStream(pdf.BinaryData)

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);
    }
}

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");
    }
}

A diferença fundamental reside no tipo de retorno e no padrão de salvamento. O HtmlToPdfConverter.GeneratePdf() do Gerador de PDF NReco 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 embutido SaveAs().

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);
    }
}

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");
    }
}

O Gerador de PDF NReco usa dimensões numéricas (PageWidth = 210, PageHeight = 297) e um objeto PageMargins. O IronPDF usa o enum 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 pelo enum, 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);
    }
}

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");
    }
}

O Gerador de PDF NReco usa o método confusamente nomeado GeneratePdfFromFile() tanto para arquivos locais quanto para URLs, com um segundo parâmetro anulável. O IronPDF fornece métodos dedicados: RenderUrlAsPdf() para URLs e RenderHtmlFileAsPdf() para arquivos HTML locais.

A abordagem do IronPDF é mais limpa e mais intuitiva. Para aplicações web assíncronas, use await renderer.RenderUrlAsPdfAsync(url) para evitar bloquear threads - algo que o Gerador de PDF NReco simplesmente não pode 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);

Atualização de sintaxe do marcador de posição

Todos os espaços reservados para cabeçalho/rodapé devem ser atualizados:

Gerador de PDF NRecoIronPDF
[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
};

Alteração do tipo de retorno

O Gerador de PDF NReco retorna byte[] diretamente; O 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;
C#

Segurança e reutilização de roscas

O Gerador de PDF NReco normalmente cria um novo conversor a cada chamada. O ChromePdfRenderer do IronPDF é seguro para threads 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;
}
C#

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;
}

Solução de problemas

Problema 1: Conversor HtmlToPdf não encontrado

Problem: HtmlToPdfConverter class doesn't exist in IronPDF.

Solution: Use ChromePdfRenderer:

// NReco PDF Generator
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = 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;

Problema 3: Objeto PageMargins não encontrado

Problem: PageMargins class doesn't exist in 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;

Problema 4: Números de página não aparecem

Problema: Os placeholders [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
};

Lista de verificação para migração

Pré-migração

  • Inventariar todos os usos de NReco.PdfGenerator no código
  • Documentar todos os valores de 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
  • Instalar 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
  • Substituir HtmlToPdfConverter por ChromePdfRenderer
  • Substituir GeneratePdf(html) por RenderHtmlAsPdf(html)
  • Substituir GeneratePdfFromFile(url, null) por RenderUrlAsPdf(url)
  • Converter objeto PageMargins para propriedades de margem individuais
  • Atualizar valores de zoom de ponto flutuante para porcentagem
  • Atualizar a sintaxe do placeholder: [page]{page}, [topage]{total-pages}
  • Substituir 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.

Observe: NReco e wkhtmltopdf são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado por NReco ou wkhtmltopdf. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
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 bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.