Cómo migrar de CraftMyPDF a IronPDF en C#
¿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 transmiten 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 la red: la propia documentación de CraftMyPDFindica entre 1,5 y 30 segundos por PDF.IronPDFgenera localmente en milisegundos.
Los costos por PDF se acumulan: 10 000 PDF al mes con tarifas de suscripción generan costos recurrentes significativos en comparación con una licencia perpetua de uso único.
Salida optimizada para impresión: Las API en la nube suelen optimizar la impresión, reduciendo los fondos y simplificando los colores para ahorrar tinta. El resultado nunca se ve igual que el HTML en pantalla.
- Bloqueo de plantilla: CraftMyPDFrequiere su editor propietario 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;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";Referencia 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);
}
}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");
}
}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);
}
}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");
}
}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);
}
}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");
}
}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
}
});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);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);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!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!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);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 deIronPDFofrece una representación perfecta de píxeles)
- Medir la mejora del rendimiento (milisegundos frente a segundos)
- Verificar que todas las plantillas se hayan convertido correctamente
- Procesamiento de lotes de prueba sin límites de velocidad
- Prueba en todos los entornos de destino
- Actualizar los pipelines de CI/CD
- Cancelar la suscripción a CraftMyPDF
- Eliminar la clave API de secretos/configuración
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.






