Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Wie man von PuppeteerSharp zu IronPDF in C# migriert

Migrieren Sie von PuppeteerSharpzu IronPDF: Vollständiger C#-Migrationsleitfaden

Die Migration von PuppeteerSharpzuIronPDFverwandelt 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 PuppeteerSharpzuIronPDFmigrieren

PuppeteerSharpbesser 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 PuppeteerSharpfü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:

  1. 300MB+ Chromium-Downloads vor der ersten Verwendung erforderlich. Ein bedeutender Nachteil von PuppeteerSharpist 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.

  2. Speicherlecks unter Last, die manuelles Browser-Recycling erfordern. PuppeteerSharpist 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.

  3. Komplexe asynchrone Muster mit Browser-Lifecycle-Management.

  4. 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.

  5. Keine Unterstützung von PDF/A oder PDF/UA aus Gründen der Compliance. PuppeteerSharpkann keine PDF/A- (Archivierung) oder PDF/UA- (Barrierefreiheit) konforme Dokumente erstellen.

  6. Keine PDF-Manipulation - nur Generierung, kein Zusammenführen/Splitten/Bearbeiten. PuppeteerSharpist 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.

PuppeteerSharpvsIronPDFVergleich

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 Volle Unterstützung
PDF/UA Barrierefreiheit Nicht verfügbar Volle Unterstützung
PDF-Bearbeitung Nicht verfügbar Zusammenführen, teilen, stempeln, bearbeiten
Digitale Signaturen Nicht verfügbar Volle Unterstützung
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 vonIronPDFfür alle .NET-Plattformen stellt sicher, dass Entwickler die Software in verschiedenen Umgebungen ohne Kompatibilitätsprobleme einsetzen können. Damit istIronPDFeine flexible Wahl für moderne .NET-Anwendungen bis 2025 und 2026.


Bevor Sie beginnen

Voraussetzungen

  1. .NET-Umgebung: .NET Framework 4.6.2+ oder .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Access: Fähigkeit, NuGet-Pakete zu installieren
  3. IronPDF Lizenz: Beziehen Sie Ihren Lizenzschlüssel von ironPdf.com

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
SHELL

Kein BrowserFetcher.DownloadAsync() mit IronPDF erforderlich - die Rendering-Engine wird automatisch mitgeliefert.

Lizenz-Konfiguration

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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
Seite.GoToAsync(url) renderer.RenderUrlAsPdf(url) Direktes Rendering
Seite.SetContentAsync(html) renderer.RenderHtmlAsPdf(html) Direktes Rendering
Seite.PdfAsync(Pfad) pdf.SaveAs(Pfad) Nach dem Rendern
Warte auf page.CloseAsync() Nicht erforderlich Automatische Bereinigung
Warten Sie 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Dieses Beispiel verdeutlicht den grundlegenden architektonischen Unterschied. PuppeteerSharpbenötigt sechs asynchrone Operationen: BrowserFetcher.DownloadAsync() (300MB+ Chromium Download), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), und page.PdfAsync(), plus die richtige Entsorgung mit await using.

IronPDF beseitigt all diese Komplexität: Erstellen Sie einen ChromePdfRenderer, rufen Sie RenderHtmlAsPdf() und SaveAs() auf. Keine asynchronen Muster, kein Browser-Lebenszyklus, keine Chromium-Downloads. Der Ansatz vonIronPDFbietet 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PuppeteerSharp verwendet GoToAsync(), um zu einer URL zu navigieren, gefolgt von PdfAsync().IronPDFbietet eine einzige RenderUrlAsPdf()-Methode, die Navigation und PDF-Erzeugung in einem Aufruf erledigt. 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"
            }
        });
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Dieses Beispiel zeigt, wie PDF-Optionen zwischen den beiden Bibliotheken abgebildet werden. PuppeteerSharpverwendet PdfOptions mit Format, Landscape und MarginOptions mit String-Werten ("20mm").IronPDFverwendet RenderingOptions-Eigenschaften mit direkten enums für die Papiergröße, enums für die Ausrichtung und numerische Randwerte in Millimetern.

Schlüssel-Mappings:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.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
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF macht die Browser-Pooling-Infrastruktur überflüssig, die PuppeteerSharpbenö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;
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Kritische Hinweise zur Migration

Async zu Sync Konvertierung

PuppeteerSharp erfordert durchgehend async/await;IronPDFunterstü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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Umrechnung von Maßeinheiten

PuppeteerSharp verwendet String-Einheiten;IronPDFarbeitet 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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Kopf-/Fußzeilen-Platzhalter-Konvertierung

PuppeteerSharp-Klasse IronPDFPlatzhalter
<span> class="pageNumber"> {Seite}
<span> class="totalPages"> {Gesamtseiten}
<span> class="date"> {Datum}
<span> class="title"> {html-title}

Neue Funktionen nach der Migration

Nach der Umstellung aufIronPDFerhalten Sie Funktionen, die PuppeteerSharpnicht 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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Digitale Signaturen

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF/A-Konformität

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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

  • [Identifizieren Sie alle PuppeteerSharp-Verwendungen in der Codebasis
  • [Randwerte dokumentieren (Zeichenketten in Millimeter umwandeln)
  • [Beachten Sie die Syntax der Kopf-/Fußzeilen-Platzhalter für die Konvertierung
  • [Browser-Pooling/Recycling-Infrastruktur löschen
  • [Den IronPDF-Lizenzschlüssel erhalten Sie von ironpdf.com

Paketänderungen

  • [Entfernen Sie das NuGet-Paket PuppeteerSharp
  • [Löschen Sie den Ordner .local-chromium, um ~300 MB Speicherplatz zu gewinnen
  • [Installieren Sie das NuGet-Paket IronPdf: dotnet add package IronPdf

Code-Änderungen

  • [Namespace-Importe aktualisieren
  • [Entfernen Sie BrowserFetcher.DownloadAsync()-Aufrufe
  • [Entfernen Sie Puppeteer.LaunchAsync() und die Browserverwaltung
  • [Ersetzen Sie page.SetContentAsync() + page.PdfAsync() mit RenderHtmlAsPdf()
  • [Ersetzen Sie Seite.GoToAsync() + Seite.PdfAsync() mit RenderUrlAsPdf()
  • [Margin-Strings in Millimeterwerte umwandeln
  • [Konvertierung der Syntax von Kopf-/Fußzeilen-Platzhaltern
  • [Entfernen Sie den gesamten Browser-/Seitenverfügbarkeitscode
  • [Browser-Pooling-Infrastruktur löschen
  • [Lizenzinitialisierung beim Starten der Anwendung hinzufügen

Post-Migration

  • [Visueller Vergleich der PDF-Ausgabe
  • [Lasttest für Speicherstabilität (sollte ohne Recycling stabil bleiben)
  • [Überprüfen Sie die Darstellung von Kopf- und Fußzeilen mit Seitenzahlen
  • [Fügen Sie bei Bedarf neue Funktionen (Sicherheit, Wasserzeichen, Zusammenführen) hinzu

Abschluss

Bei der Wahl zwischen PuppeteerSharpundIronPDFsollten Sie die spezifischen Anforderungen Ihres Projekts berücksichtigen. PuppeteerSharpeignet sich hervorragend für Szenarien, in denen ein präzises HTML-Rendering erforderlich ist und der Aufwand für die Verwaltung von Chromium-Abhängigkeiten vertretbar ist. Im Gegensatz dazu bietetIronPDFein umfassendes Paket mit umfangreichen PDF-Bearbeitungsfunktionen, unübertroffener Benutzerfreundlichkeit und hervorragender Speicherverwaltung, das ideal für Entwickler ist, die Einfachheit und Vielseitigkeit suchen.

Die wichtigsten Änderungen bei dieser Migration sind:

  1. Architektur: Browser-Automatisierungstool → Zweckgebundene PDF-Bibliothek
  2. Abhängigkeiten: 300MB+Chromium Download → Gebündelte Rendering Engine
  3. Komplexität: 6+ asynchrone Operationen → 3 synchrone Aufrufe
  4. Speicherplatz: 500MB+ mit Lecks → ~50MB stabil
  5. Browser Management: Manueller Lebenszyklus und Recycling → Automatische Handhabung
  6. Margins: String-Einheiten ("20mm") → Numerische Millimeter (20)
  7. Platzhalter: CSS-Klassen (<span> class="pageNumber">) → Geschweifte Klammern ({page})
  8. Leistung: 45sKaltstart → ~20sKaltstart
  9. Neue Funktionen: PDF-Zusammenführung, Aufteilung, Wasserzeichen, Sicherheit, digitale Signaturen, PDF/A-Konformität

Beide Bibliotheken haben ihre eigenen Stärken und Schwächen. Wenn Sie diese kennen, können Sie das richtige Werkzeug für Ihre Anforderungen an die PDF-Erstellung und -Bearbeitung auswählen.

Entdecken Sie die vollständige IronPDF-Dokumentation, Tutorials und API-Referenz, um Ihre PuppeteerSharp-Migration zu beschleunigen.

Curtis Chau
Technischer Autor

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

Weiterlesen