Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de CraftMyPDF a IronPDF en C#

Migrar de CraftMyPDFa IronPDF: Guía completa de migración a C

CraftMyPDF es una API de generación de PDF basada en la nube que utiliza un editor de plantillas propietario de arrastrar y soltar y puntos finales REST para crear documentos. Aunque este enfoque resulta cómodo para casos de uso sencillos, la arquitectura exclusivamente en la nube plantea problemas de privacidad de los datos, latencia de la red, costes por PDF y dependencia de la plantilla, que resultan problemáticos a gran escala. Esta completa guía proporciona una ruta de migración paso a paso de CraftMyPDFa IronPDF, una biblioteca PDF .NET local que elimina las dependencias HTTP, se ejecuta sin conexión y ofrece una renderización Chromium perfecta con una licencia perpetua de un solo uso.

¿Por qué migrar de CraftMyPDFa IronPDF?

Las API de PDF basadas en la nube, como CraftMyPDF, introducen problemas fundamentales que las hacen inadecuadas para muchos entornos de producción.

El problema de las API de PDF basadas en la nube

  1. Sus datos salen de su sistema: Cada plantilla HTML y carga de datos JSON se transmite a los servidores de CraftMyPDF. En el caso de facturas, contratos, historiales médicos o cualquier dato empresarial sensible, esto genera riesgos de cumplimiento de la HIPAA, GDPR y SOC2.

  2. Latencia de red: La propia documentación de CraftMyPDFindica entre 1,5 y 30 segundos por PDF.IronPDFgenera localmente en milisegundos.

  3. Los costes por PDF se acumulan: 10.000 PDF al mes con tarifas de suscripción generan importantes costes recurrentes en comparación con una licencia perpetua única.

  4. Salida optimizada para impresión: Las API en la nube suelen optimizar para impresión reduciendo fondos y simplificando colores para ahorrar "tinta" El resultado nunca se parece a su HTML en pantalla.

  5. Template Lock-In: CraftMyPDFrequiere su propio editor de arrastrar y soltar. No se puede utilizar libremente HTML/CSS estándar.

Comparación de arquitecturas

AspectoCraftMyPDFIronPDF
Ubicación de los datosNube (sus datos salen de su sistema)On-premise (los datos nunca salen)
Latencia1.5-30 segundos por PDFMilisegundos
PreciosSuscripción por PDFLicencia perpetua única
Sistema de plantillasPropietario sólo arrastrar y soltarCualquier HTML/CSS/JavaScript
Calidad de la traducciónImpresión optimizadaRepresentación perfecta de la pantalla
Trabaja sin conexiónNo (requiere Internet)
CumplimientoLos datos dejan organizaciónAdecuado para SOC2/HIPAA

Comparación de características

CaracterísticaCraftMyPDFIronPDF
HTML a PDFA través de plantillas API✅Nativo
URL a PDFA través de API✅Nativo
Plantillas personalizadasSólo editor propietariocualquier HTML
Compatibilidad con CSS3Limitado✅Completo
Traducción de JavaScriptLimitado✅Completo
Combinar/Dividir PDFA través de API✅Nativo
Marcas de aguaA través de API✅Nativo
Trabajos fuera de línea
Autoalojado

Preparación de la migración

Prerrequisitos

Asegúrese de que su entorno cumple estos requisitos:

  • .NET Framework 4.6.2+ o .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ o VS Code con extensión de C#
  • Acceso al gestor de paquetes NuGet
  • Clave de licencia deIronPDF(prueba gratuita disponible en ironpdf.com)

Auditar el uso de CraftMyPDF

Ejecute estos comandos en su directorio de soluciones para identificar todas las referencias a CraftMyPDF:

# Find all CraftMyPDFusages 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 CraftMyPDFusages 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

Cambios importantes que hay que anticipar

CambiarCraftMyPDFIronPDFImpacto
ArquitecturaAPI REST de la nubeBiblioteca .NET localEliminar llamadas HTTP
PlantillasEditor propietarioHTML estándarConvertir plantillas a HTML
Clave APIRequerido para cada convocatoriaLicencia al inicioEliminar el manejo de claves API
Patrón asíncronoRequerido (HTTP)OpcionalQuitar await si se prefiere
Manejo de erroresCódigos de estado HTTPExcepcionesCambiar los patrones try/catch
Unión de datosPlantillas JSONInterpolación de cadenasSimplificar la vinculación de datos

Proceso de migración paso a paso

Paso 1: Actualizar paquetes NuGet

Elimine la biblioteca cliente HTTP e instale 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

Paso 2: Actualizar referencias de espacios de nombres

Sustituya los espacios de nombres de clientes HTTP por IronPDF:

// Remove these
using RestSharp;
using System.IO;

// Add this
using IronPdf;
// Remove these
using RestSharp;
using System.IO;

// Add this
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Paso 3: Configurar la licencia (una vez al inicio)

Sustituya los encabezados de clave de API por solicitud por una configuración de licencia ú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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Referencia completa de migración de API

Mapeo de puntos finales de API

CraftMyPDFIronPDFNotas
<código>POST /v1/create</códigorenderer.RenderHtmlAsPdf(html)No es necesario llamar a la API
<código>Cabecera X-API-KEY</códigoLicense.LicenseKey = "..."Establecer una vez al inicio
id_plantillaCadena HTML estándarUtilice cualquier HTML
marcadores de posición {%name%}$"{nombre}" Interpolación C#.NET Standard
POST /v1/merge<código>PdfDocument.Merge(pdfs)</códigoLocal, instantáneo
POST /v1/add-marca de agua<código>pdf.ApplyWatermark(html)</códigoBasado en HTML
Llamadas de retorno de webhooksNo es necesarioLos resultados son sincrónicos
Limitación de tarifasNo procedeSin límites

Mapeo de configuración

Opción CraftMyPDFEquivalente de IronPDFNotas
id_plantillaCadena HTMLUtilice su propio HTML
datos JSONInterpolación en C#$"Hola {nombre}"
tamaño_página: "A4"<código>TamañoPapel = PdfPaperSize.A4</código
orientación: "landscape"Orientación del papel = Horizontal
margin_top: 20MargenTop = 20En milímetros
<código>cabecera</código<código>HtmlHeader</códigoCompatibilidad total con HTML
footerPie de página HTMLCompatibilidad total con HTML

Ejemplos de migración de código

Conversión de HTML a PDF

La operación más común demuestra el cambio de arquitectura fundamental de la API en la nube a la renderización local.

Implementación de 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF elimina la configuración de RestClient, las cabeceras de clave API, los ID de plantilla y la gestión de respuestas HTTP, reduciendo una operación en la nube de 15 líneas a 4 líneas de código local. Para más opciones, consulte la documentación HTML a PDF.

Conversión de URL a PDF

Implementación de 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El método RenderUrlAsPdf deIronPDFcaptura la página web completa, incluido el contenido renderizado en JavaScript. Para obtener más opciones, consulte URL a la documentación en PDF.

Cabeceras y pies de página

Implementación de 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Implementación de 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF admite marcadores de posición como {page} y {total-pages} para la numeración dinámica de páginas. Para más opciones, consulte la documentación sobre encabezados y pies de página.

Conversión de variables de plantilla

CraftMyPDF utiliza marcadores de posición de plantilla propios que deben convertirse a interpolación de cadenas de C#:

Patrón de 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
    }
});
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Patrón 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Notas de migración críticas

Eliminar todo el código HTTP

El cambio más significativo es la eliminación de las dependencias de la red.IronPDFse ejecuta localmente, sin RestClient, sin llamadas a la API, sin gestión de respuestas:

// 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Quitar el código de limitación de velocidad

CraftMyPDF impone límites de velocidad de API que requieren una lógica de reintento.IronPDFno tiene límites:

// 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!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Quitar Webhook Handlers

CraftMyPDF utiliza webhooks asíncronos para la finalización de PDF.IronPDFes síncrono: el PDF está listo inmediatamente:

// 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!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Sync por defecto

Eliminar los patrones async/await si sólo eran necesarios para las llamadas 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Lista de comprobación posterior a la migración

Después de completar la migración del código, verifique lo siguiente:

  • [ ] Ejecutar todas las pruebas de generación de PDF
  • [ ] Comparar la calidad de salida (el motor Chromium deIronPDFrenderiza pixel-perfect)
  • [ ] Medir la mejora del rendimiento (milisegundos frente a segundos)
  • [ ] Verificar que todas las plantillas se hayan convertido correctamente
  • [ ] Probar el procesamiento por lotes sin límites de velocidad
  • [ ] Prueba en todos los entornos de destino
  • [ ] Actualización de procesos CI/CD
  • [ ] Cancelar suscripción a CraftMyPDF
  • [ ] Eliminar la clave API de secrets/config

Proteja su infraestructura PDF

Con .NET 10 en el horizonte y C# 14 introduciendo nuevas características del lenguaje, la elección de una biblioteca PDF local elimina los riesgos de depreciación de la API en la nube y los problemas de compatibilidad de versiones. El modelo de licencia perpetua deIronPDFsignifica que su inversión en migración rinde dividendos indefinidamente a medida que los proyectos se extienden hasta 2025 y 2026, sin costes de suscripción recurrentes ni datos que salgan de su infraestructura.

Recursos adicionales


La migración de CraftMyPDFaIronPDFelimina las dependencias de la nube, la latencia de la red, los costes por PDF y el bloqueo de plantillas, a la vez que ofrece un renderizado Chromium perfecto que se ejecuta sin conexión. La transición de las llamadas a la API REST a la invocación de métodos locales simplifica su código base y mantiene los datos confidenciales de los documentos dentro de su infraestructura.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más