QuestPDF es excelente cuando C# es la frontera del producto
QuestPDF merece una comparación respetuosa. Es una biblioteca moderna de generación PDF para desarrolladores C#, con API fluida, tipado fuerte, documentación amplia, Companion App para previsualizar y depurar, y un modelo de licencias inusualmente claro para un SDK PDF.
La pregunta de producto no es “¿cuál puede crear un PDF?”. Ambos pueden. La pregunta útil es dónde debe vivir la frontera del PDF: dentro de una aplicación .NET que controla diseño, bytes y ciclo de vida, o como un servicio de infraestructura que llaman múltiples productos y lenguajes.
Guía rápida de decisión
- Elija QuestPDF cuando C# sea la fuente de referencia del documento, la aplicación deba funcionar sin conexión o necesite operaciones locales sobre PDF existentes.
- Elija gPdf cuando una sola capa PDF deba servir a Node, Python, Go, .NET, trabajos y sistemas regionales mediante la misma API HTTP.
- Elija gPdf cuando los cambios de diseño deban ser revisiones de plantilla, no recompilaciones C# y redespliegues de servicio.
Misma familia de documentos, distinto modelo de control
Con QuestPDF la aplicación controla la generación PDF. Es una fortaleza real: C# queda cerca del modelo de dominio, se ejecuta y depura localmente, y no hay llamada en tiempo de ejecución a una API externa.
La contrapartida es que su equipo también asume el resto de la superficie de producción:
- CPU y memoria para renderizar.
- Descubrimiento de fuentes y sustitución en cada entorno de despliegue.
- Integración de la biblioteca de códigos de barras y control de calidad de impresión.
- Paquetes nativos y preocupaciones de despliegue para gráficos o integraciones visuales personalizadas.
- Monitorización, reintentos y manejo de fallos.
- Despliegue regional cuando usuarios o almacenes son globales.
- Despliegues cada vez que cambia el diseño del documento.
Con gPdf, esa superficie se mueve hacia fuera: la aplicación envía un DocumentRequest o template_id + data, y el servicio se encarga del generador, el entorno en el edge, las fuentes, las primitivas de códigos de barras, la salida PDF/A y el empaquetado de factura electrónica. Es menos atractivo si quiere cada detalle en C#; más atractivo si la generación PDF debe ser una capa utilitaria llamable desde cualquier pila.
Tres concesiones que una API alojada debe responder honestamente
La mayoría de argumentos “biblioteca vs API” saltan las tres preguntas que un arquitecto .NET hace primero. Una comparación justa las responde en voz alta.
1. Adónde van los datos del documento. Esta página trata sobre todo de facturas, estados de cuenta y facturas electrónicas: documentos llenos de nombres, direcciones, identificadores fiscales e importes. Con QuestPDF esos bytes se construyen dentro de su proceso y nunca salen. La API pública de gPdf transmite los datos de la solicitud al servicio, pero el servicio es de retención cero: el JSON de la solicitud se mantiene en un isolate V8 de Cloudflare Workers solo durante la generación (típicamente unos 4 ms) y se libera al completar la respuesta; nunca se almacena, registra, muestrea ni usa para entrenar, y los registros operativos se limitan a estado HTTP y duración (seguridad, DPA). La residencia de datos UE / global y el despliegue empresarial local o privado reducen o cierran aún más la exposición. Aun así, mantener la generación dentro del proceso con cero configuración es una razón legítima, a veces decisiva, para que un equipo financiero o del sector público elija QuestPDF.
2. El modo de fallo. Una biblioteca no tiene un tercero que pueda caerse; la generación solo puede fallar en infraestructura que usted ya opera. Una API alojada añade una dependencia de disponibilidad que no controla. La forma correcta de adoptar gPdf es tratar las llamadas de generación como cualquier llamada externa: tiempo límite, reintento, cola y, si es posible, una alternativa en modo degradado. Si la generación de documentos está en una ruta síncrona crítica, compare “operarlo usted” con “depender de la disponibilidad de un proveedor”.
3. El perfil de latencia. La generación dentro del proceso es una llamada de función sin red. Una llamada alojada es una ida y vuelta de red. Para lotes y trabajos asíncronos es ruido. Para “el usuario hace clic y el PDF debe aparecer ahora”, dentro del proceso es estructuralmente más rápido. Los PoP en el edge de gPdf reducen el salto, pero sigue siendo TLS más una ida y vuelta; en QuestPDF es una llamada a método.
Nada de esto convierte a gPdf en la opción equivocada; define cuándo es la correcta: equipos cuyos datos de documento pueden salir del proceso, cuyos flujos toleran un salto de red y que prefieren depender de la disponibilidad de un proveedor antes que operar su propia flota de generación.
Modelo de licencia y precio
La página pública de licencias de QuestPDF dice que una licencia comercial solo es obligatoria para empresas con ingresos brutos anuales por encima de 1 millón USD. El nivel Community es gratuito, bajo términos MIT, para personas elegibles, proyectos de código abierto, organizaciones sin ánimo de lucro y empresas por debajo de ese umbral. La misma página pública enumera dos niveles comerciales perpetuos: Professional a 999 USD más impuestos locales para equipos de hasta 10 desarrolladores, y Enterprise a 2.999 USD más impuestos locales para toda la organización sin contar desarrolladores. Ambos incluyen un año de actualizaciones y proyectos, servidores y despliegues ilimitados; la licencia no expira para la última versión recibida.
El modelo de aplicación también es inusualmente ligero. La licencia se fija con una sola línea: QuestPDF.Settings.License = LicenseType.Community;. No hay clave de licencia, servidor de activación y, según la propia página de configuración de QuestPDF, no hay llamadas de red ni datos que salgan de la máquina. Es un modelo basado en confianza: usted elige el nivel para el que es elegible. No hay factura por documento del proveedor, y una licencia de pago corre en cualquier sitio, incluso totalmente sin conexión.
gPdf pone precio directamente al servicio de generación. El plan Basic público empieza en 5 USD/mes por 100.000 páginas, con exceso desde 0,00005 USD por página. Eso es una factura de proveedor, pero también elimina el proyecto separado de operar generación PDF: sin clúster de generación, sin ruta de despliegue NuGet, sin grupo regional precalentado, sin paquete de fuentes por aplicación y sin servicio PDF que parchear.
Así que la comparación de coste no es “999 USD vs 5 USD”; la licencia es una línea pequeña. La comparación real es:
Total QuestPDF = licencia (pago único) + su hosting + tiempo de ingeniería + guardias
Total gPdf = factura por páginas (infraestructura, fuentes, escala y presencia en el edge incluidas)
Con el cálculo público por página, el exceso de gPdf cuesta 0,05 USD por 1.000 páginas (50 USD por 1 millón, 500 USD por 10 millones). Una licencia Enterprise única de 2.999 USD solo empata contra esa factura cerca de los 60 millones de páginas, y esa cifra ignora el hosting y los meses de ingeniería de QuestPDF, que empujan el cruce real mucho más a favor de gPdf salvo que ya opere la infraestructura de generación a muy bajo coste. Regla práctica: si tendría que construir y dotar de personal un servicio de generación solo para usar la biblioteca, gPdf suele ganar en coste total mucho antes de que la factura por página alcance la licencia; si esa infraestructura ya existe y casi no le cuesta, la licencia perpetua gana a escala.
Flujo de desarrollo: C# fluido vs plantillas
La API fluida de QuestPDF encaja bien cuando los desarrolladores controlan la forma del documento. Tipado fuerte, cadenas de métodos, componentes C# reutilizables, refactorizaciones del IDE y Companion App tienen sentido cuando el PDF forma parte del código de la aplicación.
gPdf encaja con otro flujo. Los desarrolladores aún pueden escribir JSON directamente, pero los sistemas de producción suelen moverse hacia plantillas. Un diseñador, operador o ingeniero ajusta el diseño en gPdf Studio. El diseño aprobado pasa a ser una plantilla, y el servidor sigue generando con template_id + data.
Esa diferencia importa cuando el documento cambia a menudo. Si cambia una etiqueta de transportista, factura, albarán o estado de cuenta, gPdf puede mantener estable el entorno de ejecución y mover solo la plantilla. Con QuestPDF, el diseño es código C#, así que la ruta normal es cambio de código, pruebas, compilación, despliegue y plan de reversión.
Ningún flujo es universalmente mejor: QuestPDF optimiza para desarrolladores C# que quieren el documento como código; gPdf para plantillas operativas compartidas entre sistemas.
Cumplimiento: ambos productos van en serio
No es una comparación donde gPdf gana diciendo que el competidor no tiene funciones de cumplimiento. El material público actual de QuestPDF enumera un soporte fuerte de estándares, incluidos PDF/A, PDF/UA-1 y facturación electrónica EN 16931 mediante un ejemplo ZUGFeRD 2.1 / Factur-X basado en el estándar UN/CEFACT Cross Industry Invoice (CII). Ese ejemplo fija PdfA = true, incrusta el archivo factur-x.xml con AddAttachment(), extiende el documento con metadatos XMP y valida el resultado con veraPDF (para PDF/A-3b) y Mustang Project (para ZUGFeRD). Es una receta completa y honesta, y el flujo deja cada paso bajo su control.
gPdf empaqueta los mismos estándares como contrato de API. JSON Render expone seis perfiles PDF/A (1b, 2b, 3b, 4, 2u, 3u) más PDF/UA-1 mediante settings.profile, Template Render reutiliza el mismo modelo de documento y E-Invoice Render expone un punto de conexión dedicado POST /api/v1/e-invoice/render que produce paquetes Factur-X / ZUGFeRD PDF/A-3b con XML EN 16931 CII incrustado. La diferencia frente a la receta de QuestPDF está en lo que el servicio hace por usted: gPdf ejecuta la validación PDF/A-3b y de factura electrónica en servidor, soporta entrega síncrona directa o por objeto consultado, y ofrece residencia UE o global como opciones de la solicitud, no como pasos que usted monta y opera. QuestPDF encaja cuando esa validación debe vivir dentro de su proceso .NET; gPdf cuando debe ser un contrato alojado compartido por muchos sistemas.
Fuentes y códigos de barras: el verdadero comparativo es el esfuerzo de integración
QuestPDF tiene un modelo de fuentes capaz. Incluye Lato 2.015 por defecto, carga automáticamente fuentes del sistema y del directorio de despliegue, permite registrar fuentes personalizadas con FontManager y soporta cadenas de reserva. Eso da control a los desarrolladores. Pero la misma documentación es franca sobre el problema: en la mayoría de despliegues en la nube hay pocas fuentes o ninguna, lo que puede provocar resultados inesperados; recomienda desactivar fuentes del entorno y registrar explícitamente lo necesario. Dicho de otro modo, en un entorno de contenedor o sin servidor el entorno de fuentes es suyo para planificar, empaquetar y probar; un glifo ausente se convierte en carácter de reemplazo o, si activa CheckIfAllTextGlyphsAreAvailable, en una excepción.
gPdf hace que las fuentes formen parte de la frontera del servicio. El generador empaqueta un conjunto multiescritura: latín, griego, cirílico, árabe, hebreo, bengalí, tamil, tailandés, vietnamita, monoespaciado y CJK con sustitución por escritura a Noto KR / JP / SC. Resuelve elecciones silenciosas mediante selección automática implícita y elecciones explícitas con prefer o strict. Los llamadores no envían una fuente CJK, no registran archivos Noto en una aplicación .NET ni ajustan la sustitución por destino de despliegue. Envían datos; el servicio se encarga del entorno de fuentes, igual en cada región.
La comparación de códigos de barras tiene una forma parecida. La documentación de QuestPDF muestra un enfoque sólido usando ZXing.Net convertido en SVG vectorial, y señala explícitamente que ZXing.Net no está incluido en el paquete QuestPDF: se instala desde NuGet y se cablea:
// QuestPDF: add the separate ZXing.Net package, encode, render to SVG, embed.
// dotnet add package ZXing.Net
var writer = new ZXing.BarcodeWriterSvg {
Format = ZXing.BarcodeFormat.CODE_128,
Options = new ZXing.Common.EncodingOptions { Width = 320, Height = 80 }
};
string svg = writer.Write("INV-2026-001").Content;
container.Svg(svg);
// GS1-128 with Application Identifiers and FNC1 framing is hand-wired on top.
Con gPdf, la generación de códigos de barras es un elemento del esquema de primera clase. La solicitud declara formato, contenido, tamaño físico y una línea legible opcional; los formatos GS1 son nativos, así que los identificadores de aplicación van directo en content:
{
"type": "barcode",
"format": "gs1_128",
"content": "(01)00012345678905(21)SN12345",
"x": 12, "y": 60, "width": 80, "height": 18,
"barcode_text": { "enabled": true, "position": "bottom" }
}
Para una sola aplicación .NET, instalar ZXing.Net y probar la salida puede ser sencillo. Para muchos servicios y plantillas, especialmente cargas logísticas y de venta minorista que necesitan GS1-128, SSCC, GTIN, GS1 DataMatrix o GS1 QR con la línea de interpretación legible, llevar el comportamiento de códigos de barras a la API documental es más fácil de mantener que reimplementar el mismo cableado ZXing en cada servicio.
Donde QuestPDF gana claramente
Además de ejecutarse sin conexión, mantener los datos del documento dentro de su perímetro y servir cuando el código PDF forma parte del producto, es decir, cuando un equipo necesita inspeccionar, extender o poseer la ruta de generación, QuestPDF tiene dos áreas de capacidad claramente fuera del alcance de gPdf:
- Operaciones sobre PDF existentes. QuestPDF puede cargar archivos existentes y fusionarlos, seleccionar / reordenar / invertir / filtrar páginas, aplicar superposiciones, añadir adjuntos, definir metadatos XMP, linearizar para entrega web y cifrar y descifrar con seguridad de 40/128/256 bits. gPdf puede proteger con contraseña y permisos los PDF que genera, pero no abre, fusiona ni descifra archivos que no creó.
- Gráficos, mapas y visualizaciones personalizadas. QuestPDF integra bibliotecas de gráficos (ScottPlot, LiveCharts, Microcharts), incrusta mapas de Mapbox y expone un lienzo SkiaSharp para dibujo 2D arbitrario. gPdf puede dibujar arte vectorial con el elemento
path(datos de ruta SVG) o incrustar un gráfico SVG / PNG producido antes, pero no tiene motor de gráficos, mapas ni lienzo integrados; si la visualización de datos es central, esa herramienta vive mejor con QuestPDF.
Donde gPdf gana claramente
gPdf gana cuando una organización no quiere que cada equipo de producto opere su propio servicio PDF: pilas políglotas, flujos globales y sistemas ERP / OMS / WMS / comercio electrónico / fintech / venta de entradas que generan documentos desde datos estructurados, con plantillas que cambian de forma independiente al código. En esos entornos, una biblioteca local suele empezar barata y convertirse en una flota: un servicio por lenguaje, una ruta de despliegue por región, un plan de fuentes por contenedor, una suite de regresiones de códigos de barras por equipo. gPdf convierte esa flota en un contrato HTTP.
La arquitectura sin servidor deja la frontera muy clara. En AWS Lambda, Cloud Run o Azure Functions, QuestPDF sigue corriendo dentro de la aplicación: su equipo empaqueta el entorno .NET, fuentes, dependencias nativas y suficiente CPU / memoria para picos de trabajo PDF, y se queda con los arranques en frío. gPdf ya es el servicio de generación: la función hace POST de una pequeña solicitud template_id + data hacia el edge y recibe bytes PDF, sin generador que calentar ni proceso regional que escalar.
Forma de migración
La migración de QuestPDF a gPdf no es una reescritura línea por línea. Es un cambio de frontera: el código C# que construye el PDF pasa a ser una solicitud JSON de documento o una plantilla publicada.
Antes / después — la llamada C# de construcción de documento se reduce a un HTTP POST (haga clic para expandir)
- // Before: generate the PDF inside a .NET application.
- Document.Create(container =>
- {
- container.Page(page =>
- {
- page.Size(PageSizes.A4);
- page.Margin(30);
- page.Header().Text("Invoice").FontSize(24).SemiBold();
- page.Content().Column(column =>
- {
- column.Item().Text($"Invoice number: {invoice.Number}");
- column.Item().Text($"Total: {invoice.Total:C}");
- });
- });
- })
- .GeneratePdf("invoice.pdf");
+
+ // After: render through the shared gPdf template from C#.
+ using System.Net.Http.Headers;
+ using System.Net.Http.Json;
+
+ using var client = new HttpClient();
+ client.DefaultRequestHeaders.Authorization =
+ new AuthenticationHeaderValue("Bearer", key);
+
+ var response = await client.PostAsJsonAsync(
+ "https://api.gpdf.com/api/v1/template-render",
+ new {
+ template_id = "invoice-v2",
+ data = new {
+ invoice_number = invoice.Number,
+ total = invoice.Total,
+ currency = invoice.Currency
+ }
+ });
+
+ response.EnsureSuccessStatusCode();
+ byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
Después de mover esa frontera, los cambios de diseño pueden ser revisiones de plantilla en vez de despliegues de aplicación. La aplicación sigue controlando los datos empresariales y las decisiones de flujo; gPdf se encarga de la generación.
Nota de precios y fuentes
La información de QuestPDF en esta página se verificó el 2026-06-02 contra fuentes oficiales de QuestPDF: License and Pricing, License configuration, Features Overview, Companion App features, Barcodes, Font management y ZUGFeRD example. Las páginas de precio y funciones pueden cambiar; los equipos de compras deberían volver a revisar la página del proveedor antes de tomar una decisión. QuestPDF y las marcas relacionadas pertenecen a sus respectivos propietarios, y esta comparación no está respaldada por ellos.
Escenarios relacionados de generación PDF
Si está comparando QuestPDF con gPdf, también puede revisar cuándo conviene una API de JSON a PDF, una API de PDF de factura, una API de etiquetas de envío, códigos de barras GS1-128, PDF/A, Factur-X o ZUGFeRD como capacidades compartidas, en lugar de operar una biblioteca y su infraestructura en cada aplicación.
FAQ
¿gPdf reemplaza a QuestPDF?
No. gPdf reemplaza la necesidad de operar un servicio de generación PDF para documentos empresariales estructurados. QuestPDF sigue siendo una biblioteca C# local muy sólida cuando el PDF debe generarse dentro de la aplicación.
¿QuestPDF es gratis?
La página pública de licencias de QuestPDF dice que el nivel Community es gratuito bajo términos MIT para personas elegibles, proyectos de código abierto, organizaciones sin ánimo de lucro y empresas con ingresos brutos anuales por debajo de 1 millón USD. Las empresas por encima de ese umbral necesitan una licencia comercial perpetua: Professional a 999 USD más impuestos locales para hasta 10 desarrolladores, o Enterprise a 2.999 USD más impuestos locales para toda la organización, cada una con un año de actualizaciones.
¿Puede gPdf generar gráficos o mapas como QuestPDF?
No como motor integrado. QuestPDF integra bibliotecas de gráficos (ScottPlot, LiveCharts, Microcharts), mapas de Mapbox y un lienzo SkiaSharp que dibuja dentro del documento. gPdf aún puede dibujar gráficos vectoriales con el elemento path (que acepta datos de ruta SVG) y formas, o incrustar un SVG / PNG producido por cualquier biblioteca de gráficos como image. La diferencia es que QuestPDF calcula y dibuja el gráfico dentro del proceso, mientras que con gPdf usted produce el arte del gráfico y gPdf lo coloca. Si los gráficos basados en datos o los mapas son centrales para el documento, QuestPDF encaja mejor.
¿Qué producto es más barato?
Depende de la frontera. QuestPDF puede ser más barato para equipos .NET que cumplen los términos Community o que ya operan la infraestructura de generación. gPdf puede ser más barato cuando la alternativa es construir, alojar y mantener un servicio PDF entre productos o regiones.
¿gPdf almacena o registra los datos de mi documento?
No. El JSON que usted envía y el PDF que devuelve gPdf no se almacenan. Cada solicitud se genera dentro de un único isolate V8 de Cloudflare Workers, se mantiene en memoria solo durante la generación, normalmente unos 4 ms, y se libera al completar el flujo de respuesta; gPdf no retiene, registra, muestrea ni usa contenido DocumentRequest para entrenar modelos. Los registros operativos guardan solo estado HTTP y duración durante 30 días, sin cuerpos de solicitud. Consulte la política de seguridad, la política de privacidad y el DPA. Para cargas que no pueden transmitir datos en absoluto, el despliegue local o privado los mantiene dentro de su perímetro.
¿QuestPDF puede ejecutarse sin acceso a internet?
Sí. La página de configuración de licencias de QuestPDF dice que no hay clave de licencia ni servidor de activación, y que los cálculos se realizan localmente. Es una de las razones más claras para elegir QuestPDF.
¿Puede gPdf generar diseños arbitrarios de QuestPDF en C#?
No. gPdf no ejecuta código de diseño C#. Una migración implica convertir la forma del documento en una solicitud JSON de gPdf o en una plantilla guardada de gPdf.