COMPARACIóN

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

Descripción general de NReco.PdfGenerator

NReco.PdfGenerator es una biblioteca de C# que convierte documentos HTML en PDF mediante la herramienta de línea de comandos wkhtmltopdf. Ofrece una API sencilla a través de su clase HtmlToPdfConverter , que llama a wkhtmltopdf para su renderizado.

La herramienta wkhtmltopdf utiliza WebKit Qt como motor de renderizado, una versión que data de alrededor de 2012. Aunque su uso es generalizado, el desarrollo de wkhtmltopdf cesó en 2020, dejándolo sin actualizaciones de seguridad ni nuevas funciones. Esto plantea desafíos para los equipos que desarrollan aplicaciones modernas con las necesidades actuales de CSS y JavaScript.

La versión gratuita de NReco.PdfGenerator incluye marcas de agua en los PDF generados, por lo que se necesita una licencia comercial para su uso en producción. Obtener precios para estas licencias implica contactar al departamento de ventas, lo que puede complicar los procesos de adquisición.

Introducción a 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 sirve como interfaz principal para la conversión de HTML a PDF y ofrece 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 principal diferencia entre estas bibliotecas radica en sus motores de renderizado, lo que afecta la seguridad y 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);
    }
}
$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");
    }
}
$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);
    }
}
$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");
    }
}
$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);
    }
}
$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");
    }
}
$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.

Mapeos de métodos básicos

NReco.PdfGeneratorIronPDF
nuevo HtmlToPdfConverter()<código>new ChromePdfRenderer()</código
<código>GenerarPdf(html)</código><código>RenderHtmlAsPdf(html)</código
<código>GeneratePdfFromFile(url, output)</código<código>RenderUrlAsPdf(url)</código
GenerarPdfDesdeArchivo(ruta, salida)<código>RenderHtmlFileAsPdf(ruta)</código
(no compatible)<código>RenderHtmlAsPdfAsync(html)</código

Asignaciones de propiedades de configuración

NReco.PdfGeneratorIronPDF
Orientación = PageOrientation.Landscape<código>RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape</código
Tamaño = TamañoPágina.A4<código>RenderingOptions.PaperSize = PdfPaperSize.A4</código
Margins.Top = 10<código>RenderingOptions.MarginTop = 10</código
Zoom = 0.9f<código>RenderingOptions.Zoom = 90</código
PageHeaderHtml = "..."<código>RenderingOptions.HtmlHeader</código
<código>PageFooterHtml = "..."</código<código>RenderingOptions.HtmlFooter</código

Diferencias de sintaxis de marcadores de posición

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

Comparación de compatibilidad asincrónica

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
$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");
$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 e implementación

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.

Cuando los equipos consideran migrar de NReco.PdfGenerator a IronPDF

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

Cumplimiento de seguridad: las organizaciones con requisitos de seguridad enfrentan desafíos cuando los escáneres de vulnerabilidad identifican CVE de wkhtmltopdf. 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 requieren CSS Grid, Flexbox, variables CSS u otras funciones CSS modernas no pueden usar el motor WebKit de wkhtmltopdf (versión 2012). Los diseñadores web suelen crear diseños que no se visualizan correctamente o que no se visualizan en NReco.PdfGenerator.

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

Arquitectura de aplicación asincrónica: las aplicaciones ASP.NET Core se benefician de la generación de PDF asincrónica para mantener la eficiencia del subproceso. La API de sólo sincronización de NReco.PdfGenerator puede crear cuellos de botella de escalabilidad.

Simplificación de la implementación: la gestión de binarios wkhtmltopdf específicos de la plataforma en entornos de desarrollo, preparación y producción agrega complejidad operativa. Los equipos buscan soluciones autónomas que simplifiquen las canalizaciones CI/CD.

Claridad en los precios: la planificación del presupuesto requiere costos 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";
$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>");
$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.

Tomando la decisión

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

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

ConsidereIronPDFsi: el cumplimiento de seguridad requiere abordar CVE de wkhtmltopdf, sus diseños usan características CSS modernas como Grid o Flexbox, necesita soporte async/await para aplicaciones web, desea simplificar la implementación eliminando 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.

Pensamientos finales

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.