COMPARACIóN

Los costes ocultos de las bibliotecas PDF gratuitas en C#

Los desarrolladores que busquen "biblioteca PDF gratuita C#" encontrarán docenas de paquetes NuGet que parecen resolver su problema a coste cero. En la práctica, todas las opciones "gratuitas" en el espacio PDF de .NET conllevan limitaciones que aparecen después de que haya comenzado el desarrollo: divulgación del código fuente AGPL, falta de compatibilidad con HTML, dependencias abandonadas con CVE sin parchear o umbrales de ingresos que activan la concesión obligatoria de licencias. Este artículo documenta esas limitaciones con pruebas concretas para que puedas evaluar el coste real antes de comprometerte.

Qué significa "gratis" en el ecosistema .NET PDF

La palabra "libre" corresponde a cinco modelos de licencia distintos en este ámbito, y confundirlos crea un verdadero riesgo jurídico y técnico:

MIT/Apache (genuinamente permisiva): PdfSharputiliza la licencia MIT. Sin restricciones de ingresos, sin copyleft, sin requisitos de divulgación. Se puede enviar en software comercial sin condiciones. El compromiso es la capacidad, no la licencia.

AGPL (código abierto con dientes): iTextSharp(iText Core) utiliza la AGPL. Si su aplicación es accesible a través de una red -lo que incluye cualquier aplicación web, API y producto SaaS-, debe publicar todo el código fuente de su aplicación bajo la licencia AGPL. No sólo el código de generación de PDF. Su lógica de negocio propietaria, su sistema de autenticación, todo.

Licencia comunitaria de ingresos limitados: La Licencia Comunitaria de QuestPDF cubre empresas con ingresos brutos anuales inferiores a 1 millón de dólares. Traspase ese umbral y será obligatoria una licencia comercial, independientemente de cuánto utilice realmente QuestPDF.

Abandonado y sin mantenimiento: wkhtmltopdf y sus envoltorios .NET (DinkToPdf, NReco.PdfGenerator) no tienen desarrollo activo. La organización GitHub se archivó en julio de 2024. Las CVE conocidas nunca se parchearán.

Gratis pero caro operativamente: Puppeteer Sharp y Playwright tienen licencia MIT, pero requieren gestionar procesos externos del navegador - descargas, agrupación de procesos, monitorización de fugas de memoria, recuperación de fallos. El coste de la infraestructura puede superar el de una licencia comercial.

iTextSharpy la trampa de la AGPL

iTextSharp es uno de los paquetes PDF más descargados de NuGet, con aproximadamente 30 millones de descargas. Muchos desarrolladores lo instalan asumiendo que su uso comercial es gratuito. No lo es.

La realidad de las licencias

En 2009, iText pasó de LGPL a AGPL. En virtud de la AGPL, la implementación de iText en cualquier aplicación accesible a través de la red requiere la publicación de todo el código fuente de la aplicación bajo los términos de la AGPL. la propia documentación de iText afirma: "No puede desplegarlo en una red sin revelar el código fuente completo de sus propias aplicaciones bajo la licencia AGPL"

Esto no es teórico. Se aplica a su aplicación web, a sus herramientas internas expuestas a través de una red, a su producto SaaS y a los proyectos de sus clientes.

Aplicación activa

iText y su empresa matriz Apryse persiguen el cumplimiento de las licencias de forma agresiva. Un análisis de septiembre de 2025 de Beeman & Muchmore documentó el patrón de aplicación, señalando que la empresa "realizó una campaña de contratación en su departamento de cumplimiento de licencias en la época de su cambio de marca de febrero de 2023" El bufete de abogados caracterizó estas prácticas como similares al trolling de patentes, es decir, empresas que "se apoderan de carteras de patentes y las hacen valer indiscriminadamente a cambio de costes de defensa/acuerdos por molestias"

la propia iText ha reconocido esta postura, afirmando que rara vez es necesario emprender acciones legales porque "las personas implicadas entendieron que no les interesaba ser demandadas."

Algunos desarrolladores prueban iTextSharp4.1.6, liberado bajo LGPL. Las FAQ de iText tratan explícitamente este tema: esas versiones están al final de su vida útil, sin parches de seguridad, y la API es anterior a los requisitos modernos de PDF.

Cuánto cuestan las licencias comerciales

Para las empresas que no pueden cumplir con la AGPL, iText ofrece licencias comerciales. A partir de 2024, iText pasó a ofrecer licencias por suscripción, alejándose de los modelos perpetuos. No se publican los precios. Póngase en contacto con el departamento de ventas para obtener un presupuesto. Los datos de terceros procedentes de Vendr sugieren que los costes oscilan entre 15.000 y 210.000 dólares anuales, en función del volumen de uso.

Compárelo con la licencia perpetua de IronPDF a partir de 749 dólares, con precios publicados en el sitio web y sin necesidad de suscripción anual para un uso continuado.

Qué produce realmente el renderizado HTML de iText

El complemento pdfHTML no utiliza un motor de navegador. Esto es lo que ocurre cuando se prueba el CSS moderno:

using iText.Html2pdf;
using iText.Kernel.Pdf;

// This HTML uses CSS Flexbox — a standard layout technique since 2015
string html = @"
<html><head><style>
    .container { display: flex; gap: 20px; justify-content: space-between; }
    .card { flex: 1; padding: 15px; border: 1px solid #ccc; border-radius: 8px; }
</style></head>
<body>
    <div class='container'>
        <div class='card'>Revenue: $1.2M</div>
        <div class='card'>Expenses: $890K</div>
        <div class='card'>Profit: $310K</div>
    </div>
</body></html>";

using var writer = new PdfWriter("itext-output.pdf");
using var pdf = new PdfDocument(writer);
// Result: three cards stacked vertically, no flex layout applied
// The gap, border-radius, and justify-content are ignored
HtmlConverter.ConvertToPdf(html, pdf, new ConverterProperties());
using iText.Html2pdf;
using iText.Kernel.Pdf;

// This HTML uses CSS Flexbox — a standard layout technique since 2015
string html = @"
<html><head><style>
    .container { display: flex; gap: 20px; justify-content: space-between; }
    .card { flex: 1; padding: 15px; border: 1px solid #ccc; border-radius: 8px; }
</style></head>
<body>
    <div class='container'>
        <div class='card'>Revenue: $1.2M</div>
        <div class='card'>Expenses: $890K</div>
        <div class='card'>Profit: $310K</div>
    </div>
</body></html>";

using var writer = new PdfWriter("itext-output.pdf");
using var pdf = new PdfDocument(writer);
// Result: three cards stacked vertically, no flex layout applied
// The gap, border-radius, and justify-content are ignored
HtmlConverter.ConvertToPdf(html, pdf, new ConverterProperties());
Imports iText.Html2pdf
Imports iText.Kernel.Pdf

' This HTML uses CSS Flexbox — a standard layout technique since 2015
Dim html As String = "
<html><head><style>
    .container { display: flex; gap: 20px; justify-content: space-between; }
    .card { flex: 1; padding: 15px; border: 1px solid #ccc; border-radius: 8px; }
</style></head>
<body>
    <div class='container'>
        <div class='card'>Revenue: $1.2M</div>
        <div class='card'>Expenses: $890K</div>
        <div class='card'>Profit: $310K</div>
    </div>
</body></html>"

Using writer As New PdfWriter("itext-output.pdf")
    Using pdf As New PdfDocument(writer)
        ' Result: three cards stacked vertically, no flex layout applied
        ' The gap, border-radius, and justify-content are ignored
        HtmlConverter.ConvertToPdf(html, pdf, New ConverterProperties())
    End Using
End Using
$vbLabelText   $csharpLabel

La salida apila las tarjetas verticalmente sin diseño flexible. Se ignoran las propiedades gap, border-radius y justify-content. Este es el estado del renderizado HTML de iText: se aproxima a CSS 2.1 pero no ejecuta Flexbox, Grid ni JavaScript.

IronPDF lo reproduce correctamente porque utiliza Chromium integrado, el mismo motor que Chrome. El resultado debe coincidir con lo que se ve en el navegador:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html); // Same HTML as above
pdf.SaveAs("ironpdf-output.pdf");
// Result: three cards in a horizontal row with proper spacing and rounded corners
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html); // Same HTML as above
pdf.SaveAs("ironpdf-output.pdf");
// Result: three cards in a horizontal row with proper spacing and rounded corners
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html) ' Same HTML as above
pdf.SaveAs("ironpdf-output.pdf")
' Result: three cards in a horizontal row with proper spacing and rounded corners
$vbLabelText   $csharpLabel

PdfSharp: Genuinamente gratuito, genuinamente limitado

PdfSharp tiene licencia MIT sin restricciones. Más de 34,9 millones de descargas de NuGet. Para uso comercial, es gratuito sin condiciones. La contrapartida es lo que puede hacer.

Sin renderizado HTML

PdfSharp proporciona una API de dibujo. Se llama a DrawString(), DrawRectangle() y DrawImage() con coordenadas explícitas. No hay analizador HTML, ni motor CSS, ni sistema de plantillas. Si su aplicación genera archivos PDF a partir de plantillas HTML -facturas a partir de vistas Razor, informes a partir de HTML de cuadros de mando, archivado de correo electrónico a PDF- PdfSharpno puede hacerlo.

La solución sugerida habitualmente, HtmlRenderer.PdfSharp, solo es compatible con HTML 4.01 y CSS de nivel 2. No Flexbox. No Grid. Sin JavaScript. Sin fuentes web. Si tu HTML utiliza cualquier característica CSS de la última década, no se renderizará.

Dónde trabaja PdfSharp

PdfSharp funciona bien para generar documentos estructurados a partir de datos: facturas con diseños programáticos, informes sencillos, fusión y división de PDF, marcas de agua y anotaciones. Si no necesita renderizado HTML y su objetivo es Windows, sigue siendo una opción legítima.

QuestPDF: Gratis hasta que su empresa crezca

QuestPDF ofrece una elegante y fluida API en C# para crear documentos mediante programación. El diseño de la API es realmente bueno. El modelo de licencias crea un precipicio.

El umbral de ingresos

La licencia comunitaria de QuestPDF cubre a particulares, empresas con ingresos brutos anuales inferiores a 1 millón de dólares, organizaciones sin ánimo de lucro y proyectos de código abierto. Una vez que su empresa supere el millón de dólares de ingresos, será obligatoria una licencia comercial, independientemente del uso que haga de QuestPDF.

Esto es lo que parece en un escenario de crecimiento: Una nueva empresa que genera 900.000 dólares anuales utiliza QuestPDF libremente. Con un coste de 1.000.001 dólares, necesitan una licencia comercial. Si no lo han presupuestado, tienen que elegir entre pagar la licencia o migrar a otra biblioteca bajo presión de tiempo. Ninguna de las opciones es gratuita.

Las empresas que se acercan al umbral deben tener esto en cuenta en su planificación. No es una sorpresa si se leen los términos de la licencia, pero muchos equipos lo descubren después de que la biblioteca esté integrada en su base de código.

Sin soporte HTML - Por diseño

QuestPDF no renderiza HTML. Se trata de una elección de diseño deliberada, no de una característica que se echa en falta. El posicionamiento de la biblioteca es "deja de pelearte con la conversión de HTML a PDF": sustituye los planteamientos HTML por código programático en C#.

A pesar de este claro posicionamiento, los desarrolladores suelen suponer que QuestPDF maneja HTML porque aparece en los resultados de búsqueda de "bibliotecas PDF de C#" junto a bibliotecas con capacidad HTML. Las discusiones de GitHub desde 2022 hasta 2024 muestran a los desarrolladores descubriendo esta limitación después de comenzar la implementación. Los responsables confirman que no está prevista la compatibilidad con HTML.

wkhtmltopdf Wrappers: Abandonados con CVEs sin parchear

wkhtmltopdf era una popular herramienta de línea de comandos para convertir HTML en PDF. Existen varios envoltorios de C#: DinkToPdf, NReco.PdfGenerator, WkHtmlToXSharp. Todos ellos envuelven el mismo binario abandonado.

El estado

La organización GitHub fue archivada el 10 de julio de 2024. La página de estado de wkhtmltopdf marca el proyecto como obsoleto. Homebrew desactivó el barril el 16 de diciembre de 2024. El motor subyacente QtWebKit fue obsoleto por Qt en 2015 y eliminado en 2016.

Vulnerabilidades críticas - Sin parches para siempre

CVE-2022-35583 (CVSS 9.8 Crítico): Falsificación de petición del lado del servidor. Un atacante inyecta una etiqueta iframe en el contenido HTML procesado por wkhtmltopdf. El iframe se dirige a http://169.254.169.254/latest/meta-data/, el punto final de metadatos de AWS EC2. El PDF renderizado contiene la respuesta, que incluye las credenciales IAM.


<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"
        style="width:100%;height:500px;"></iframe>

<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"
        style="width:100%;height:500px;"></iframe>
HTML

CVE-2020-21365 (CVSS 7.5 Alto): Directory traversal que permite a atacantes remotos leer archivos locales a través de HTML crafteado.

Estas vulnerabilidades están documentadas, se pueden explotar públicamente y nunca se parchearán. Ejecutar wkhtmltopdf en producción -especialmente procesando HTML enviado por el usuario- crea una superficie de ataque concreta y explotable.

Calidad de renderizado

Más allá de la seguridad, el motor QtWebKit de wkhtmltopdf está congelado en aproximadamente la capacidad de Safari 2011. Sin CSS Flexbox, sin CSS Grid, compatibilidad limitada con CSS3, ejecución de JavaScript poco fiable. El contenido que se muestra correctamente en cualquier navegador moderno no se mostrará correctamente a través de wkhtmltopdf.

El coste real de lo "gratuito"

El tiempo del desarrollador es el mayor coste

Un equipo que trabaja en PdfSharpsin soporte HTML -posicionando manualmente cada elemento con comandos de dibujo basados en coordenadas para diseños que podrían expresarse en 20 líneas de HTML/CSS- quema tiempo del desarrollador que tiene un coste cuantificable.

Una estimación conservadora: 2 días de desarrollador al mes manteniendo soluciones y diseños manuales a 150 dólares la hora cuestan 28.800 dólares al año. La licencia para empresas de IronPDF cuesta menos que eso. La biblioteca "gratuita" cuesta más en productividad para el desarrollador que la alternativa comercial en licencias.

Esto no es exclusivo de PdfSharp. Los equipos que gestionan los procesos de navegación de Puppeteer Sharp - escribiendo la lógica de pooling, monitorizando las fugas de memoria, gestionando la recuperación de fallos - están pagando en tiempo de ingeniería lo que ahorraron en licencias.

Compuestos de deuda técnica

Un análisis de diciembre de 2025 de Quandary Peak Research lo expresó directamente: "La etiqueta de precio 'gratuito' del código abierto es un término equivocado, que oculta importantes costes ocultos y posibles responsabilidades."

Cada solución para una función que falta añade código que debe mantenerse, probarse y migrarse cuando cambien los requisitos. El informe CISQ 2022 reveló que la deuda técnica de software acumulada en EE.UU. alcanzaba los 1,52 billones de dólares. Las soluciones de la biblioteca PDF contribuyen a esa cifra cada vez que un equipo escribe código de maquetación basado en coordenadas en lugar de utilizar una plantilla HTML.

La exposición a la seguridad tiene un coste en dólares

Los datos del sector muestran que el 82% de los componentes de código abierto están desactualizados, el 75% de las bases de código contienen vulnerabilidades y el 49% contienen vulnerabilidades de alto riesgo. En concreto, las bibliotecas PDF conllevan un riesgo elevado porque procesan contenido proporcionado por el usuario y se ejecutan con privilegios de servidor.

La brecha de Equifax - 147 millones de registros expuestos - fue el resultado de una vulnerabilidad no parcheada en un componente de código abierto. El impacto financiero superó los 1.400 millones de dólares. El vector de ataque era la misma clase de vulnerabilidad (procesamiento de entradas no fiables a través de una biblioteca no mantenida) que representan los CVE de wkhtmltopdf.

La migración es más cara que hacerlo bien al principio

Empezar con una biblioteca gratuita limitada y migrar más tarde cuesta más que seleccionar inicialmente una biblioteca adecuada. La migración implica aprender nuevas API, reescribir el código de generación de PDF, recrear plantillas en diferentes formatos, realizar pruebas de regresión de cada tipo de documento y validar el resultado en los sistemas posteriores. Los equipos que presupuestan 0 dólares para herramientas PDF en el primer año suelen gastar más de 50.000 dólares en la migración en el segundo año.

Cómo aborda IronPDF estas limitaciones

Cuando diseñé la arquitectura de IronPDF, la decisión de integrar Chromium no tenía que ver con disponer de la última tecnología, sino con ofrecer a los desarrolladores resultados que coincidieran con lo que ven en su navegador. CSS Flexbox funciona. Funciona CSS Grid. Se ejecuta JavaScript. Fuentes web renderizadas. Se escribe HTML y CSS, y la salida en PDF coincide con Chrome.

using IronPdf;

var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head>
        <style>
            .dashboard { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
            .metric { padding: 20px; background: #f8f9fa; border-radius: 8px; text-align: center; }
            .metric h3 { margin: 0; color: #6c757d; font-size: 0.85rem; }
            .metric .value { font-size: 2rem; font-weight: bold; color: #212529; }
        </style>
    </head>
    <body>
        <div class='dashboard'>
            <div class='metric'><h3>Revenue</h3><div class='value'>$1.2M</div></div>
            <div class='metric'><h3>Users</h3><div class='value'>45,230</div></div>
            <div class='metric'><h3>Uptime</h3><div class='value'>99.97%</div></div>
        </div>
    </body>
    </html>");

pdf.SaveAs("dashboard.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head>
        <style>
            .dashboard { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
            .metric { padding: 20px; background: #f8f9fa; border-radius: 8px; text-align: center; }
            .metric h3 { margin: 0; color: #6c757d; font-size: 0.85rem; }
            .metric .value { font-size: 2rem; font-weight: bold; color: #212529; }
        </style>
    </head>
    <body>
        <div class='dashboard'>
            <div class='metric'><h3>Revenue</h3><div class='value'>$1.2M</div></div>
            <div class='metric'><h3>Users</h3><div class='value'>45,230</div></div>
            <div class='metric'><h3>Uptime</h3><div class='value'>99.97%</div></div>
        </div>
    </body>
    </html>");

pdf.SaveAs("dashboard.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim pdf = renderer.RenderHtmlAsPdf("
    <html>
    <head>
        <style>
            .dashboard { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
            .metric { padding: 20px; background: #f8f9fa; border-radius: 8px; text-align: center; }
            .metric h3 { margin: 0; color: #6c757d; font-size: 0.85rem; }
            .metric .value { font-size: 2rem; font-weight: bold; color: #212529; }
        </style>
    </head>
    <body>
        <div class='dashboard'>
            <div class='metric'><h3>Revenue</h3><div class='value'>$1.2M</div></div>
            <div class='metric'><h3>Users</h3><div class='value'>45,230</div></div>
            <div class='metric'><h3>Uptime</h3><div class='value'>99.97%</div></div>
        </div>
    </body>
    </html>")

pdf.SaveAs("dashboard.pdf")
$vbLabelText   $csharpLabel

Se utiliza CSS Grid, border-radius, tamaño de fuente personalizado y HTML semántico. PdfSharpno puede analizarlo. QuestPDF no puede analizarlo. el pdfHTML de iText se renderiza como una pila vertical. wkhtmltopdf ignora por completo la cuadrícula. IronPDF produce un panel de tres columnas que se adapta al navegador.

Licencias sin sorpresas

IronPDF utiliza licencias perpetuas: una compra, uso indefinido. No se divulgará el código fuente AGPL. No hay umbrales de ingresos. No hay suscripciones obligatorias. El precio comienza en 749 $ para un solo desarrollador y se publica en el sitio web, no detrás de un muro de "contacto de ventas".

Transplataforma sin complicaciones

IronPDF se ejecuta en Windows, Linux, macOS y contenedores Docker sin dependencias de libgdiplus, problemas de System.Drawing.Common o instalación de binarios nativos. El despliegue de Docker es una imagen base .NET estándar sin configuración adicional.

Tomar la decisión

Requisitos PdfSharp QuestPDF iTextSharp wkhtmltopdf IronPDF
Verdaderamente libre (MIT/permisivo) Ingresos inferiores a 1 millón de dólares No (AGPL) Abandonado No
HTML a PDF No No Limitado Deprecated
CSS moderno (Flexbox/Grid) No No No No
Ejecución de JavaScript No No No Limitado
Mantenimiento de la seguridad activa No
Precios publicados N/A No N/A
Sin umbral de ingresos No N/A

Para aplicaciones que solo requieran la creación programática de PDF a partir de datos -sin plantillas HTML ni contenido web-, PdfSharp`o QuestPDF pueden ser suficientes en función del tamaño de la empresa.

Para las aplicaciones que convierten HTML a PDF con CSS moderno, las opciones se reducen a pagar la licencia comercial de iText ($15K-$210K/año), gestionar la infraestructura del navegador Puppeteer o utilizar una biblioteca comercial diseñada para la tarea. La licencia perpetua de IronPDF, de 749 dólares, es la forma más económica de obtener un renderizado HTML de calidad de producción.

La frase "biblioteca PDF gratuita C#" atrae a los desarrolladores hacia soluciones que generan mayores costes a posteriori. Evalúe en función del coste total de propiedad (licencias, tiempo de desarrollo, mantenimiento de la seguridad y riesgo de migración) y no del precio inicial.