Como migrar do Gotenberg para o IronPDF em C#
A migração do Gotemburgo para o IronPDF transforma seu fluxo de trabalho de PDF .NET , passando de uma arquitetura de microsserviços baseada em Docker com chamadas de API HTTP para uma biblioteca C# nativa integrada ao processo. Este guia fornece um caminho de migração abrangente, passo a passo, que elimina a sobrecarga de infraestrutura, a latência de rede e a complexidade do gerenciamento de contêineres para desenvolvedores .NET profissionais.
Por que migrar do Gotemburgo para o IronPDF?
O Problema Arquitetônico de Gotemburgo
Gotenberg é uma arquitetura de microsserviços baseada em Docker para geração de PDFs. Embora seja poderoso e flexível, introduz uma complexidade significativa para aplicações C#:
-
Sobrecarga de infraestrutura: Requer Docker, orquestração de contêineres (Kubernetes/Docker Compose), descoberta de serviços e balanceamento de carga. Cada implementação se torna mais complexa.
-
Latência de rede: Cada operação com PDF requer uma chamada HTTP para um serviço separado, adicionando 10 a 100 ms ou mais por solicitação. Essa latência aumenta rapidamente em cenários de alto volume.
-
Problemas de inicialização a frio: A inicialização do contêiner pode adicionar de 2 a 5 segundos às primeiras solicitações. Cada reinicialização de pod, cada evento de escalonamento e cada implantação aciona inicializações a frio.
-
Complexidade operacional: você precisa gerenciar a integridade, o escalonamento, o registro e o monitoramento dos contêineres como preocupações separadas da sua aplicação principal.
-
Dados de formulário multipart: Cada solicitação exige a construção de payloads multipart/form-data — verbosos, propensos a erros e tediosos de manter.
-
Pontos de Falha: Tempo limite de rede, indisponibilidade do serviço e falhas de contêineres são de sua responsabilidade.
- Gerenciamento de versões: as imagens do Gotemburgo são atualizadas separadamente do seu aplicativo; Alterações na API podem interromper integrações inesperadamente.
Comparação entre Gotemburgo e IronPDF
| Aspecto | Gotemburgo | IronPDF |
|---|---|---|
| Implantação | Contêiner Docker + orquestração | Pacote NuGet único |
| Arquitetura | Microsserviço (API REST) | Biblioteca em processo |
| Latência por solicitação | 10-100ms+ (tempo de ida e volta na rede) | sobrecarga < 1 ms |
| Partida a frio | 2-5 segundos (inicialização do contêiner) | 1-2 segundos (apenas na primeira renderização) |
| Infraestrutura | Docker, Kubernetes, balanceadores de carga | Nenhuma exigência |
| Modos de falha | Falhas de rede, contêiner e serviço | Exceções padrão do .NET |
| Estilo API | REST multipart/form-data | Chamadas de métodos nativos em C# |
| Escala | Horizontal (mais recipientes) | Vertical (em processo) |
| Depuração | Rastreamento distribuído necessário | Depurador padrão |
| Controle de versão | Etiquetas de imagem do contêiner | versões do pacote NuGet |
Para equipes visando versões atuais do .NET, o IronPDF fornece uma base com zero dependências de infraestrutura que se integra nativamente com padrões .NET modernos.
Avaliação da Complexidade da Migração
Esforço estimado por funcionalidade
| Recurso | Complexidade da Migração |
|---|---|
| HTML para PDF | Muito baixo |
| URL para PDF | Muito baixo |
| Tamanho de papel personalizado | Baixo |
| Margens | Baixo |
| Fusão de PDFs | Baixo |
| Cabeçalhos/Rodapés | Médio |
| Atrasos de espera | Baixo |
| Conversão de PDF/A | Baixo |
Mudança de paradigma
A mudança fundamental nesta migração de Gotemburgo reside na transição de chamadas à API HTTP com dados de formulário multipart para chamadas a métodos nativos em C#:
Gotenberg: HTTP POST multipart/form-data para contêiner Docker
IronPDF: Chamadas diretas de métodos em objetos C#
Antes de começar
Pré-requisitos
- Versão do .NET : O IronPDF é compatível com o .NET Framework 4.6.2+ e o .NET Core 3.1+ / .NET 5/6/7/8/9+.
- Chave de licença: Obtenha sua chave de licença do IronPDF em IronPDF
- Planejar a remoção da infraestrutura: Documentar os contêineres Gotemburgo para desativação pós-migração.
Identificar todos os usos de Gotenberg
# Find direct HTTP calls to Gotenberg
grep -r "gotenberg\|/forms/chromium\|/forms/libreoffice\|/forms/pdfengines" --include="*.cs" .
# Find GotenbergSharpApiClient usage
grep -r "GotenbergSharpClient\|Gotenberg.Sharp\|ChromiumRequest" --include="*.cs" .
# Find Docker/Kubernetes Gotemburgo configuration
grep -r "gotenberg/gotenberg\|gotenberg:" --include="*.yml" --include="*.yaml" .
# Find direct HTTP calls to Gotenberg
grep -r "gotenberg\|/forms/chromium\|/forms/libreoffice\|/forms/pdfengines" --include="*.cs" .
# Find GotenbergSharpApiClient usage
grep -r "GotenbergSharpClient\|Gotenberg.Sharp\|ChromiumRequest" --include="*.cs" .
# Find Docker/Kubernetes Gotemburgo configuration
grep -r "gotenberg/gotenberg\|gotenberg:" --include="*.yml" --include="*.yaml" .
Alterações no pacote NuGet
# Remove Gotemburgo client (if using)
dotnet remove package Gotenberg.Sharp.API.Client
# Install IronPDF
dotnet add package IronPdf
# Remove Gotemburgo client (if using)
dotnet remove package Gotenberg.Sharp.API.Client
# Install IronPDF
dotnet add package IronPdf
Migração de Início Rápido
Etapa 1: Atualizar a configuração da licença
Antes (Gotemburgo):
Gotenberg não exige licença, mas requer infraestrutura Docker com URLs de contêineres.
private readonly string _gotenbergUrl = "http://localhost:3000";
private readonly string _gotenbergUrl = "http://localhost:3000";
Private ReadOnly _gotenbergUrl As String = "http://localhost:3000"
Após (IronPDF):
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
Etapa 2: Atualizar importações de namespace
// Before (Gotenberg)
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;
// Before (Gotenberg)
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.IO
Imports IronPdf
Imports IronPdf.Rendering
Referência completa da API
Mapeamento de endpoints de Gotemburgo para IronPDF
| Rota de Gotemburgo | Equivalente ao IronPDF |
|---|---|
POST /forms/chromium/convert/html |
ChromePdfRenderer.RenderHtmlAsPdf() |
POST /forms/chromium/convert/url |
ChromePdfRenderer.RenderUrlAsPdf() |
POST /forms/pdfengines/merge |
PdfDocument.Merge() |
POST /forms/pdfengines/convert |
pdf.SaveAs() com configurações |
GET /health |
N / D |
Mapeamento de parâmetros de formulário para opções de renderização
| Parâmetro de Gotemburgo | Propriedade IronPDF | Notas de conversão |
|---|---|---|
paperWidth (polegadas) |
RenderingOptions.PaperSize |
Use enum ou tamanho personalizado |
paperHeight (polegadas) |
RenderingOptions.PaperSize |
Use enum ou tamanho personalizado |
marginTop (polegadas) |
RenderingOptions.MarginTop |
Multiplique por 25,4 para obter mm. |
marginBottom (polegadas) |
RenderingOptions.MarginBottom |
Multiplique por 25,4 para obter mm. |
printBackground |
RenderingOptions.PrintHtmlBackgrounds |
Booleano |
landscape |
RenderingOptions.PaperOrientation |
Landscape enum |
waitDelay (por exemplo, "3s") |
RenderingOptions.WaitFor.RenderDelay(ms) |
Converter string para milissegundos |
Exemplos de migração de código
Exemplo 1: HTML básico para PDF
Antes (Gotemburgo):
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");
}
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.IO
Module GotenbergExample
Async Function Main() As Task
Dim gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html"
Using client As New HttpClient()
Using content As New MultipartFormDataContent()
Dim html = "<html><body><h1>Hello from Gotenberg</h1></body></html>"
content.Add(New StringContent(html), "files", "index.html")
Dim response = Await client.PostAsync(gotenbergUrl, content)
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
Console.WriteLine("PDF generated successfully")
End Using
End Using
End Function
End Module
Após (IronPDF):
// 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");
}
}
Imports System
Imports IronPdf
Class IronPdfExample
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html = "<html><body><h1>Hello from IronPDF</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF generated successfully")
End Sub
End Class
A diferença é substancial: Gotemburgo exige a construção de um HttpClient, compilando MultipartFormDataContent, fazendo um HTTP POST assíncrono para um contêiner Docker em execução e lidando com a resposta do array de bytes.IronPDF reduz isso a três linhas com uma chamada de método ChromePdfRenderer—sem sobrecarga de rede, sem dependência de contêiner, sem complexidade assíncrona. Consulte a documentação de conversão de HTML para PDF para obter opções de renderização adicionais.
Exemplo 2: Conversão de URL para PDF
Antes (Gotemburgo):
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");
}
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.IO
Module GotenbergUrlToPdf
Async Function Main() As Task
Dim gotenbergUrl As String = "http://localhost:3000/forms/chromium/convert/url"
Using client As New HttpClient()
Using content As New MultipartFormDataContent()
content.Add(New StringContent("https://example.com"), "url")
Dim response As HttpResponseMessage = Await client.PostAsync(gotenbergUrl, content)
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("webpage.pdf", pdfBytes)
Console.WriteLine("PDF from URL generated successfully")
End Using
End Using
End Function
End Module
Após (IronPDF):
// 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");
}
}
Imports System
Imports IronPdf
Class IronPdfUrlToPdf
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL generated successfully")
End Sub
End Class
A abordagem Gotemburgo requer um endpoint diferente (/forms/chromium/convert/url), construindo conteúdo multipart com a URL como campo de formulário e lidando com respostas HTTP assíncronas. O método RenderUrlAsPdf() do IronPDF aceita a URL diretamente e retorna um objeto PdfDocument de maneira síncrona. Saiba mais sobre a conversão de URL para PDF .
Exemplo 3: Tamanho e margens de papel personalizados
Antes (Gotemburgo):
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");
}
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.IO
Class GotenbergCustomSize
Shared Async Function Main() As Task
Dim gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html"
Using client As New HttpClient()
Using content As New MultipartFormDataContent()
Dim 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")
Dim response = Await client.PostAsync(gotenbergUrl, content)
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes)
Console.WriteLine("Custom size PDF generated successfully")
End Using
End Using
End Function
End Class
Após (IronPDF):
// 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");
}
}
Imports System
Imports IronPdf
Imports IronPdf.Rendering
Module IronPdfCustomSize
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
Dim html As String = "<html><body><h1>Custom Size PDF</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("custom-size.pdf")
Console.WriteLine("Custom size PDF generated successfully")
End Sub
End Module
Gotenberg requer parâmetros baseados em string ("8.5", "11", "0.5") adicionados aos dados de formulário multipart—sem segurança de tipo, sem IntelliSense, fácil de digitar errado.IronPDF fornece propriedades fortemente tipadas com enums PdfPaperSize e valores de margem numéricos. Observe que as margens do IronPDF estão em milímetros (50 mm ≈ 2 polegadas), enquanto o Gotemburgo usa polegadas.
Notas críticas sobre migração
Conversões de unidades
A conversão mais importante nesta migração de Gotemburgo são as unidades de margem:
// Gotenberg: margins in inches
content.Add(new StringContent("0.5"), "marginTop"); // 0.5 inches
content.Add(new StringContent("1"), "marginBottom"); // 1 inch
// IronPDF: margins in millimeters
renderer.RenderingOptions.MarginTop = 12.7; // 0.5 inches × 25.4 = 12.7mm
renderer.RenderingOptions.MarginBottom = 25.4; // 1 inch × 25.4 = 25.4mm
// Gotenberg: margins in inches
content.Add(new StringContent("0.5"), "marginTop"); // 0.5 inches
content.Add(new StringContent("1"), "marginBottom"); // 1 inch
// IronPDF: margins in millimeters
renderer.RenderingOptions.MarginTop = 12.7; // 0.5 inches × 25.4 = 12.7mm
renderer.RenderingOptions.MarginBottom = 25.4; // 1 inch × 25.4 = 25.4mm
' Gotenberg: margins in inches
content.Add(New StringContent("0.5"), "marginTop") ' 0.5 inches
content.Add(New StringContent("1"), "marginBottom") ' 1 inch
' IronPDF: margins in millimeters
renderer.RenderingOptions.MarginTop = 12.7 ' 0.5 inches × 25.4 = 12.7mm
renderer.RenderingOptions.MarginBottom = 25.4 ' 1 inch × 25.4 = 25.4mm
Fórmula de conversão: millimeters = inches × 25.4
Síncrono vs. Assíncrono
Gotenberg requer operações assíncronas devido à comunicação HTTP:
// Gotenberg: Forced async due to network calls
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
// IronPDF: Synchronous in-process execution
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// IronPDF: Async wrapper if needed
var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(html));
// Gotenberg: Forced async due to network calls
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
// IronPDF: Synchronous in-process execution
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// IronPDF: Async wrapper if needed
var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(html));
Imports System.Net.Http
' Gotenberg: Forced async due to network calls
Dim response = Await client.PostAsync(gotenbergUrl, content)
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
' IronPDF: Synchronous in-process execution
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' IronPDF: Async wrapper if needed
Dim pdf = Await Task.Run(Function() renderer.RenderHtmlAsPdf(html))
Tratamento de erros
// Gotenberg: HTTP error handling
try
{
var response = await client.PostAsync(gotenbergUrl, content);
response.EnsureSuccessStatusCode(); // What if 500? 503? Timeout?
}
catch (HttpRequestException ex) { /* Network error */ }
catch (TaskCanceledException ex) { /* Timeout */ }
// IronPDF: Standard .NET exceptions
try
{
var pdf = renderer.RenderHtmlAsPdf(html);
}
catch (Exception ex)
{
Console.WriteLine($"PDF generation failed: {ex.Message}");
}
// Gotenberg: HTTP error handling
try
{
var response = await client.PostAsync(gotenbergUrl, content);
response.EnsureSuccessStatusCode(); // What if 500? 503? Timeout?
}
catch (HttpRequestException ex) { /* Network error */ }
catch (TaskCanceledException ex) { /* Timeout */ }
// IronPDF: Standard .NET exceptions
try
{
var pdf = renderer.RenderHtmlAsPdf(html);
}
catch (Exception ex)
{
Console.WriteLine($"PDF generation failed: {ex.Message}");
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks
' Gotenberg: HTTP error handling
Try
Dim response = Await client.PostAsync(gotenbergUrl, content)
response.EnsureSuccessStatusCode() ' What if 500? 503? Timeout?
Catch ex As HttpRequestException
' Network error
Catch ex As TaskCanceledException
' Timeout
End Try
' IronPDF: Standard .NET exceptions
Try
Dim pdf = renderer.RenderHtmlAsPdf(html)
Catch ex As Exception
Console.WriteLine($"PDF generation failed: {ex.Message}")
End Try
Remoção de infraestrutura
Após a migração, remova o Gotemburgo da sua infraestrutura:
# REMOVE from docker-compose.yml:
# services:
# gotenberg:
# image: gotenberg/gotenberg:8
# ports:
# - "3000:3000"
# deploy:
# resources:
# limits:
# memory: 2G
# REMOVE from docker-compose.yml:
# services:
# gotenberg:
# image: gotenberg/gotenberg:8
# ports:
# - "3000:3000"
# deploy:
# resources:
# limits:
# memory: 2G
Considerações sobre o desempenho
Comparação de latência
| Operação | Gotemburgo (Quente) | Gotemburgo (Início a Frio) | IronPDF(Primeira Renderização) | IronPDF(Subsequente) |
|---|---|---|---|---|
| HTML simples | 150-300ms | 2 a 5 segundos | 1-2 segundos | 50-150ms |
| HTML complexo | 500-1500ms | 3-7 segundos | 1,5 a 3 segundos | 200-800ms |
| Renderização de URL | 1-5 segundos | 3 a 10 segundos | 1-5 segundos | 500ms-3s |
Eliminação de custos de infraestrutura
| Recurso | Gotemburgo | IronPDF |
|---|---|---|
| Recipientes necessários | 1-N (escalonamento) | 0 |
| Memória por contêiner | 512 MB - 2 GB | N / D |
| Sobrecarga de rede por solicitação | 10-100 ms | 0ms |
| Pontos finais de verificação de saúde | Obrigatório | Não é necessário |
| balanceador de carga | Frequentemente necessário | Não é necessário |
Solução de problemas
Problema 1: Padrões HttpClient não são necessários
Problema: Código ainda usando HttpClient e MultipartFormDataContent.
Solução: Substitua totalmente por ChromePdfRenderer:
// Remove all of this:
// using var client = new HttpClient();
// using var content = new MultipartFormDataContent();
// content.Add(new StringContent(html), "files", "index.html");
// var response = await client.PostAsync(url, content);
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all of this:
// using var client = new HttpClient();
// using var content = new MultipartFormDataContent();
// content.Add(new StringContent(html), "files", "index.html");
// var response = await client.PostAsync(url, content);
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
Problema 2: Unidades de margem incorretas
Problema: Os PDFs apresentam margens incorretas após a migração.
Solução: Converter polegadas em milímetros:
// Gotemburgo used inches: "0.5"
//IronPDF uses millimeters: 0.5 × 25.4 = 12.7
renderer.RenderingOptions.MarginTop = 12.7;
// Gotemburgo used inches: "0.5"
//IronPDF uses millimeters: 0.5 × 25.4 = 12.7
renderer.RenderingOptions.MarginTop = 12.7;
Problema 3: Referências de URL do contêiner
Problema: Código contém http://gotenberg:3000 ou URLs semelhantes.
Solução: Remova todas as referências de URL do contêiner — o IronPDF é executado no mesmo processo:
// Remove:
// private readonly string _gotenbergUrl = "http://gotenberg:3000";
//IronPDF needs no URL - it's in-process
var renderer = new ChromePdfRenderer();
// Remove:
// private readonly string _gotenbergUrl = "http://gotenberg:3000";
//IronPDF needs no URL - it's in-process
var renderer = new ChromePdfRenderer();
' Remove:
' Private ReadOnly _gotenbergUrl As String = "http://gotenberg:3000"
' IronPDF needs no URL - it's in-process
Dim renderer As New ChromePdfRenderer()
Lista de verificação para migração
Pré-migração
- Inventariar todas as chamadas HTTP de Gotemburgo no código-fonte.
- Documentar a configuração atual do Gotemburgo (tempos limite, margens, tamanhos de papel)
- Identificar todas as configurações do Docker/Kubernetes no Gotenberg
- Obtenha a chave de licença do IronPDF
- Planejar o descomissionamento da infraestrutura
Migração de código
- Instale o pacote NuGet do IronPDF:
dotnet add package IronPdf - Remover pacotes de cliente Gotenberg
- Substitua todas as chamadas HTTP para Gotemburgo por chamadas de método do IronPDF.
- Converter unidades de margem de polegadas para milímetros
- Atualizar o tratamento de erros (erros HTTP → exceções .NET )
- Adicionar inicialização da chave de licença na inicialização do sistema
Migração de infraestrutura
- Remover Gotemburgo do Docker Compose / Kubernetes
- Atualizar pipelines de CI/CD (remover pulls de imagens do Gotenberg)
- Remover verificações de saúde de Gotenberg
- Remover URL de Gotemburgo da configuração
Testando
- Teste de conversão de HTML para PDF
- Teste de conversão de URL para PDF
- Verificar a margem e a precisão das dimensões
- Teste de desempenho sob carga
- Tempo de aquecimento da primeira renderização de teste
Pós-migração
- Remover implantações de contêineres Gotenberg
- Arquivo de configuração do Gotenberg
- Atualizar documentação
- Monitorar o uso de memória do aplicativo
- Verifique se não há conexões de rede órfãs

