COMPARACIóN

NReco.PdfGenerator vs IronPDF: Guía de comparación técnica

NReco.PdfGenerator vs IronPDF: Comparando wkhtmltopdf Wrapper con el moderno motor Chromium

Cuando los desarrolladores .NET necesitan convertir contenido HTML en documentos PDF, a menudo se encuentran con NReco.PdfGenerator, un popular envoltorio alrededor del binario wkhtmltopdf. Sin embargo, la tecnología subyacente conlleva importantes problemas de seguridad y compatibilidad que llevan a muchos equipos a evaluar alternativas como IronPDF. Esta comparación examina ambas bibliotecas en dimensiones técnicas clave para ayudar a los desarrolladores, arquitectos y responsables técnicos a seleccionar la herramienta adecuada para sus flujos de trabajo de generación de PDF.

¿Qué es NReco.PdfGenerator?

NReco.PdfGenerator es una biblioteca de C# diseñada para convertir documentos HTML en PDF envolviendo la herramienta de línea de comandos wkhtmltopdf. La biblioteca proporciona una API familiar a través de su clase HtmlToPdfConverter, que invoca internamente a wkhtmltopdf para realizar el renderizado real.

La herramienta wkhtmltopdf utiliza WebKit Qt como motor de renderizado, una versión de WebKit que data aproximadamente de 2012. Aunque este enfoque ha sido ampliamente adoptado, el desarrollo de wkhtmltopdf se detuvo en 2020, lo que significa que no hay más parches de seguridad o actualizaciones de características disponibles. Esta dependencia crea retos para los equipos que crean aplicaciones modernas con los requisitos actuales de CSS y JavaScript.

La versión gratuita de NReco.PdfGenerator añade marcas de agua a los PDF generados, por lo que se requiere una licencia comercial para su uso en producción. El precio de las licencias comerciales requiere ponerse en contacto con el departamento de ventas, lo que puede complicar los procesos de adquisición.

¿Qué es IronPDF?

IronPDF es una biblioteca .NET que utiliza un moderno motor de renderizado basado en Chromium para convertir HTML, CSS y JavaScript en documentos PDF. La clase ChromePdfRenderer proporciona la interfaz principal para la conversión de HTML a PDF, con amplias opciones de configuración a través de la propiedad RenderingOptions.

A diferencia de las envolturas wkhtmltopdf, el motor de renderizado deIronPDFrecibe actualizaciones periódicas de seguridad y compatibilidad. La biblioteca es autónoma, lo que elimina la necesidad de gestionar dependencias binarias externas en diferentes plataformas.

IronPDF ofrece un periodo de prueba con funcionalidad completa (sin marcas de agua), lo que permite a los equipos evaluar las capacidades antes de comprar. Las licencias comerciales utilizan precios publicados y transparentes.

Comparación de motores de renderizado

La diferencia fundamental entre estas bibliotecas radica en sus motores de renderizado. Esta distinción afecta a todos los aspectos, desde la postura de seguridad hasta la compatibilidad con CSS.

AspectoNReco.PdfGeneratorIronPDF
Motor de renderizadoWebKit Qt (2012)Chromium (actual)
Seguridadmás de 20 CVE abandonadosActualizaciones de seguridad activas
Soporte CSSCSS2.1, CSS3 limitadoCSS3 completo, Grid, Flexbox
JavaScriptES5 básicoES6+ completo
DependenciasBinario externo wkhtmltopdfAutocontenido
Soporte AsyncSólo sincrónicoAsync/await completo
Fuentes webLimitadoFuentes Google completas, @font-face
Prueba gratuitaMarca de aguaFuncionalidad completa
Transparencia de preciosOpacidad, póngase en contacto con ventasPrecios publicados

NReco.PdfGenerator hereda todas las vulnerabilidades de seguridad de wkhtmltopdf, incluidos los CVE documentados para la falsificación de solicitudes del lado del servidor, las vulnerabilidades de lectura local de archivos y la posible ejecución remota de código. Con wkhtmltopdf abandonado desde 2020, no hay parches disponibles para estos problemas.

El motor Chromium deIronPDFes compatible con los estándares web actuales y permite funciones CSS modernas, como los diseños Grid y Flexbox, las variables CSS y las propiedades personalizadas. La ejecución de JavaScript es compatible con la sintaxis ES6+, incluidos los patrones async/await.

Conversión básica de HTML a PDF

Ambas bibliotecas manejan la conversión básica de HTML a PDF, aunque con diferentes patrones de API.

Enfoque de NReco.PdfGenerator:

// 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Enfoque 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ambas bibliotecas requieren un código mínimo para las conversiones básicas. NReco.PdfGenerator devuelve una matriz byte[] que requiere operaciones de archivo manuales, mientras queIronPDFdevuelve un objeto PdfDocument con métodos prácticos como SaveAs(). El objetoIronPDFtambién proporciona acceso a BinaryData para acceder a matrices de bytes y a Stream para operaciones basadas en secuencias.

Para los desarrolladores familiarizados con el flujo de trabajo de conversión de HTML a PDF, la API deIronPDFresultará intuitiva y proporcionará funciones adicionales más allá de la conversión básica.

Conversión de URL a PDF

La conversión de páginas web a documentos PDF revela diferencias de API en la nomenclatura y la semántica de los métodos.

Conversión de URL de NReco.PdfGenerator:

// 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Conversión de URL de 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

NReco.PdfGenerator utiliza GeneratePdfFromFile() tanto para las rutas de archivo como para las URL, lo que puede resultar confuso desde el punto de vista semántico.IronPDFproporciona un método RenderUrlAsPdf dedicado que indica claramente la operación que se está realizando.

Tamaño de página y márgenes personalizados

Los documentos profesionales suelen requerir dimensiones de página y configuraciones de márgenes específicas. Ambas bibliotecas admiten estas personalizaciones con diferentes patrones de configuración.

Configuración de la página NReco.PdfGenerator:

// 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Configuración de páginas 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

NReco.PdfGenerator requiere especificar las dimensiones de la página en milímetros (210×297 para A4) y utiliza un objeto PageMargins.IronPDFutiliza el enum PdfPaperSize para los tamaños estándar y proporciona propiedades de margen individuales a través de RenderingOptions. La clase RenderingOptions centraliza toda la configuración de la página, haciendo que los ajustes se puedan encontrar a través del autocompletado del IDE.

Referencia de mapeo de API

Para los equipos que estén considerando la migración de NReco.PdfGenerator a IronPDF, la comprensión de los mapeos de API ayuda a estimar el esfuerzo y planificar la transición.

Métodos principales

NReco.PdfGeneratorIronPDFNotas
nuevo HtmlToPdfConverter()<código>new ChromePdfRenderer()</códigoRenderizador principal
<código>GenerarPdf(html)</código><código>RenderHtmlAsPdf(html)</códigoDevuelve PdfDocument
<código>GeneratePdfFromFile(url, output)</código<código>RenderUrlAsPdf(url)</códigoSoporte directo de URL
GenerarPdfDesdeArchivo(ruta, salida)<código>RenderHtmlFileAsPdf(ruta)</códigoRuta del archivo
(no compatible)<código>RenderHtmlAsPdfAsync(html)</códigoVersión asíncrona

Mapeo de propiedades de configuración

NReco.PdfGeneratorIronPDFNotas
Orientación = PageOrientation.Landscape<código>RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape</códigoOrientación
Tamaño = TamañoPágina.A4<código>RenderingOptions.PaperSize = PdfPaperSize.A4</códigoTamaño del papel
Margins.Top = 10<código>RenderingOptions.MarginTop = 10</códigoPropiedades individuales
Zoom = 0.9f<código>RenderingOptions.Zoom = 90</códigoFlotante a porcentaje
PageHeaderHtml = "..."<código>RenderingOptions.HtmlHeader</códigoObjeto HtmlHeaderFooter
<código>PageFooterHtml = "..."</código<código>RenderingOptions.HtmlFooter</códigoObjeto HtmlHeaderFooter

Diferencias en la sintaxis de los marcadores

Los encabezados y pies de página suelen incluir contenido dinámico, como números de página. La sintaxis de los marcadores de posición varía de una biblioteca a otra:

NReco.PdfGeneratorIronPDFObjetivo
<código>[página]</código>{page}Número de página actual
[topage]{total de páginas}Número total de páginas
<código>[fecha]</código>{fecha}Fecha actual
<código>[tiempo]</código>{time}Horario actual
<código>[título]</código>{html-title}Título del documento
<código>[página web]</código>{url}URL de origen

Los equipos que migren desde NReco.PdfGenerator deben actualizar todas las plantillas de encabezado y pie de página con la nueva sintaxis de marcador de posición.

Conversión de valores de zoom

NReco.PdfGenerator utiliza valores flotantes (0,0-2,0) para el zoom, mientras queIronPDFutiliza valores porcentuales:

// NReco: Zoom = 0.75f means 75%
// IronPDF: Zoom = 75 means 75%
int ironPdfZoom = (int)(nrecoZoom * 100);
// NReco: Zoom = 0.75f means 75%
// IronPDF: Zoom = 75 means 75%
int ironPdfZoom = (int)(nrecoZoom * 100);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Comparación de compatibilidad con Async

Las aplicaciones web modernas se benefician de operaciones asíncronas que no bloquean hilos. Esto es especialmente importante en las aplicaciones ASP.NET Core que manejan solicitudes concurrentes.

NReco.PdfGenerator proporciona operaciones sólo sincrónicas, que pueden bloquear hilos del servidor web durante la generación de PDF:

// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html);  // Blocks thread
// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html);  // Blocks thread
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF es compatible con todos los patrones async/await:

//IronPDF- async support
var pdf = await renderer.RenderHtmlAsPdfAsync(html);  // Non-blocking
await pdf.SaveAsAsync("output.pdf");
//IronPDF- async support
var pdf = await renderer.RenderHtmlAsPdfAsync(html);  // Non-blocking
await pdf.SaveAsAsync("output.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Para las aplicaciones que generan archivos PDF en respuesta a solicitudes HTTP, la compatibilidad asíncrona deIronPDFmejora la escalabilidad liberando subprocesos durante el proceso de renderización.

Diferencias de dependencia y despliegue

NReco.PdfGenerator requiere que el binario wkhtmltopdf esté disponible en el sistema. Esto plantea retos de despliegue:

  • Deben gestionarse los binarios específicos de cada plataforma (Windows .exe, Linux .so, macOS .dylib)
  • Las imágenes Docker requieren la instalación de wkhtmltopdf
  • Las canalizaciones CI/CD necesitan pasos de aprovisionamiento binario
  • Los escáneres de seguridad marcan los CVE conocidos

IronPDF es un paquete NuGet independiente:

#IronPDFinstallation - complete
dotnet add package IronPdf

# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform
#IronPDFinstallation - complete
dotnet add package IronPdf

# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform
SHELL

Los equipos que migren desde NReco.PdfGenerator pueden eliminar los binarios wkhtmltopdf y simplificar su proceso de despliegue.

Cuándo los equipos consideran cambiar de NReco.PdfGenerator a IronPDF

Varios factores llevan a los equipos a evaluarIronPDFcomo alternativa a NReco.PdfGenerator:

Cumplimiento de la seguridad: Las organizaciones con requisitos de seguridad se enfrentan a desafíos cuando los escáneres de vulnerabilidades identifican wkhtmltopdf CVEs. Dado que wkhtmltopdf está abandonado, estas vulnerabilidades no tienen ruta de remediación dentro de NReco.PdfGenerator. El motor Chromium deIronPDFse mantiene activamente y recibe actualizaciones de seguridad.

Requisitos CSS modernos: Los proyectos que requieran CSS Grid, Flexbox, variables CSS u otras características CSS modernas no pueden utilizar el motor WebKit de la era 2012 de wkhtmltopdf. Los diseñadores web a menudo producen diseños que no se muestran correctamente o no se muestran en absoluto en NReco.PdfGenerator.

Compatibilidad con JavaScript: Las aplicaciones que generan PDF con contenido renderizado en JavaScript (gráficos, tablas dinámicas, valores calculados) necesitan una compatibilidad moderna con JavaScript. la limitación ES5 de wkhtmltopdf impide el uso de bibliotecas JavaScript contemporáneas.

Arquitectura de aplicaciones asíncronas: Las aplicaciones ASP.NET Core se benefician de la generación asíncrona de PDF para mantener la eficiencia de los hilos. La API de sólo sincronización de NReco.PdfGenerator puede crear cuellos de botella de escalabilidad.

Simplificación del despliegue: La gestión de los binarios wkhtmltopdf específicos de cada plataforma en los entornos de desarrollo, preparación y producción añade complejidad operativa. Los equipos buscan soluciones autónomas que simplifiquen las canalizaciones CI/CD.

Claridad de precios: La planificación presupuestaria requiere costes predecibles. Los precios opacos de NReco.PdfGenerator (póngase en contacto con el departamento de ventas) complican la adquisición, mientras que los precios publicados deIronPDFpermiten elaborar presupuestos sin complicaciones.

Comparación de instalaciones

Instalación de NReco.PdfGenerator:

Install-Package NReco.PdfGenerator
Install-Package NReco.PdfGenerator
SHELL

Plus instalación y gestión de binarios wkhtmltopdf específicos para cada plataforma.

Instalación de IronPDF:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPDF requiere la configuración de una clave de licencia al iniciar la aplicación:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ambas bibliotecas son compatibles con .NET Framework 4.6.2+ y .NET Core/.NET 5+, lo que las hace compatibles con el desarrollo .NET moderno orientado a .NET 10 y C# 14.

Consideraciones sobre el rendimiento

El motor Chromium deIronPDFtiene un coste de inicialización en el primer uso (aproximadamente 1,5 segundos para el arranque de Chromium). Las versiones posteriores son significativamente más rápidas. En el caso de las aplicaciones con requisitos de inicio sensibles a la latencia, el calentamiento del renderizador en la inicialización de la aplicación evita que este retraso afecte a las operaciones de cara al usuario:

// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

NReco.PdfGenerator también tiene una sobrecarga de inicialización al generar el proceso wkhtmltopdf, además de una sobrecarga continua de memoria debido a la gestión de procesos externos.

Tomar la decisión

La elección entre NReco.PdfGenerator yIronPDFdepende de sus necesidades específicas:

Considere NReco.PdfGenerator si: Dispone de flujos de trabajo basados en wkhtmltopdf que funcionan correctamente, los resultados del escáner de seguridad son aceptables en su entorno, no necesita funciones CSS o JavaScript modernas y puede gestionar la implementación binaria específica de la plataforma.

ConsidereIronPDFsi: El cumplimiento de seguridad requiere abordar CVEs wkhtmltopdf, sus diseños utilizan características CSS modernas como Grid o Flexbox, necesita soporte async/await para aplicaciones web, desea simplificar el despliegue mediante la eliminación de binarios externos, o prefiere licencias y precios transparentes.

Para los equipos que crean aplicaciones .NET modernas en 2025 y planifican para 2026, el motor Chromium de IronPDF, que se mantiene activamente, proporciona una base para la compatibilidad con los estándares web actuales y futuros.

Introducción a IronPDF

Para evaluarIronPDFpara sus necesidades de generación de PDF:

  1. Instale el paquete IronPDF NuGet: Install-Package IronPdf
  2. Revise el tutorial HTML a PDF para conocer los patrones básicos de conversión
  3. Explorar Conversión de URL a PDF para la captura de páginas web
  4. Configurar encabezados y pies de página para documentos profesionales

Los tutoriales de IronPDF proporcionan ejemplos completos de situaciones habituales, y la Referencia API documenta todas las clases y métodos disponibles.

Conclusión

NReco.PdfGenerator yIronPDFrepresentan distintas eras de la tecnología de generación de PDF. NReco.PdfGenerator envuelve el motor WebKit 2012 de wkhtmltopdf, manteniendo tanto su API familiar como sus vulnerabilidades de seguridad y limitaciones de renderizado.IronPDFutiliza un moderno motor Chromium con mantenimiento activo, compatibilidad con los estándares web actuales y capacidades asíncronas.

Para los equipos preocupados por el cumplimiento de las normas de seguridad, los requisitos modernos de CSS/JavaScript o la complejidad de la implantación,IronPDFofrece un camino a seguir sin la deuda técnica de las dependencias abandonadas. La transición requiere actualizar las llamadas a la API y la sintaxis de los marcadores de posición, pero elimina la necesidad de gestionar binarios externos y aborda las vulnerabilidades de seguridad documentadas.

Evalúe ambas opciones en función de sus requisitos específicos de seguridad, fidelidad de representación, compatibilidad con async y simplicidad de despliegue. Comprender las diferencias arquitectónicas descritas en esta comparación le ayudará a tomar una decisión informada que se ajuste a sus necesidades de generación de PDF y a sus objetivos de modernización.