Gotenberg vs IronPDF: Guía de comparación técnica
Gotenbergvs IronPDF: Docker Microservice vs In-Process .NET Library
Cuando los desarrolladores .NET evalúan soluciones de generación de PDF, Gotenbergsurge como un microservicio basado en Docker que convierte HTML a PDF mediante llamadas a la API REST. Aunque es flexible para arquitecturas políglotas, Gotenbergintroduce una importante sobrecarga de infraestructura: contenedores Docker, latencia de red y complejidad operativa.IronPDFofrece un enfoque diferente: un paquete NuGet en proceso que proporciona el mismo renderizado basado en Chromium sin contenedores, llamadas de red ni gestión de infraestructuras.
Esta comparación examina ambas soluciones en dimensiones técnicamente relevantes para ayudar a los desarrolladores profesionales y arquitectos a tomar decisiones informadas para sus requisitos de .NET PDF.
Entendiendo Gotenberg
Gotenberg es una arquitectura de microservicios basada en Docker para la generación de PDF. Se ejecuta como un contenedor independiente que expone puntos finales de API REST para convertir HTML, URL y otros formatos a PDF. Cada operación PDF requiere una llamada HTTP al servicio Gotenberg.
Gotenberg utiliza puntos finales como POST /forms/chromium/convert/htmlpara la conversión de HTML a PDF y POST /forms/chromium/convert/urlpara la conversión de URL a PDF. La configuración se pasa mediante multipart/form-data con parámetros basados en cadenas como paperWidth, paperHeight, marginTop y marginBottom (en pulgadas). El servicio requiere el despliegue de Docker, la orquestación de contenedores (Kubernetes/Docker Compose) y la infraestructura de red.
La arquitectura requiere:
- Despliegue y gestión de contenedores Docker
- Comunicación de red para cada solicitud de PDF (latencia de 10-100 ms+)
- Gestión de arranque en frío de contenedores (2-5 segundos para las primeras solicitudes)
- Puntos finales de comprobación de estado y supervisión de servicios
- Construcción multipart/form-data para cada solicitud
Entendiendo IronPDF
IronPDF es una biblioteca nativa de .NET que se ejecuta en proceso como un paquete NuGet. Proporciona renderizado HTML basado en Chromium sin servicios externos, llamadas de red o infraestructura de contenedores.
IronPDF utiliza ChromePdfRenderer como su principal clase de renderizado con métodos como RenderHtmlAsPdf() y RenderUrlAsPdf(). La configuración utiliza propiedades C# tipificadas en RenderingOptions, como PaperSize, MarginTop, MarginBottom (en milímetros). Los documentos se guardan con SaveAs() o se accede a ellos como BinaryData.
La biblioteca sólo requiere:
- Instalación del paquete NuGet (
dotnet add package IronPdf) - Configuración de la clave de licencia
- Configuración de proyectos .NET Standard
Comparación de arquitecturas e infraestructuras
La diferencia fundamental entre estas soluciones radica en su arquitectura de despliegue y ejecución.
| Factor | Gotenberg | IronPDF |
|---|---|---|
| Despliegue | Contenedor Docker + orquestación | Paquete NuGet único |
| Arquitectura | Microservicio (API REST) | Biblioteca en proceso |
| Latencia por solicitud | 10-100ms+ (ida y vuelta en red) | < 1ms de sobrecarga |
| Inicio en frío | 2-5 segundos (init del contenedor) | 1-2 segundos (sólo la primera traducción) |
| Infraestructura | Docker, Kubernetes, balanceadores de carga | No es necesario |
| Dependencia de la red | Requerido | Ninguno |
| Modos de fallo | Fallos en redes, contenedores y servicios | Excepciones de .NET Standard |
| Estilo API | REST multipart/form-data | Llamadas a métodos nativos de C# |
| Escalado | Horizontal (más contenedores) | Vertical (en proceso) |
| Depuración | Rastreo distribuido | Depurador estándar |
| Gestión de memoria | Contenedor independiente (512 MB-2 GB) | Memoria de aplicación compartida |
| Control de versiones | Etiquetas de la imagen del contenedor | Versiones de los paquetes NuGet |
| Comprobaciones | Puntos finales HTTP necesarios | No se necesita (en proceso) |
| CI/CD complejidad | Creación de contenedores, inserción de registros | Versión .NET Standard |
El enfoque de Gotenbergbasado en Docker requiere el despliegue de contenedores, la supervisión de la salud y la gestión de la infraestructura de red.IronPDFelimina por completo esta capa de infraestructura al ejecutarse en el proceso.
Comparación de códigos: Operaciones comunes en PDF
Conversión básica de HTML a PDF
La operación más fundamental demuestra claramente la diferencia arquitectónica.
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergExample
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergExample
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg requiere crear un HttpClient, construir MultipartFormDataContent, añadir el HTML como un archivo adjunto con un nombre de archivo específico (index.html), hacer un HTTP POST asíncrono al punto final del servicio Gotenberg, leer los bytes de respuesta y escribir en el disco. Todas las solicitudes se realizan a través de la red, con la latencia y los modos de fallo asociados.
IronPDF crea un ChromePdfRenderer, llama a RenderHtmlAsPdf() con la cadena HTML y guarda con SaveAs(). La operación es sincrónica, en proceso, y utiliza métodos tipificados en lugar de datos de formulario basados en cadenas.
Para conocer las opciones avanzadas de conversión de HTML, consulte la Guía de conversión de HTML a PDF.
Conversión de URL a PDF
La conversión de páginas web a PDF muestra patrones arquitectónicos similares.
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergUrlToPdf
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("https://example.com"), "url");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergUrlToPdf
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("https://example.com"), "url");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfUrlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfUrlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg utiliza el punto final /forms/chromium/convert/url con la URL pasada como datos del formulario.IronPDFllama a RenderUrlAsPdf() directamente con la cadena URL: una única llamada a un método que sustituye a la infraestructura HTTP.
Tamaño de página y márgenes personalizados
El manejo de la configuración revela las diferencias de diseño de las API.
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergCustomSize
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
content.Add(new StringContent("8.5"), "paperWidth");
content.Add(new StringContent("11"), "paperHeight");
content.Add(new StringContent("0.5"), "marginTop");
content.Add(new StringContent("0.5"), "marginBottom");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
Console.WriteLine("Custom size PDF generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergCustomSize
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
content.Add(new StringContent("8.5"), "paperWidth");
content.Add(new StringContent("11"), "paperHeight");
content.Add(new StringContent("0.5"), "marginTop");
content.Add(new StringContent("0.5"), "marginBottom");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
Console.WriteLine("Custom size PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class IronPdfCustomSize
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-size.pdf");
Console.WriteLine("Custom size PDF generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class IronPdfCustomSize
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-size.pdf");
Console.WriteLine("Custom size PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg utiliza parámetros basados en cadenas ("8.5", "11", "0.5") que se añaden a los datos de formularios multiparte. Las dimensiones del papel están en pulgadas. Cada parámetro es una llamada Add() independiente sin comprobación de tipo ni soporte de IntelliSense.
IronPDF utiliza propiedades tipadas en RenderingOptions. PaperSize acepta un enum (PdfPaperSize.Letter), y los márgenes son valores numéricos en milímetros. La API tipada ofrece comprobación en tiempo de compilación y compatibilidad con IDE.
Obtenga más información sobre la configuración de la renderización en Tutoriales de IronPDF.
Referencia de mapeo de API
Para los desarrolladores que estén evaluando la migración a Gotenbergo comparando capacidades, este mapeo muestra operaciones equivalentes:
Mapeo de punto final a método
| Ruta Gotenberg | Equivalente de IronPDF | Notas |
|---|---|---|
POST /forms/chromium/convert/html | <código>ChromePdfRenderer.RenderHtmlAsPdf()</código | Cadena HTML a PDF |
POST /forms/chromium/convert/url | <código>ChromePdfRenderer.RenderUrlAsPdf()</código | URL a PDF |
POST /forms/chromium/convert/markdown | Render Markdown como HTML primero | Utilizar la biblioteca Markdig |
POST /forms/pdfengines/merge | PdfDocument.Merge() | Combinar varios PDF |
POST /forms/pdfengines/metadata/read | <código>pdf.MetaData</código | Leer metadatos |
| <código>POST /forms/pdfengines/metadata/write</código | <código>pdf.MetaData.Author = "..."</código | Escribir metadatos |
COMPRAR /health | N/A | No se necesita ningún servicio externo |
Mapeo de parámetros de formulario a RenderingOptions
| Parámetro Gotenberg | Propiedad de IronPDF | Notas de conversión |
|---|---|---|
paperWidth (pulgadas) | <código>RenderingOptions.SetCustomPaperSizeInInches()</código | Método de uso personalizado |
altura del papel (pulgadas) | <código>RenderingOptions.SetCustomPaperSizeInInches()</código | Método de uso personalizado |
marginTop (pulgadas) | <código>RenderingOptions.MarginTop</código | Multiplique por 25,4 para mm |
margenInferior (pulgadas) | <código>RenderingOptions.MarginBottom</código | Multiplique por 25,4 para mm |
margenIzquierdo (pulgadas) | <código>RenderingOptions.MarginLeft</código | Multiplique por 25,4 para mm |
margenDerecho (pulgadas) | <código>RenderingOptions.MarginRight</código | Multiplique por 25,4 para mm |
| <código>printBackground</código | <código>RenderingOptions.PrintHtmlBackgrounds</código | Booleano |
paisaje | <código>RenderingOptions.PaperOrientation</código | Paisaje enum |
escala | <código>RenderingOptions.Zoom</código | Porcentaje (100 = 1,0) |
waitDelay | <código>RenderingOptions.RenderDelay</código | Convertir a milisegundos |
| <código>emulatedMediaType</código | <código>RenderingOptions.CssMediaType</código | Pantalla o Imprimir |
Nótese la conversión de unidades: Gotenbergutiliza pulgadas para los márgenes (por ejemplo, "0,5" = 0,5 pulgadas = 12,7 mm), mientras queIronPDFutiliza milímetros.
Comparación de infraestructuras
GotenbergDocker Compose
Gotenberg requiere una infraestructura de contenedores:
# Gotenbergrequires container management
version: '3.8'
services:
app:
depends_on:
- gotenberg
environment:
- GOTENBERG_URL=http://gotenberg:3000
gotenberg:
image: gotenberg/gotenberg:8
ports:
- "3000:3000"
deploy:
resources:
limits:
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s# Gotenbergrequires container management
version: '3.8'
services:
app:
depends_on:
- gotenberg
environment:
- GOTENBERG_URL=http://gotenberg:3000
gotenberg:
image: gotenberg/gotenberg:8
ports:
- "3000:3000"
deploy:
resources:
limits:
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30sConfiguración de IronPDF
IronPDF no requiere servicios adicionales:
#IronPDF- No additional services needed
version: '3.8'
services:
app:
environment:
- IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# No Gotenbergservice. No health checks. No resource limits.#IronPDF- No additional services needed
version: '3.8'
services:
app:
environment:
- IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# No Gotenbergservice. No health checks. No resource limits.La diferencia de infraestructura es sustancial: Gotenbergrequiere el despliegue de contenedores, la supervisión de la salud, la asignación de recursos y las dependencias de servicios.IronPDFse ejecuta en proceso con la aplicación.
Características de rendimiento
| Operación | Gotenberg(Contenedor caliente) | Gotenberg(Arranque en frío) | IronPDF(Primera versión) | IronPDF(continuación) |
|---|---|---|---|---|
| HTML sencillo | 150-300ms | 2-5 segundos | 1-2 segundos | 50-150ms |
| HTML complejo | 500-1500ms | 3-7 segundos | 1.5-3 segundos | 200-800ms |
| Renderización de URL | 1-5 segundos | 3-10 segundos | 1-5 segundos | 500ms-3s |
| Fusión de PDF | 200-500ms | 2-5 segundos | 100-300ms | 100-300ms |
El viaje de ida y vuelta por la red de Gotenbergañade entre 10 y 100 ms por solicitud. Los arranques en frío de contenedores añaden 2-5 segundos. La primera renderización deIronPDFrequiere la inicialización de Chromium (1-2 segundos), pero las siguientes tienen una sobrecarga mínima.
Cuándo los equipos consideran pasar de Gotenberga IronPDF
Los equipos de desarrollo evalúan la transición de GotenbergaIronPDFpor varias razones:
Sobrecarga de infraestructura: Gotenbergrequiere Docker, orquestación de contenedores (Kubernetes/Docker Compose), descubrimiento de servicios y equilibrio de carga. Los equipos que buscan una implantación más sencilla descubren que el enfoque deIronPDFbasado únicamente en NuGet elimina estos problemas de infraestructura.
Latencia de red: Cada operación de GotenbergPDF requiere una llamada HTTP a un servicio independiente, lo que añade entre 10 y 100 ms por solicitud. Para aplicaciones de gran volumen, esta sobrecarga se acumula. El enfoque en proceso deIronPDFtiene una sobrecarga insignificante después de la inicialización.
Problemas de arranque en frío: El arranque del contenedor puede añadir entre 2 y 5 segundos a las primeras peticiones. Incluso los contenedores calientes tienen sobrecarga de red. Cada reinicio de pod, evento de escalado o despliegue desencadena arranques en frío. El arranque en frío deIronPDFse produce una vez durante la vida útil de la aplicación.
Complejidad operativa: Gotenbergrequiere la gestión de la salud del contenedor, el escalado, el registro y la supervisión como preocupaciones separadas. Los tiempos de espera de la red, la indisponibilidad del servicio y las caídas del contenedor se convierten en preocupaciones de la aplicación.IronPDFutiliza la gestión de excepciones estándar de .NET.
API de datos de formulario multiparte: cada solicitud de Gotenbergrequiere la construcción de cargas útiles multiparte/datos de formulario con parámetros basados en cadenas de texto, de forma detallada y sin comprobación de tipos en tiempo de compilación.IronPDFproporciona propiedades tipificadas de C# compatibles con IntelliSense.
Gestión de versiones: Las imágenes de Gotenbergse actualizan por separado de su aplicación. Los cambios en la API pueden romper las integraciones. Las versiones deIronPDFse gestionan a través de NuGet con la gestión de dependencias estándar de .NET.
Fuerzas y consideraciones
Puntos fuertes de Gotenberg
- Arquitectura Polyglot: Funciona con cualquier lenguaje que pueda realizar llamadas HTTP
- Idioma agnóstico: No está vinculado al ecosistema .NET
- Licencia MIT: Libre y de código abierto
- Patrón de microservicios: Se adapta a arquitecturas en contenedores
Consideraciones de Gotenberg
- Sobrecarga de infraestructura: Docker, Kubernetes, balanceadores de carga requeridos
- Latencia de red: 10-100ms+ por petición
- Inicios en frío: 2-5 segundos de inicialización del contenedor
- API basada en cadenas: sin seguridad de tipos ni IntelliSense
- Depuración distribuida: Requiere rastreo distribuido
- Salud: Puntos finales adicionales para gestionar
Puntos fuertes de IronPDF
- Infraestructura cero: solo paquete NuGet
- Rendimiento en proceso: Sin latencia de red tras la inicialización
- API de tipo seguro: Propiedades de tipo fuerte con IntelliSense
- Depuración estándar: El depurador normal de .NET funciona
- Recursos completos: tutoriales y documentación exhaustivos
- Soporte profesional: La licencia comercial incluye soporte
Consideraciones sobre IronPDF
- .NET Specific: Diseñado para el ecosistema .NET
- Licencia comercial: Necesaria para uso en producción
Conclusión
Gotenberg eIronPDFrepresentan enfoques fundamentalmente diferentes para la generación de PDF en aplicaciones .NET. La arquitectura de microservicios basada en Docker de Gotenbergintroduce la gestión de contenedores, la latencia de la red y la complejidad operativa. Cada operación PDF requiere comunicación HTTP con modos de fallo asociados y penalizaciones por arranque en frío.
IronPDF proporciona el mismo renderizado basado en Chromium como biblioteca en proceso. El paquete NuGet elimina los contenedores Docker, las llamadas de red y la gestión de infraestructuras. Las API tipificadas de C# sustituyen a los datos de formulario multiparte basados en cadenas. El manejo de excepciones estándar de .NET sustituye a los códigos de estado HTTP y a los modos de fallo de red.
A medida que las organizaciones planifican .NET 10, C# 14 y el desarrollo de aplicaciones hasta 2026, la elección entre la sobrecarga de la infraestructura de microservicios y la simplicidad de las bibliotecas en proceso afecta significativamente a la implantación y la complejidad operativa. Los equipos que busquen reducir la carga de la infraestructura al tiempo que mantienen la fidelidad de la renderización HTML/CSS/JavaScript encontrarán queIronPDFaborda estos requisitos con eficacia.
Comience a evaluarIronPDFcon una prueba gratuita y explore la documentación exhaustiva para evaluar si se adapta a sus requisitos específicos.