Wie man Bilder in ein PDF in C# konvertiert
Warum von CraftMyPDFzu IronPDF migrieren?
Cloud-basierte PDF-APIs wie CraftMyPDFbringen 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.
-
Netzwerk-Latenz: Jede PDF-Generierung beinhaltet eine Netzwerk-Runde plus Warte- und Renderzeit (normalerweise Sekunden).IronPDF generiert lokal in Millisekunden.
-
Kosten pro PDF summieren sich: Kreditbasierte Preisgestaltung sammelt sich mit dem Volumen – Hochdurchsatz-Arbeitslasten verursachen signifikante wiederkehrende Kosten gegenüber 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: CraftMyPDFbenö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 | Netzwerk-Runde + Rendern (normalerweise Sekunden) | Millisekunden |
| Preisgestaltung | Kreditbasiertes 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 | Datenblätter Organisation | 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 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" .
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
Schritt 2: Namensraumreferenzen aktualisieren
Ersetzen Sie HTTP-Client-Namespaces durch IronPDF:
// Remove these
using RestSharp;
using System.IO;
// Add this
using IronPdf;Imports IronPdfSchritt 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.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
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client = New RestClient("https://api.craftmypdf.com/v1/create")
Dim request = 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 ModuleIronPDF-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");
}
}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 ClassIronPDF 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 = "file" // "file" returns binary PDF; "json" returns a CDN URL
});
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 = "file" ' "file" returns binary PDF; "json" returns a CDN URL
})
Dim response = client.Execute(request)
File.WriteAllBytes("webpage.pdf", response.RawBytes)
End Sub
End ModuleIronPDF-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");
}
}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 ClassDie IronPDF-Methode RenderUrlAsPdf erfasst die komplette Webseite einschließlich JavaScript-gerenderter Inhalte. 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
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 ModuleIronPDF-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
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 ModuleIronPDF unterstützt Platzhaltertokens wie {page} und {total-pages} für 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:
// CraftMyPDFtemplate variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});' CraftMyPDFtemplate variables
request.AddJsonBody(New With {
.template_id = "invoice-template",
.data = New With {
.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);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);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!netWebhook-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
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
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
Zusätzliche Ressourcen
Durch die Migration von CraftMyPDFzu 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.

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.