Como migrar do CraftMyPDF para o IronPDF em C#
Por que migrar do CraftMyPDF para o IronPDF?
APIs de PDF baseadas em nuvem, como o CraftMyPDF, apresentam problemas fundamentais que as tornam inadequadas para muitos ambientes de produção.
O problema com as APIs de PDF baseadas na nuvem
-
Seus dados saem do seu sistema: Cada modelo HTML e carga útil de dados JSON é transmitida para os servidores da CraftMyPDF. Para faturas, contratos, registros médicos ou quaisquer dados comerciais sensíveis, isso cria riscos de não conformidade com as normas HIPAA, GDPR e SOC2.
-
Latência de rede: A própria documentação do CraftMyPDF indica de 1,5 a 30 segundos por PDF. O IronPDF é gerado localmente em milissegundos.
-
Os custos por PDF se acumulam: 10.000 PDFs por mês, com planos de assinatura, geram custos recorrentes significativos em comparação com uma licença perpétua única.
-
Saída otimizada para impressão: APIs na nuvem geralmente otimizam para impressão, reduzindo planos de fundo e simplificando cores para economizar "tinta". O resultado nunca se parece com o seu HTML na tela.
- Dependência de modelo: o CraftMyPDF exige seu editor proprietário de arrastar e soltar. Você não pode usar HTML/CSS padrão livremente.
Comparação de arquitetura
| Aspecto | CraftMyPDF | IronPDF |
|---|---|---|
| Localização dos dados | Nuvem (seus dados saem do seu sistema) | Local (os dados nunca saem) |
| Latência | 1,5 a 30 segundos por PDF | Milissegundos |
| Preços | Assinatura por PDF | Licença perpétua única |
| Sistema de modelos | Somente com recurso proprietário de arrastar e soltar. | Qualquer HTML/CSS/ JavaScript |
| Qualidade da produção | Otimizado para impressão | Renderização de tela perfeita em cada pixel |
| Funciona offline | Não (requer internet) | Sim |
| Conformidade | Os dados saem da organização. | Compatível com SOC2/HIPAA |
Comparação de recursos
| Recurso | CraftMyPDF | IronPDF |
|---|---|---|
| HTML para PDF | Por meio de modelos de API | ✅ Nativo |
| URL para PDF | Via API | ✅ Nativo |
| Modelos personalizados | Editor proprietário apenas | ✅ Qualquer HTML |
| Suporte a CSS3 | Limitado | ✅ Completo |
| Renderização em JavaScript | Limitado | ✅ Completo |
| Unir/Dividir PDFs | Via API | ✅ Nativo |
| Marcas d'água | Via API | ✅ Nativo |
| Funciona offline | ❌ | ✅ |
| autohospedado | ❌ | ✅ |
Preparação pré-migratória
Pré-requisitos
Certifique-se de que seu ambiente atenda a estes requisitos:
- .NET Framework 4.6.2 ou superior ou .NET Core 3.1 / .NET 5-9
- Visual Studio 2019 ou superior ou VS Code com extensão C#
- Acesso ao Gerenciador de Pacotes NuGet
- Chave de licença do IronPDF (teste gratuito disponível em IronPDF )
Auditoria de uso do CraftMyPDF
Execute estes comandos no diretório da sua solução para identificar todas as referências ao CraftMyPDF:
# Find all CraftMyPDF usages in your codebase
grep -r "CraftMyPdf\|craftmypdf\|api.craftmypdf.com" --include="*.cs" .
grep -r "X-API-KEY" --include="*.cs" .
# Find API key references
grep -r "your-api-key\|template-id\|template_id" --include="*.cs" .
# Find NuGet package references
grep -r "CraftMyPdf\|RestSharp" --include="*.csproj" .
# Find all CraftMyPDF usages in your codebase
grep -r "CraftMyPdf\|craftmypdf\|api.craftmypdf.com" --include="*.cs" .
grep -r "X-API-KEY" --include="*.cs" .
# Find API key references
grep -r "your-api-key\|template-id\|template_id" --include="*.cs" .
# Find NuGet package references
grep -r "CraftMyPdf\|RestSharp" --include="*.csproj" .
Mudanças significativas a serem previstas
| Mudar | CraftMyPDF | IronPDF | Impacto |
|---|---|---|---|
| Arquitetura | API REST na nuvem | Biblioteca .NET local | Remover chamadas HTTP |
| Modelos | Editor proprietário | HTML padrão | Converter modelos em HTML |
| Chave de API | Obrigatório para todas as chamadas | Licença na inicialização | Remover o gerenciamento de chaves de API |
| Padrão assíncrono | Obrigatório (HTTP) | Opcional | Remova o await se preferir. |
| Tratamento de erros | códigos de status HTTP | Exceções | Alterar padrões try/catch |
| Vinculação de dados | Modelos JSON | Interpolação de strings | Simplifique a vinculação de dados. |
Processo de migração passo a passo
Passo 1: Atualizar pacotes NuGet
Remova a biblioteca cliente HTTP e instale o IronPDF:
# Remove RestSharp HTTP client
dotnet remove package RestSharp
# Install IronPDF
dotnet add package IronPdf
# Remove RestSharp HTTP client
dotnet remove package RestSharp
# Install IronPDF
dotnet add package IronPdf
Etapa 2: Atualizar referências de namespace
Substitua os namespaces do cliente HTTP pelo IronPDF:
// Remove these
using RestSharp;
using System.IO;
// Add this
using IronPdf;
// Remove these
using RestSharp;
using System.IO;
// Add this
using IronPdf;
Imports IronPdf
Etapa 3: Configurar a licença (uma vez na inicialização)
Substitua os cabeçalhos de chave de API por solicitação por uma configuração de licença única:
// Add at application startup (Program.cs or Global.asax)
// This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
// This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
' This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Referência completa para migração de API
Mapeamento de endpoints de API
| CraftMyPDF | IronPDF |
|---|---|
POST /v1/create |
renderer.RenderHtmlAsPdf(html) |
X-API-KEY cabeçalho |
License.LicenseKey = "..." |
template_id |
String HTML padrão |
{%name%} espaços reservados |
$"{name}" Interpolação em C# |
POST /v1/merge |
PdfDocument.Merge(pdfs) |
POST /v1/add-watermark |
pdf.ApplyWatermark(html) |
| Retornos de chamada do Webhook | Não é necessário |
| Limitação de taxa | Não aplicável |
Mapeamento de Configuração
| Opção CraftMyPDF | Equivalente ao IronPDF |
|---|---|
template_id |
string HTML |
data JSON |
Interpolação em C# |
page_size: "A4" |
PaperSize = PdfPaperSize.A4 |
orientation: "landscape" |
PaperOrientation = Landscape |
margin_top: 20 |
MarginTop = 20 |
header |
HtmlHeader |
footer |
HtmlFooter |
Exemplos de migração de código
Conversão de HTML para PDF
A operação mais comum demonstra a mudança fundamental na arquitetura, passando da API em nuvem para a renderização local.
Implementação do CraftMyPDF:
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
}
});
var response = client.Execute(request);
File.WriteAllBytes("output.pdf", response.RawBytes);
}
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
}
});
var response = client.Execute(request);
File.WriteAllBytes("output.pdf", response.RawBytes);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
}
})
Dim response = client.Execute(request)
File.WriteAllBytes("output.pdf", response.RawBytes)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
pdf.SaveAs("output.pdf");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
O IronPDF elimina a configuração do RestClient, os cabeçalhos da chave de API, os IDs de modelo e o tratamento da resposta HTTP, reduzindo uma operação na nuvem de 15 linhas para apenas 4 linhas de código local. Para mais opções, consulte a documentação de conversão de HTML para PDF .
Conversão de URL para PDF
Implementação do CraftMyPDF:
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
url = "https://example.com"
},
export_type = "pdf"
});
var response = client.Execute(request);
File.WriteAllBytes("webpage.pdf", response.RawBytes);
}
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
url = "https://example.com"
},
export_type = "pdf"
});
var response = client.Execute(request);
File.WriteAllBytes("webpage.pdf", response.RawBytes);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.url = "https://example.com"
},
.export_type = "pdf"
})
Dim response = client.Execute(request)
File.WriteAllBytes("webpage.pdf", response.RawBytes)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
O método RenderUrlAsPdf do IronPDF captura a página web completa, incluindo o conteúdo renderizado por JavaScript. Para mais opções, consulte o link para a documentação em PDF .
Cabeçalhos e rodapés
Implementação do CraftMyPDF:
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
html = "<h1>Document Content</h1>",
header = "<div>Page Header</div>",
footer = "<div>Page {page} of {total_pages}</div>"
}
});
var response = client.Execute(request);
File.WriteAllBytes("document.pdf", response.RawBytes);
}
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;
class Program
{
static void Main()
{
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
request.AddJsonBody(new
{
template_id = "your-template-id",
data = new
{
html = "<h1>Document Content</h1>",
header = "<div>Page Header</div>",
footer = "<div>Page {page} of {total_pages}</div>"
}
});
var response = client.Execute(request);
File.WriteAllBytes("document.pdf", response.RawBytes);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.html = "<h1>Document Content</h1>",
.header = "<div>Page Header</div>",
.footer = "<div>Page {page} of {total_pages}</div>"
}
})
Dim response = client.Execute(request)
File.WriteAllBytes("document.pdf", response.RawBytes)
End Sub
End Module
Implementação do IronPDF :
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}"
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}"
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
pdf.SaveAs("document.pdf");
}
}
Imports System
Imports IronPdf
Imports IronPdf.Rendering
Module Program
Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Page Header"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}"
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>")
pdf.SaveAs("document.pdf")
End Sub
End Module
O IronPDF suporta marcadores de posição como {page} e {total-pages} para numeração dinâmica de páginas. Para mais opções, consulte a documentação sobre cabeçalhos e rodapés .
Conversão de variáveis de modelo
O CraftMyPDF utiliza marcadores de posição proprietários que precisam ser convertidos em interpolação de strings em C#:
Padrão CraftMyPDF:
// CraftMyPDF template variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
// CraftMyPDF template variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
Padrão IronPDF :
// C# string interpolation
var html = $@"
<html>
<body>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
<p>Amount: {amount}</p>
{GenerateItemsTable(invoiceItems)}
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
// C# string interpolation
var html = $@"
<html>
<body>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
<p>Amount: {amount}</p>
{GenerateItemsTable(invoiceItems)}
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
Dim html As String = $"
<html>
<body>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
<p>Amount: {amount}</p>
{GenerateItemsTable(invoiceItems)}
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
Notas críticas sobre migração
Remover todo o código HTTP
A mudança mais significativa é a eliminação das dependências de rede. O IronPDF é executado localmente — sem RestClient, sem chamadas de API, sem tratamento de respostas:
// CraftMyPDF - HTTP required
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
var response = await client.ExecuteAsync(request);
// IronPDF - no HTTP
var pdf = renderer.RenderHtmlAsPdf(html);
// CraftMyPDF - HTTP required
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
var response = await client.ExecuteAsync(request);
// IronPDF - no HTTP
var pdf = renderer.RenderHtmlAsPdf(html);
Remover código de limitação de taxa
O CraftMyPDF impõe limites de taxa de API, exigindo lógica de repetição. IronPDF não tem limites:
// CraftMyPDF - needed to avoid 429 errors
await Task.Delay(100);
if (response.StatusCode == TooManyRequests) { /* retry */ }
// IronPDF - no limits, just generate
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all rate limit code!
// CraftMyPDF - needed to avoid 429 errors
await Task.Delay(100);
if (response.StatusCode == TooManyRequests) { /* retry */ }
// IronPDF - no limits, just generate
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all rate limit code!
Remover manipuladores de webhook
O CraftMyPDF utiliza webhooks assíncronos para o preenchimento automático de PDFs. O IronPDF é síncrono — o PDF fica pronto imediatamente:
// CraftMyPDF - webhook callback required
// POST with webhook_url, wait for callback
// IronPDF - PDF ready immediately
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No callback needed!
// CraftMyPDF - webhook callback required
// POST with webhook_url, wait for callback
// IronPDF - PDF ready immediately
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No callback needed!
Sincronizar por padrão
Remova os padrões async/await se eles forem necessários apenas para chamadas HTTP:
// CraftMyPDF - async required
var response = await client.ExecuteAsync(request);
// IronPDF - sync by default (async available if needed)
var pdf = renderer.RenderHtmlAsPdf(html);
// CraftMyPDF - async required
var response = await client.ExecuteAsync(request);
// IronPDF - sync by default (async available if needed)
var pdf = renderer.RenderHtmlAsPdf(html);
Lista de verificação pós-migração
Após concluir a migração do código, verifique o seguinte:
- Execute todos os testes de geração de PDF
- Compare a qualidade da saída (o mecanismo Chromium do IronPDF renderiza com perfeição de pixels)
- Medir a melhoria de desempenho (milissegundos vs. segundos)
- Verifique se todos os modelos foram convertidos corretamente.
- Teste o processamento em lote sem limites de taxa
- Testar em todos os ambientes-alvo
- Atualizar pipelines de CI/CD
- Cancelar assinatura do CraftMyPDF
- Remover a chave da API de secrets/config
Preparando sua infraestrutura de PDF para o futuro
Com o .NET 10 no horizonte e o C# 14 introduzindo novos recursos de linguagem, escolher uma biblioteca PDF local elimina os riscos de descontinuação da API na nuvem e as preocupações com a compatibilidade de versões. O modelo de licenciamento perpétuo da IronPDF significa que seu investimento em migração rende frutos indefinidamente, à medida que os projetos se estendem até 2025 e 2026 — sem custos recorrentes de assinatura ou perda de dados em sua infraestrutura.
Recursos adicionais
- Documentação do IronPDF
- Tutoriais de HTML para PDF
- Referência da API
- Pacote NuGet
- Opções de licenciamento
A migração do CraftMyPDF para o IronPDF elimina dependências da nuvem, latência de rede, custos por PDF e aprisionamento a modelos específicos, ao mesmo tempo que oferece renderização Chromium perfeita em pixels e funciona offline. A transição de chamadas à API REST para invocações de métodos locais simplifica seu código e mantém os dados confidenciais dos documentos dentro da sua infraestrutura.

