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" .
# 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
# 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 = "file" // "file" returns binary PDF; "json" returns a CDN URL
});
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 = "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 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 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
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 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
{
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);
// 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
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.

