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

Como migrar do CraftMyPDF para o IronPDF em C#

Por que migrar doCraftMyPDFpara 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 da Rede: Cada geração de PDF envolve uma ida e volta de rede, além de tempo de fila e renderização (normalmente segundos). O IronPDF é gerado localmente em milissegundos.

  3. Custos Por-PDF Acumulam: Preços baseados em créditos acumulam com o volume — cargas de trabalho de alto rendimento criam 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: oCraftMyPDFexige 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 Ida e volta de rede + renderização (normalmente segundos) Milissegundos
Preços Assinatura baseada em crédito 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 allCraftMyPDFusages 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 allCraftMyPDFusages 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 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çãoCraftMyPDF 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 = "file" // "file" returns binary PDF; "json" returns a CDN URL
        });

        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 = "file" // "file" returns binary PDF; "json" returns a CDN URL
        });

        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 = "file" ' "file" returns binary PDF; "json" returns a CDN URL
        })

        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 completa, incluindo 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

IronPDF suporta tokens de espaço reservado como {page} e {total-pages} para numeração de páginas dinâmica. Para mais opções, consulte a documentação sobre cabeçalhos e rodapés .

Conversão de variáveis ​​de modelo

OCraftMyPDFutiliza marcadores de posição proprietários que precisam ser convertidos em interpolação de strings em C#:

Padrão CraftMyPDF:

//CraftMyPDFtemplate variables
request.AddJsonBody(new
{
    template_id = "invoice-template",
    data = new
    {
        customer = "John Doe",
        amount = "$1,000",
        items = invoiceItems
    }
});
//CraftMyPDFtemplate variables
request.AddJsonBody(new
{
    template_id = "invoice-template",
    data = new
    {
        customer = "John Doe",
        amount = "$1,000",
        items = invoiceItems
    }
});
'CraftMyPDFtemplate variables
request.AddJsonBody(New With {
    .template_id = "invoice-template",
    .data = New With {
        .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);
Imports RestSharp

'CraftMyPDF- HTTP required
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")
Dim response = Await client.ExecuteAsync(request)

'IronPDF- no HTTP
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

Remover código de limitação de taxa

OCraftMyPDFimpõ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

OCraftMyPDFutiliza 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!
'CraftMyPDF- webhook callback required
' POST with webhook_url, wait for callback

'IronPDF- PDF ready immediately
Dim 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

Recursos adicionais


A migração doCraftMyPDFpara 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.

ObserveCraftMyPDF é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pelo CraftMyPDF. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

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 Iron

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