Wie man von PuppeteerSharp zu IronPDF in C# migriert
Die Migration von PuppeteerSharp zu IronPDF verwandelt Ihren PDF-Generierungs-Workflow von einem Browser-Automatisierungstool mit mehr als 300 MB Abhängigkeiten in eine speziell entwickelte PDF-Bibliothek mit automatischer Speicherverwaltung. Dieser Leitfaden bietet einen vollständigen, schrittweisen Migrationspfad, der Chromium-Downloads überflüssig macht, Memory-Leak-Probleme löst und umfassende PDF-Bearbeitungsfunktionen bietet.
Warum von PuppeteerSharp zu IronPDF migrieren
PuppeteerSharp besser verstehen
PuppeteerSharp ist eine .NET-Portierung von Googles Puppeteer und bringt Browser-Automatisierungsfunktionen nach C#. Sie generiert PDFs mit der in Chrome integrierten Print-to-PDF-Funktion, die genauso funktioniert wie die Tastenkombination Strg+P in einem Browser. Das Ergebnis ist eine druckfertige, für Papier optimierte Ausgabe, die sich von dem unterscheidet, was Sie auf dem Bildschirm sehen.
PuppeteerSharp wurde für Web-Tests und Scraping entwickelt, nicht für die Dokumentenerstellung. Die Verwendung von PuppeteerSharp für die PDF-Generierung ist zwar möglich, stellt aber eine große Herausforderung für die Produktion dar.
Das Problem der Browser-Automatisierung
PuppeteerSharp wurde für die Browser-Automatisierung entwickelt, nicht für die Dokumentenerstellung. Dies führt zu grundlegenden Problemen bei der Verwendung für PDFs:
-
300MB+ Chromium-Downloads vor der ersten Verwendung erforderlich. Ein bedeutender Nachteil von PuppeteerSharp ist die beträchtliche Größe des Deployments, vor allem wegen der Chromium-Binärdatei, die es bündelt. Diese beträchtliche Größe kann Docker-Images aufblähen und in serverlosen Umgebungen zu Problemen beim Kaltstart führen.
-
Speicherlecks unter Last, die manuelles Browser-Recycling erfordern. PuppeteerSharp ist dafür bekannt, dass es bei starker Belastung zu Speicherlecks kommt. Die Anhäufung von Speicher durch Browserinstanzen erfordert manuelle Eingriffe für die Prozessverwaltung und das Recycling.
-
Komplexe asynchrone Muster mit Browser-Lifecycle-Management.
-
Drucken in PDF-Ausgabe (entspricht Strg+P, nicht Bildschirmaufnahme). Layouts können umbrochen werden, Hintergründe können standardmäßig weggelassen werden, und die Ausgabe ist für den Druck paginiert und passt sich nicht an das Browser-Ansichtsfenster an.
-
Keine Unterstützung von PDF/A oder PDF/UA aus Gründen der Compliance. PuppeteerSharp kann keine PDF/A- (Archivierung) oder PDF/UA- (Barrierefreiheit) konforme Dokumente erstellen.
- Keine PDF-Manipulation - nur Generierung, kein Zusammenführen/Splitten/Bearbeiten. PuppeteerSharp ist zwar effizient bei der Erstellung von PDFs, aber es fehlt an Funktionen für die weitere Bearbeitung, wie z. B. das Zusammenführen, Aufteilen, Sichern oder Bearbeiten von PDFs.
PuppeteerSharp vs IronPDF Vergleich
| Aspekt | PuppeteerSharp | IronPDF |
|---|---|---|
| Primärer Zweck | Browser-Automatisierung | PDF-Erstellung |
| Chromium-Abhängigkeit | 300MB+separater Download | Eingebaute optimierte Engine |
| API-Komplexität | Asynchroner Browser/Seitenlebenszyklus | Synchrone Einzeiler |
| Initialisierung | BrowserFetcher.DownloadAsync() + LaunchAsync |
new ChromePdfRenderer() |
| Speichermanagement | Manuelles Browser-Recycling erforderlich | Automatisch |
| Speicher unter Last | 500MB+ mit Lecks | ~50MB stabil |
| Kalter Start | 45+ Sekunden | ~20 Sekunden |
| PDF/A-Unterstützung | Nicht verfügbar | Unterstützt |
| PDF/UA Barrierefreiheit | Nicht verfügbar | Unterstützt |
| PDF-Bearbeitung | Nicht verfügbar | Zusammenführen, teilen, stempeln, bearbeiten |
| Digitale Signaturen | Nicht verfügbar | Unterstützt |
| Thread-Sicherheit | Beschränkt | Voll |
| Professionelle Unterstützung | Gemeinschaft | Kommerziell mit SLA |
Plattformunterstützung
| Bibliothek | .NET Framework 4.7.2| .NET Core 3.1| .NET 6-8| .NET 10| | --------- | :---: | :---: | :---: | :---: ||IronPDF| Voll | Voll | Voll | Voll || PuppeteerSharp| Beschränkt | Voll | Voll | Ausstehend | Die umfassende Unterstützung von IronPDF für alle .NET-Plattformen stellt sicher, dass Entwickler die Software in verschiedenen Umgebungen ohne Kompatibilitätsprobleme einsetzen können. Damit ist IronPDF eine flexible Wahl für moderne .NET-Anwendungen bis 2025 und 2026.
Bevor Sie beginnen
Voraussetzungen
- .NET -Umgebung: .NET Framework 4.6.2+ oder .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet -Zugriff: Möglichkeit zur Installation von NuGet -Paketen
- IronPDF -Lizenz: Ihren Lizenzschlüssel erhalten Sie unter IronPDF.
NuGet-Paketänderungen
# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf
# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf
Kein BrowserFetcher.DownloadAsync() erforderlich bei IronPDF - die Rendering-Engine ist automatisch integriert.
Lizenz-Konfiguration
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Komplette API-Referenz
Namensraumänderungen
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: PuppeteerSharp
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
Kern-API-Zuordnungen
| PuppeteerSharpAPI | IronPDFAPI | Notizen |
|---|---|---|
new BrowserFetcher().DownloadAsync() |
Nicht erforderlich | Kein Browser-Download |
Puppeteer.LaunchAsync(options) |
Nicht erforderlich | Keine Browser-Verwaltung |
browser.NewPageAsync() |
Nicht erforderlich | Kein Seitenkontext |
page.GoToAsync(url) |
renderer.RenderUrlAsPdf(url) |
Direktes Rendering |
page.SetContentAsync(html) |
renderer.RenderHtmlAsPdf(html) |
Direktes Rendering |
page.PdfAsync(path) |
pdf.SaveAs(path) |
Nach dem Rendern |
await page.CloseAsync() |
Nicht erforderlich | Automatische Bereinigung |
await browser.CloseAsync() |
Nicht erforderlich | Automatische Bereinigung |
PdfOptions.Format |
RenderingOptions.PaperSize |
Papierformat |
PdfOptions.Landscape |
RenderingOptions.PaperOrientation |
Orientierung |
PdfOptions.MarginOptions |
RenderingOptions.MarginTop/Bottom/Left/Right |
Einzelne Ränder |
PdfOptions.PrintBackground |
RenderingOptions.PrintHtmlBackgrounds |
Hintergrund Druck |
PdfOptions.HeaderTemplate |
RenderingOptions.HtmlHeader |
HTML-Kopfzeilen |
PdfOptions.FooterTemplate |
RenderingOptions.HtmlFooter |
HTML-Fußzeilen |
page.WaitForSelectorAsync() |
RenderingOptions.WaitFor.HtmlElementId |
Warten Sie auf das Element |
Beispiele für die Code-Migration
Beispiel 1: Einfache Konvertierung von HTML in PDF
Vor (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
await page.PdfAsync("output.pdf");
}
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
await page.PdfAsync("output.pdf");
}
}
Imports PuppeteerSharp
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Using page = Await browser.NewPageAsync()
Await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>")
Await page.PdfAsync("output.pdf")
End Using
End Using
End Function
End Module
Nach (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
Dieses Beispiel verdeutlicht den grundlegenden architektonischen Unterschied. PuppeteerSharp benötigt sechs asynchrone Operationen: BrowserFetcher.DownloadAsync() (300MB+ Chromium-Download), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync() und page.PdfAsync(), Plus die ordnungsgemäße Entsorgung mit await using.
IronPDF beseitigt diese ganze Komplexität: Erstellen Sie ein ChromePdfRenderer, rufen Sie RenderHtmlAsPdf() und SaveAs() auf. Keine asynchronen Muster, kein Browser-Lebenszyklus, keine Chromium-Downloads. Der Ansatz von IronPDF bietet eine sauberere Syntax und eine bessere Integration in moderne .NET-Anwendungen. Umfassende Beispiele finden Sie in der HTML to PDF Dokumentation.
Beispiel 2: Konvertierung von URL in PDF
Vor (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.example.com");
await page.PdfAsync("webpage.pdf");
}
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.example.com");
await page.PdfAsync("webpage.pdf");
}
}
Imports PuppeteerSharp
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Using page = Await browser.NewPageAsync()
Await page.GoToAsync("https://www.example.com")
Await page.PdfAsync("webpage.pdf")
End Using
End Using
End Function
End Module
Nach (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
PuppeteerSharp verwendet GoToAsync(), um zu einer URL zu navigieren, gefolgt von PdfAsync().IronPDF bietet eine einzige RenderUrlAsPdf() Methode, die Navigation und PDF-Generierung in einem Aufruf übernimmt. Erfahren Sie mehr in unseren Tutorials.
Beispiel 3: Benutzerdefinierte Seiteneinstellungen mit Rändern
Vor (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
await page.PdfAsync("custom.pdf", new PdfOptions
{
Format = PaperFormat.A4,
Landscape = true,
MarginOptions = new MarginOptions
{
Top = "20mm",
Bottom = "20mm",
Left = "20mm",
Right = "20mm"
}
});
}
}
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
await page.PdfAsync("custom.pdf", new PdfOptions
{
Format = PaperFormat.A4,
Landscape = true,
MarginOptions = new MarginOptions
{
Top = "20mm",
Bottom = "20mm",
Left = "20mm",
Right = "20mm"
}
});
}
}
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Await Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Await Using page = Await browser.NewPageAsync()
Await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>")
Await page.PdfAsync("custom.pdf", New PdfOptions With {
.Format = PaperFormat.A4,
.Landscape = True,
.MarginOptions = New MarginOptions With {
.Top = "20mm",
.Bottom = "20mm",
.Left = "20mm",
.Right = "20mm"
}
})
End Using
End Using
End Function
End Module
Nach (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
pdf.SaveAs("custom.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>")
pdf.SaveAs("custom.pdf")
End Sub
End Class
Dieses Beispiel zeigt, wie PDF-Optionen zwischen den beiden Bibliotheken abgebildet werden. PuppeteerSharp verwendet PdfOptions mit Format, Landscape und MarginOptions, die Zeichenkettenwerte ("20mm") enthalten.IronPDF verwendet RenderingOptions Eigenschaften mit direkten Papiergrößen-Enumerationen, Ausrichtungs-Enumerationen und numerischen Randwerten in Millimetern.
Schlüssel-Mappings:
Format = PaperFormat.A4→PaperSize = PdfPaperSize.A4Landscape = true→PaperOrientation = PdfPaperOrientation.LandscapeMarginOptions.Top = "20mm"→MarginTop = 20(numerische Millimeter)
Das Speicherleck-Problem
PuppeteerSharp ist berüchtigt für seine Speicherakkumulation bei anhaltender Belastung:
// ❌ PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
var page = await browser.NewPageAsync();
await page.SetContentAsync($"<h1>Document {i}</h1>");
await page.PdfAsync($"doc_{i}.pdf");
await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
pdf.SaveAs($"doc_{i}.pdf");
// Memory managed automatically
}
// ❌ PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
var page = await browser.NewPageAsync();
await page.SetContentAsync($"<h1>Document {i}</h1>");
await page.PdfAsync($"doc_{i}.pdf");
await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
pdf.SaveAs($"doc_{i}.pdf");
// Memory managed automatically
}
' ❌ PuppeteerSharp- Memory grows with each operation
' Requires explicit browser recycling every N operations
For i As Integer = 0 To 999
Dim page = Await browser.NewPageAsync()
Await page.SetContentAsync($"<h1>Document {i}</h1>")
Await page.PdfAsync($"doc_{i}.pdf")
Await page.CloseAsync() ' Memory still accumulates!
Next
' Must periodically: Await browser.CloseAsync() and re-launch
' ✅IronPDF- Stable memory, reuse renderer
Dim renderer As New ChromePdfRenderer()
For i As Integer = 0 To 999
Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>")
pdf.SaveAs($"doc_{i}.pdf")
' Memory managed automatically
Next
IronPDF macht die Browser-Pooling-Infrastruktur überflüssig, die PuppeteerSharp benötigt:
// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
private readonly ConcurrentBag<IBrowser> _browsers;
private readonly SemaphoreSlim _semaphore;
private int _operationCount;
// ... recycling logic ...
}
// After (IronPDF - simple reuse)
public class PdfService
{
private readonly ChromePdfRenderer _renderer = new();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
}
// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
private readonly ConcurrentBag<IBrowser> _browsers;
private readonly SemaphoreSlim _semaphore;
private int _operationCount;
// ... recycling logic ...
}
// After (IronPDF - simple reuse)
public class PdfService
{
private readonly ChromePdfRenderer _renderer = new();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
}
' Before (PuppeteerSharp - delete entire class)
Public Class PuppeteerBrowserPool
Private ReadOnly _browsers As ConcurrentBag(Of IBrowser)
Private ReadOnly _semaphore As SemaphoreSlim
Private _operationCount As Integer
' ... recycling logic ...
End Class
' After (IronPDF - simple reuse)
Public Class PdfService
Private ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
End Class
Kritische Hinweise zur Migration
Async zu Sync Konvertierung
PuppeteerSharp erfordert durchgehend async/await;IronPDF unterstützt synchrone Operationen:
// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
await new BrowserFetcher().DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(...);
await using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
return await page.PdfDataAsync();
}
// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
await new BrowserFetcher().DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(...);
await using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
return await page.PdfDataAsync();
}
// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports System.Threading.Tasks
Imports PuppeteerSharp
' PuppeteerSharp: Async required
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Await (New BrowserFetcher()).DownloadAsync()
Await Using browser = Await Puppeteer.LaunchAsync(...)
Await Using page = Await browser.NewPageAsync()
Await page.SetContentAsync(html)
Return Await page.PdfDataAsync()
End Using
End Using
End Function
' IronPDF: Sync default
Public Function GeneratePdf(html As String) As Byte()
Dim renderer = New ChromePdfRenderer()
Return renderer.RenderHtmlAsPdf(html).BinaryData
End Function
' Or async when needed
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
Umrechnung von Maßeinheiten
PuppeteerSharp verwendet String-Einheiten;IronPDF arbeitet mit numerischen Millimetern:
// PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
Top = "1in", // 25.4mm
Bottom = "0.75in", // 19mm
Left = "1cm", // 10mm
Right = "20px" // ~7.5mm at 96dpi
}
//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25; // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
// PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
Top = "1in", // 25.4mm
Bottom = "0.75in", // 19mm
Left = "1cm", // 10mm
Right = "20px" // ~7.5mm at 96dpi
}
//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25; // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;
' PuppeteerSharp- string units
MarginOptions = New MarginOptions With {
.Top = "1in", ' 25.4mm
.Bottom = "0.75in", ' 19mm
.Left = "1cm", ' 10mm
.Right = "20px" ' ~7.5mm at 96dpi
}
' IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25 ' mm
renderer.RenderingOptions.MarginBottom = 19
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 8
Kopf-/Fußzeilen-Platzhalter-Konvertierung
| PuppeteerSharp-Klasse | IronPDF Platzhalter |
|---|---|
<span class='pageNumber'> |
{page} |
<span class='totalPages'> |
{total-pages} |
<span class='date'> |
{date} |
<span class='title'> |
{html-title} |
Neue Funktionen nach der Migration
Nach der Umstellung auf IronPDF erhalten Sie Funktionen, die PuppeteerSharp nicht bieten kann:
PDF-Zusammenführung
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = renderer.RenderHtmlAsPdf(html1)
Dim pdf2 = renderer.RenderHtmlAsPdf(html2)
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
Wasserzeichen
var watermark = new TextStamper
{
Text = "CONFIDENTIAL",
FontSize = 48,
Opacity = 30,
Rotation = -45
};
pdf.ApplyStamp(watermark);
var watermark = new TextStamper
{
Text = "CONFIDENTIAL",
FontSize = 48,
Opacity = 30,
Rotation = -45
};
pdf.ApplyStamp(watermark);
Dim watermark As New TextStamper With {
.Text = "CONFIDENTIAL",
.FontSize = 48,
.Opacity = 30,
.Rotation = -45
}
pdf.ApplyStamp(watermark)
Passwortschutz
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "readonly"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
Digitale Signaturen
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
PDF/A-Konformität
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Zusammenfassung des Leistungsvergleichs
| Metrik | PuppeteerSharp | IronPDF | Verbesserung |
|---|---|---|---|
| Erste PDF-Datei (Kaltstart) | 45s+ | ~20s | 55%+ schneller |
| Nachfolgende PDFs | Variable | Einheitlich | Vorhersehbar |
| Speichernutzung | 500MB+ (wächst) | ~50MB (stabil) | 90% weniger Speicherplatz |
| Speicherplatz (Chromium) | 300MB+ | 0 | Downloads eliminieren |
| Browser herunterladen | Erforderlich | Nicht erforderlich | Null-Einstellung |
| Thread-Sicherheit | Beschränkt | Voll | Zuverlässige Gleichzeitigkeit |
| PDF-Erstellungszeit | 45s | 20s | 55% schneller |
Migrations-Checkliste
Vor der Migration
- Alle PuppeteerSharp-Verwendungen im Quellcode identifizieren
- Dokumentrandwerte (Zeichenketten in Millimeter umrechnen)
- Beachten Sie die Syntax für Kopf-/Fußzeilenplatzhalter zur Konvertierung
- Browser-Pooling-/Recycling-Infrastruktur löschen
- Den IronPDF Lizenzschlüssel erhalten Sie unter IronPDF
Paketänderungen
- Entfernen Sie das NuGet Paket
PuppeteerSharp - Löschen Sie den Ordner
.local-chromium, um ca. 300 MB Speicherplatz freizugeben. - Installieren Sie das NuGet Paket
IronPdf:dotnet add package IronPdf
Code-Änderungen
- Namespace-Importe aktualisieren
- Entfernen Sie
BrowserFetcher.DownloadAsync()Anrufe - Entfernen Sie
Puppeteer.LaunchAsync()und die Browserverwaltung - Ersetzen Sie
page.SetContentAsync()+page.PdfAsync()durchRenderHtmlAsPdf() - Ersetzen Sie
page.GoToAsync()+page.PdfAsync()durchRenderUrlAsPdf() - Randzeichenketten in Millimeterwerte umwandeln
- Syntax für Kopf-/Fußzeilenplatzhalter konvertieren
- Entfernen Sie jeglichen Browser-/Seitenfreigabecode.
- Browser-Pooling-Infrastruktur löschen
- Lizenzinitialisierung beim Anwendungsstart hinzufügen
Nach der Migration
- Visueller Vergleich der PDF-Ausgabe
- Lasttest zur Sicherstellung der Speicherstabilität (sollte ohne Neustart stabil bleiben)
- Überprüfen Sie die Darstellung von Kopf- und Fußzeilen mit Seitenzahlen
- Fügen Sie bei Bedarf neue Funktionen hinzu (Sicherheit, Wasserzeichen, Zusammenführung).

