Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer de CraftMyPDF vers IronPDF en C#

Migrer de CraftMyPDFàIronPDF: Guide de migration complet en C

CraftMyPDF est une API de génération de PDF basée sur le cloud qui utilise un éditeur de modèles propriétaire par glisser-déposer et des points de terminaison REST pour créer des documents. Bien que cette approche soit pratique pour les cas d'utilisation simples, l'architecture en nuage introduit des problèmes de confidentialité des données, de latence du réseau, de coûts par PDF et de verrouillage des modèles qui deviennent problématiques à grande échelle. Ce guide complet fournit un chemin de migration étape par étape de CraftMyPDFversIronPDF- une bibliothèque PDF .NET locale qui élimine les dépendances HTTP, fonctionne hors ligne et offre un rendu Chromium parfait au pixel près avec une licence perpétuelle unique.

Pourquoi migrer de CraftMyPDFà IronPDF?

Les API PDF basées sur le cloud, telles que CraftMyPDF, présentent des problèmes fondamentaux qui les rendent inadaptées à de nombreux environnements de production.

Le problème des API PDF basées sur le cloud

  1. Vos données quittent votre système : chaque modèle HTML et chaque charge utile de données JSON sont transmis aux serveurs de CraftMyPDF. Pour les factures, les contrats, les dossiers médicaux ou toute autre donnée commerciale sensible, cela crée des risques de conformité HIPAA, GDPR et SOC2.

  2. Latitude du réseau : La documentation de CraftMyPDFindique 1,5 à 30 secondes par PDF.IronPDFgénère localement en quelques millisecondes.

  3. Les coûts par PDF s'additionnent : 10 000 PDF par mois à des tarifs d'abonnement engendrent des coûts récurrents importants par rapport à une licence perpétuelle unique.

  4. Sortie optimisée pour l'impression : Les API dans le nuage sont souvent optimisées pour l'impression, réduisant les arrière-plans et simplifiant les couleurs pour économiser de l'"encre" Le résultat ne ressemble jamais à votre HTML à l'écran.

  5. Blocage du modèle : CraftMyPDFnécessite son propre éditeur par glisser-déposer. Vous ne pouvez pas utiliser librement les langages HTML/CSS standard.

Comparaison des architectures

Aspect CraftMyPDF IronPDF
Lieu des données Cloud (vos données quittent votre système) Sur site (les données ne quittent jamais le site)
Latence 1.5-30 secondes par PDF Millisecondes
Tarification Abonnement au format PDF Licence perpétuelle à usage unique
Système de modèles Drag-and-drop propriétaire uniquement Tout HTML/CSS/JavaScript
Qualité de la production Optimisé pour l'impression Rendu d'écran parfait
Travaille hors ligne Non (nécessite internet) Oui
Conformité Organisation des feuilles de données Conformité SOC2/HIPAA

Comparaison des fonctionnalités

Fonction CraftMyPDF IronPDF
HTML vers PDF Via des modèles d'API ✅Natif
URL vers PDF Via API ✅Natif
Modèles personnalisés Éditeur propriétaire uniquement ✅Tout HTML
Prise en charge de CSS3 Limité ✅Complet
Rendu JavaScript Limité ✅Complet
Fusionner/séparer des PDF Via API ✅Natif
Filigranes Via API ✅Natif
Travail hors ligne
Auto-hébergé

Préparation de la migration

Prérequis

Assurez-vous que votre environnement répond à ces exigences :

  • .NET Framework 4.6.2+ ou .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ ou VS Code avec l'extension C#
  • Accès au gestionnaire de paquets NuGet
  • Clé de licenceIronPDF(essai gratuit disponible sur ironpdf.com)

Audit de l'utilisation de CraftMyPDF

Exécutez ces commandes dans votre répertoire de solutions pour identifier toutes les références à 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

Modifications importantes à prévoir

Changement CraftMyPDF IronPDF Impact
Architecture Cloud REST API Bibliothèque .NET locale Supprimer les appels HTTP
Modèles Éditeur propriétaire HTML standard Convertir les modèles en HTML
Clé API Nécessaire pour chaque appel Licence au démarrage Suppression de la gestion des clés API
Modèle asynchrone Obligatoire (HTTP) En option Supprimer l'attente si vous le souhaitez
Gestion des erreurs Codes d'état HTTP Exceptions Modifier les modèles try/catch
Liaison de données Modèles JSON Interpolation de chaînes de caractères Simplifier la liaison des données

Processus de migration étape par étape

Étape 1 : Mise à jour des paquets NuGet

Supprimez la bibliothèque client HTTP et installezIronPDF:

# 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

Étape 2 : Mise à jour des références aux espaces de noms

Remplacer les espaces de noms des clients HTTP parIronPDF:

// 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

Étape 3 : configuration de la licence (une fois au démarrage)

Remplacer les en-têtes de clés API par requête par une configuration de licence unique :

// 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

Référence complète de migration des API

Mappage des points d'extrémité de l'interface utilisateur

CraftMyPDF IronPDF Notes
POST /v1/create renderer.RenderHtmlAsPdf(html) Aucun appel à l'API n'est nécessaire
X-API-KEY en-tête License.LicenseKey = "..." Définir une fois au démarrage
id_modèle Chaîne HTML standard Utilisez n'importe quel HTML
{%name%} caractères génériques $"{nom}" Interpolation C# .NET Standard
POST /v1/merge PdfDocument.Merge(pdfs) Local, instantané
POST /v1/add-watermark pdf.ApplyWatermark(html) Basé sur HTML
Rappels de webhook Pas nécessaire Les résultats sont synchrones
Limitation des tarifs Sans objet Aucune limite

Cartographie de configuration

Option CraftMyPDF Équivalent d'IronPDF Notes
id_modèle Chaîne HTML Utilisez votre propre HTML
données JSON Interpolation C# $"Hello {nom}"
page_size : "A4" PaperSize = PdfPaperSize.A4
orientation : "paysage" PaperOrientation = Landscape
margin_top : 20 MarginTop = 20 En millimètres
en-tête HtmlHeader Prise en charge complète du HTML
footer HtmlFooter Prise en charge complète du HTML

Exemples de migration de code

Conversion HTML en PDF

L'opération la plus courante démontre le changement fondamental de l'architecture, qui passe de l'API en nuage au rendu local.

Mise en œuvre 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

Mise en œuvre d'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 élimine la configuration de RestClient, les en-têtes de clé API, les ID de modèle et la gestion des réponses HTTP, réduisant ainsi une opération en nuage de 15 lignes à 4 lignes de code local. Pour plus d'options, consultez la documentation HTML vers PDF.

Conversion d'URL en PDF

Mise en œuvre 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

Mise en œuvre d'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

La méthode RenderUrlAsPdf d'IronPDF capture la page web complète, y compris le contenu rendu par JavaScript. Pour plus d'options, consultez l'URL vers la documentation PDF.

En-têtes et pieds de page

Mise en œuvre 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

Mise en œuvre d'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 prend en charge les jetons placeholder tels que {page} et {total-pages} pour la numérotation dynamique des pages. Pour plus d'options, consultez la documentation sur les en-têtes et les pieds de page.

Conversion de variables de modèles

CraftMyPDF utilise des espaces réservés de modèles propriétaires qui doivent être convertis en interpolation de chaînes C# :

CraftMyPDF Pattern:

// 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

Modèle 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

Notesde migration essentielles

Supprimer tout le code HTTP

Le changement le plus important est l'élimination des dépendances de réseau.IronPDFs'exécute localement - pas de RestClient, pas d'appels API, pas de gestion des réponses :

// 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

Supprimer le code de limitation de vitesse

CraftMyPDF impose des limites de débit API nécessitant une logique de relance.IronPDFn'a pas de 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!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Supprimer les gestionnaires de hooks Web

CraftMyPDF utilise des webhooks asynchrones pour compléter les PDF.IronPDFest synchrone - le PDF est prêt immédiatement :

// 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 par défaut

Supprimer les motifs async/await s'ils n'étaient nécessaires que pour les appels 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

Liste de contrôle post-migration

Après avoir effectué la migration du code, vérifiez les points suivants :

  • [Exécuter tous les tests de génération de PDF
  • [Comparer la qualité de la sortie (le moteur Chromium d'IronPDF offre un rendu au pixel près)
  • [Mesurer l'amélioration des performances (millisecondes vs. secondes)
  • [Vérifier que tous les modèles ont été convertis correctement
  • [Test de traitement par lots sans limite de débit
  • [Test dans tous les environnements cibles
  • [Mise à jour des pipelines CI/CD
  • [Annuler l'abonnement à CraftMyPDF
  • [Supprimer la clé API de secrets/config

Protéger l'avenir de votre infrastructure PDF

Avec .NET 10 à l'horizon et C# 14 introduisant de nouvelles fonctionnalités de langage, le choix d'une bibliothèque PDF locale élimine les risques de dépréciation de l'API cloud et les problèmes de compatibilité des versions. Le modèle de licence perpétuelle d'IronPDF signifie que votre investissement dans la migration porte ses fruits indéfiniment, à mesure que les projets se prolongent en 2025 et 2026 - sans coûts d'abonnement récurrents ni données quittant votre infrastructure.

Ressources supplémentaires


La migration de CraftMyPDFversIronPDFélimine les dépendances au cloud, la latence du réseau, les coûts par PDF et le verrouillage des modèles tout en offrant un rendu Chromium au pixel près qui fonctionne hors ligne. Le passage des appels à l'API REST aux invocations de méthodes locales simplifie votre base de code et conserve les données documentaires sensibles au sein de votre infrastructure.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite