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
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.
Latencia de red: La propia documentación de CraftMyPDFindica entre 1,5 y 30 segundos por PDF.IronPDFgenera localmente en milisegundos.
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.
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.
- Template Lock-In: CraftMyPDFrequiere su propio editor de arrastrar y soltar. No se puede utilizar libremente HTML/CSS estándar.
Comparación de arquitecturas
| Aspecto | CraftMyPDF | IronPDF |
|---|---|---|
| Ubicación de los datos | Nube (sus datos salen de su sistema) | On-premise (los datos nunca salen) |
| Latencia | 1.5-30 segundos por PDF | Milisegundos |
| Precios | Suscripción por PDF | Licencia perpetua única |
| Sistema de plantillas | Propietario sólo arrastrar y soltar | Cualquier HTML/CSS/JavaScript |
| Calidad de la traducción | Impresión optimizada | Representación perfecta de la pantalla |
| Trabaja sin conexión | No (requiere Internet) | Sí |
| Cumplimiento | Los datos dejan organización | Adecuado para SOC2/HIPAA |
Comparación de características
| Característica | CraftMyPDF | IronPDF |
|---|---|---|
| HTML a PDF | A través de plantillas API | ✅Nativo |
| URL a PDF | A través de API | ✅Nativo |
| Plantillas personalizadas | Sólo editor propietario | cualquier HTML |
| Compatibilidad con CSS3 | Limitado | ✅Completo |
| Traducción de JavaScript | Limitado | ✅Completo |
| Combinar/Dividir PDF | A través de API | ✅Nativo |
| Marcas de agua | A 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" .Cambios importantes que hay que anticipar
| Cambiar | CraftMyPDF | IronPDF | Impacto |
|---|---|---|---|
| Arquitectura | API REST de la nube | Biblioteca .NET local | Eliminar llamadas HTTP |
| Plantillas | Editor propietario | HTML estándar | Convertir plantillas a HTML |
| Clave API | Requerido para cada convocatoria | Licencia al inicio | Eliminar el manejo de claves API |
| Patrón asíncrono | Requerido (HTTP) | Opcional | Quitar await si se prefiere |
| Manejo de errores | Códigos de estado HTTP | Excepciones | Cambiar los patrones try/catch |
| Unión de datos | Plantillas JSON | Interpolación de cadenas | Simplificar 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 IronPdfPaso 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.comPaso 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.comReferencia completa de migración de API
Mapeo de puntos finales de API
| CraftMyPDF | IronPDF | Notas |
|---|---|---|
| <código>POST /v1/create</código | renderer.RenderHtmlAsPdf(html) | No es necesario llamar a la API |
| <código>Cabecera X-API-KEY</código | License.LicenseKey = "..." | Establecer una vez al inicio |
id_plantilla | Cadena HTML estándar | Utilice cualquier HTML |
marcadores de posición {%name%} | $"{nombre}" Interpolación C# | .NET Standard |
POST /v1/merge | <código>PdfDocument.Merge(pdfs)</código | Local, instantáneo |
POST /v1/add-marca de agua | <código>pdf.ApplyWatermark(html)</código | Basado en HTML |
| Llamadas de retorno de webhooks | No es necesario | Los resultados son sincrónicos |
| Limitación de tarifas | No procede | Sin límites |
Mapeo de configuración
| Opción CraftMyPDF | Equivalente de IronPDF | Notas |
|---|---|---|
id_plantilla | Cadena HTML | Utilice su propio HTML |
datos JSON | Interpolació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: 20 | MargenTop = 20 | En milímetros |
| <código>cabecera</código | <código>HtmlHeader</código | Compatibilidad total con HTML |
footer | Pie de página HTML | Compatibilidad 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.comImplementació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.comIronPDF 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.comImplementació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.comEl 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.comImplementació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.comIronPDF 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.comPatró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.comNotas 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.comQuitar 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.comQuitar 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.comSync 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.comLista 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.






