Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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" .
SHELL

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
SHELL

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
$vbLabelText   $csharpLabel

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"
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
    }
});
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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);
$vbLabelText   $csharpLabel

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!
$vbLabelText   $csharpLabel

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!
$vbLabelText   $csharpLabel

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);
$vbLabelText   $csharpLabel

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


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.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim