Migrieren von CraftMyPDF zu IronPDF in C#
Warum von CraftMyPDF zu IronPDF migrieren?
Cloud-basierte PDF-APIs wie CraftMyPDF bringen grundlegende Probleme mit sich, die sie für viele Produktionsumgebungen ungeeignet machen.
Das Problem mit Cloud-basierten PDF-APIs
-
Ihre Daten verlassen Ihr System: Jede HTML-Vorlage und jede JSON-Daten-Payload wird an die Server von CraftMyPDF übertragen. Bei Rechnungen, Verträgen, Krankenakten oder anderen sensiblen Geschäftsdaten entstehen dadurch Risiken für die Einhaltung von HIPAA, GDPR und SOC2.
-
Netzwerklatenz: Laut der Dokumentation von CraftMyPDF beträgt die Latenz 1,5-30 Sekunden pro PDF.IronPDF generiert lokal in Millisekunden.
-
Die Kosten pro PDF summieren sich: 10.000 PDFs pro Monat zu Abonnementpreisen verursachen erhebliche wiederkehrende Kosten im Vergleich zu einer einmaligen, unbefristeten Lizenz.
-
Druckoptimierte Ausgabe: Cloud-APIs optimieren häufig für den Druck – sie reduzieren Hintergründe und vereinfachen Farben, um "Tinte" zu sparen. Das Ergebnis sieht auf dem Bildschirm nie so aus wie Ihr HTML-Code.
- Vorlagenbindung: CraftMyPDF benötigt den hauseigenen Drag-and-Drop-Editor. Sie können kein Standard-HTML/CSS frei verwenden.
Architektur-Vergleich
| Aspekt | CraftMyPDF | IronPDF |
|---|---|---|
| Datenstandort | Cloud (Ihre Daten verlassen Ihr System) | Vor-Ort (Daten verlassen nie das Unternehmen) |
| Latenzzeit | 1.5-30 Sekunden pro PDF | Millisekunden |
| Preisgestaltung | Pro-PDF-Abonnement | Einmalige unbefristete Lizenz |
| Vorlagensystem | Nur proprietäres Drag-and-Drop | Jedes HTML/CSS/JavaScript |
| Ausgangsqualität | Druckoptimiert | Pixelgenaues Bildschirm-Rendering |
| Arbeitet offline | Nein (Internet erforderlich) | Ja |
| Konformität | Daten verlassen das Unternehmen | SOC2/HIPAA-freundlich |
Funktionsvergleich
| Feature | CraftMyPDF | IronPDF |
|---|---|---|
| HTML zu PDF | Über API-Vorlagen | ✅Nativ |
| URL zu PDF | Über API | ✅Nativ |
| Benutzerdefinierte Vorlagen | Nur Proprietärer Editor | ✅Beliebiges HTML |
| CSS3-Unterstützung | Beschränkt | ✅Vollständig |
| JavaScript-Rendering | Beschränkt | ✅Vollständig |
| PDFs zusammenführen/teilen | Über API | ✅Nativ |
| Wasserzeichen | Über API | ✅Nativ |
| Arbeitet offline | ❌ | ✅ |
| Selbst gehostet | ❌ | ✅ |
Vorbereitung auf die Migration
Voraussetzungen
Stellen Sie sicher, dass Ihre Umgebung diese Anforderungen erfüllt:
- .NET Framework 4.6.2+ oder .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ oder VS Code mit C#-Erweiterung
- NuGet Package Manager Zugang
- IronPDF-Lizenzschlüssel (kostenlose Testversion erhältlich unter ironpdf.com)
CraftMyPDF-Nutzung prüfen
Führen Sie diese Befehle in Ihrem Lösungsverzeichnis aus, um alle CraftMyPDF-Referenzen zu identifizieren:
# Find all CraftMyPDF usages 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 CraftMyPDF usages 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" .
Bahnbrechende Änderungen, die zu erwarten sind
| Ändern Sie | CraftMyPDF | IronPDF | Auswirkungen |
|---|---|---|---|
| Architektur | Cloud REST API | Lokale .NET-Bibliothek | HTTP-Aufrufe entfernen |
| Vorlagen | Proprietärer Editor | Standard-HTML | Vorlagen in HTML konvertieren |
| API-Schlüssel | Für jeden Aufruf erforderlich | Lizenz beim Start | Handhabung von API-Schlüsseln entfernen |
| Async-Muster | Erforderlich (HTTP) | Optional | Falls gewünscht, entfernen Sie await |
| Fehlerbehandlung | HTTP-Statuscodes | Ausnahmen | Try/Catch-Muster ändern |
| Datenbindung | JSON-Vorlagen | String-Interpolation | Vereinfachen Sie die Datenbindung |
Schritt-für-Schritt-Migrationsprozess
Schritt 1: NuGet-Pakete aktualisieren
Entfernen Sie die HTTP-Client-Bibliothek und installieren Sie 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
Schritt 2: Namensraumreferenzen aktualisieren
Ersetzen Sie HTTP-Client-Namespaces durch 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
Schritt 3: Lizenz konfigurieren (einmalig beim Starten)
Ersetzen Sie die API-Schlüssel-Header für jede Anfrage durch eine einzige Lizenzkonfiguration:
// 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"
Komplette API-Migrationsreferenz
API-Endpunkt-Zuordnung
| CraftMyPDF | IronPDF |
|---|---|
POST /v1/create |
renderer.RenderHtmlAsPdf(html) |
X-API-KEY Header |
License.LicenseKey = "..." |
template_id |
Standard-HTML-Zeichenfolge |
{%name%} Platzhalter |
$"{name}" C# Interpolation |
POST /v1/merge |
PdfDocument.Merge(pdfs) |
POST /v1/add-watermark |
pdf.ApplyWatermark(html) |
| Webhook-Rückrufe | Nicht erforderlich |
| Tarifbegrenzung | Nicht zutreffend |
Konfigurations-Mapping
| CraftMyPDF-Option | IronPDF-Äquivalent |
|---|---|
template_id |
HTML-Zeichenkette |
data JSON |
C# Interpolation |
page_size: "A4" |
PaperSize = PdfPaperSize.A4 |
orientation: "landscape" |
PaperOrientation = Landscape |
margin_top: 20 |
MarginTop = 20 |
header |
HtmlHeader |
footer |
HtmlFooter |
Beispiele für die Code-Migration
HTML-zu-PDF-Konvertierung
Der häufigste Vorgang demonstriert den grundlegenden Architekturwechsel von der Cloud-API zum lokalen Rendering.
CraftMyPDF-Einführung:
// 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
IronPDF-Implementierung:
// 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
IronPDF eliminiert die RestClient-Einrichtung, API-Schlüssel-Header, Vorlagen-IDs und die HTTP-Antwortbearbeitung und reduziert einen 15-zeiligen Cloud-Vorgang auf 4 Zeilen lokalen Code. Weitere Optionen finden Sie in der HTML zu PDF Dokumentation.
URL zu PDF-Konvertierung
CraftMyPDF-Einführung:
// 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);
}
}
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 = "pdf"
})
Dim response = client.Execute(request)
File.WriteAllBytes("webpage.pdf", response.RawBytes)
End Sub
End Module
IronPDF-Implementierung:
// 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
Die Methode RenderUrlAsPdf von IronPDF erfasst die gesamte Webseite einschließlich des per JavaScript gerenderten Inhalts. Weitere Optionen finden Sie in der URL zur PDF-Dokumentation.
Kopf- und Fußzeilen
CraftMyPDF-Einführung:
// 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
IronPDF-Implementierung:
// 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
IronPDF unterstützt Platzhalter-Tokens wie {page} und {total-pages} für die dynamische Seitennummerierung. Weitere Optionen finden Sie in der Kopf- und Fußzeilen-Dokumentation.
Vorlagenvariablen-Konvertierung
CraftMyPDF verwendet proprietäre Vorlagenplatzhalter, die in C#-String-Interpolation umgewandelt werden müssen:
CraftMyPDF-Muster:
// CraftMyPDF template variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
// CraftMyPDF template variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
IronPDF-Muster:
// 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)
Kritische Hinweise zur Migration
Allen HTTP-Code entfernen
Die wichtigste Änderung ist die Beseitigung von Netzwerkabhängigkeiten.IronPDF wird lokal ausgeführt - kein RestClient, keine API-Aufrufe, keine Antwortverarbeitung:
// 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)
Entferne Code zur Ratenbegrenzung
CraftMyPDF setzt API-Ratenlimits fest, die eine Wiederholungslogik erfordern.IronPDF hat keine Grenzen:
// 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!
Webhook-Handler entfernen
CraftMyPDF verwendet asynchrone Webhooks für die PDF-Vervollständigung.IronPDF ist synchron, d. h. die PDF-Datei ist sofort fertig:
// 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!
Sync standardmäßig
Entfernen Sie async/await-Muster, wenn sie nur für HTTP-Aufrufe benötigt werden:
// 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);
' CraftMyPDF- async required
Dim response = Await client.ExecuteAsync(request)
' IronPDF- sync by default (async available if needed)
Dim pdf = renderer.RenderHtmlAsPdf(html)
Post-Migrations-Checkliste
Überprüfen Sie nach Abschluss der Codemigration Folgendes:
- Alle PDF-Generierungstests ausführen
- Vergleichen Sie die Ausgabequalität (die Chromium-Engine von IronPDF liefert pixelgenaue Ergebnisse)
- Leistungsverbesserung messen (Millisekunden vs. Sekunden)
- Überprüfen Sie, ob alle Vorlagen korrekt konvertiert wurden.
- Test der Stapelverarbeitung ohne Ratenbegrenzungen
- Test in allen Zielumgebungen
- CI/CD-Pipelines aktualisieren
- CraftMyPDF-Abonnement kündigen
- API-Schlüssel aus secrets/config entfernen
Zukunftssicherheit für Ihre PDF-Infrastruktur
Mit .NET 10 am Horizont und C# 14, das neue Sprachfunktionen einführt, werden durch die Wahl einer lokalen PDF-Bibliothek die Risiken der Veraltung von Cloud-APIs und Bedenken hinsichtlich der Versionskompatibilität vermieden. Das unbefristete Lizenzierungsmodell von IronPDF bedeutet, dass sich Ihre Migrationsinvestition auf unbestimmte Zeit auszahlt, da sich die Projekte bis ins Jahr 2025 und 2026 erstrecken, ohne dass wiederkehrende Abonnementkosten anfallen oder Daten Ihre Infrastruktur verlassen.
Zusätzliche Ressourcen
Durch die Migration von CraftMyPDF zu IronPDF werden Cloud-Abhängigkeiten, Netzwerklatenz, Kosten pro PDF und die Bindung an Vorlagen eliminiert, während gleichzeitig ein pixelgenaues Chromium-Rendering bereitgestellt wird, das offline läuft. Der Übergang von REST-API-Aufrufen zu lokalen Methodenaufrufen vereinfacht Ihre Codebasis und sorgt dafür, dass sensible Dokumentdaten in Ihrer Infrastruktur bleiben.

