IRONSOFTWAREHOME
VIDEOS

Wie man in Azure Blob Storage gespeicherte Bilder in C# rendert

Curtis Chau
Curtis Chau
Updated: 19. Juli 2026

Der Wechsel von PuppeteerSharpzu IronPDF verlagert Ihren PDF-Erstellungsablauf von einem Browser-Automatisierungstool mit einer über 300MB großen Chromium-Abhängigkeit zu einer speziell entwickelten PDF-Bibliothek mit automatischem Speichermanagement. Dieser Leitfaden bietet einen schrittweisen Migrationspfad, der den Laufzeit-Download von Chromium eliminiert, das gemeldete Speicherwachstum unter Last anspricht und umfassende PDF-Manipulationsmöglichkeiten hinzufügt.

Warum von PuppeteerSharpzu IronPDF migrieren

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. Speicherwachstum unter Last gemeldet, das manuelle Browser-Recycling erfordert. Unter anhaltender Last haben PuppeteerSharp-Benutzer von Speicheransammlungen über Browserinstanzen hinweg berichtet, die typischerweise durch manuelles Recycling von Prozessen behoben werden.

  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.

PuppeteerSharpvs IronPDF Vergleich

AspektPuppeteerSharpIronPDF
Primärer ZweckBrowser-AutomatisierungPDF-Erstellung
Chromium-Abhängigkeit300MB+separater DownloadEingebaute optimierte Engine
API-KomplexitätAsynchroner Browser/SeitenlebenszyklusSynchrone Einzeiler
InitialisierungBrowserFetcher.DownloadAsync() + LaunchAsyncnew ChromePdfRenderer()
SpeichermanagementManuelles Browser-RecyclingAutomatisch
Speicher unter LastWachstum bei hohen Arbeitslasten gemeldetStabil über fortlaufende Ausführungen
PDF/A-UnterstützungNicht verfügbarUnterstützt
PDF/UA BarrierefreiheitNicht verfügbarUnterstützt
PDF-BearbeitungNicht verfügbarZusammenführen, teilen, stempeln, bearbeiten
Digitale SignaturenNicht verfügbarUnterstützt
Thread-SicherheitBegrenzt (laut höheruplexigen Leitlinien)Voll
LizenzierungMIT (Open Source)Gewerbelizenz

Plattformunterstützung

Bibliothek.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDFVollVollVollVoll
PuppeteerSharpüber netstandard2.0VollVollVoll

IronPDFs Unterstützung für moderne .NET-Ziele bedeutet, dass es in die meisten bestehenden Anwendungen problemlos integriert werden kann.


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 -Zugriff: Möglichkeit zur Installation von NuGet -Paketen
  3. 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
SHELL

Kein BrowserFetcher.DownloadAsync() erforderlich mit IronPDF - die Rendering-Engine wird automatisch gebündelt.

Lizenz-Konfiguration

// 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;

Kern-API-Zuordnungen

PuppeteerSharpAPIIronPDF APINotizen
new BrowserFetcher().DownloadAsync()Nicht erforderlichKein Browser-Download
Puppeteer.LaunchAsync(options)Nicht erforderlichKeine Browser-Verwaltung
browser.NewPageAsync()Nicht erforderlichKein 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 erforderlichAutomatische Bereinigung
await browser.CloseAsync()Nicht erforderlichAutomatische Bereinigung
PdfOptions.FormatRenderingOptions.PaperSizePapierformat
PdfOptions.LandscapeRenderingOptions.PaperOrientationOrientierung
PdfOptions.MarginOptionsRenderingOptions.MarginTop/Bottom/Left/RightEinzelne Ränder
PdfOptions.PrintBackgroundRenderingOptions.PrintHtmlBackgroundsHintergrund Druck
PdfOptions.HeaderTemplateRenderingOptions.HtmlHeaderHTML-Kopfzeilen
PdfOptions.FooterTemplateRenderingOptions.HtmlFooterHTML-Fußzeilen
page.WaitForSelectorAsync()RenderingOptions.WaitFor.HtmlElementIdWarten 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");
    }
}

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");
    }
}

Dieses Beispiel verdeutlicht den grundlegenden architektonischen Unterschied. PuppeteerSharperfordert sechs asynchrone Operationen: BrowserFetcher.DownloadAsync() (300MB+ Chromium-Download), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), und page.PdfAsync(), plus ordnungsgemäße Entsorgung mit await using.

IronPDF beseitigt diese Komplexität: erstellen Sie ein ChromePdfRenderer, rufen Sie RenderHtmlAsPdf() auf, und SaveAs(). 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");
    }
}

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");
    }
}

PuppeteerSharp verwendet GoToAsync(), um zu einer URL zu navigieren, gefolgt von PdfAsync().IronPDF bietet eine einzelne RenderUrlAsPdf()-Methode, die Navigation und PDF-Erstellung in einem Aufruf handhabt. 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"
            }
        });
    }
}

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");
    }
}

Dieses Beispiel zeigt, wie PDF-Optionen zwischen den beiden Bibliotheken abgebildet werden. PuppeteerSharpnutzt PdfOptions mit Format, Landscape, und MarginOptions, die Zeichenfolgenwerte enthalten ("20mm").IronPDF verwendet RenderingOptions-Eigenschaften mit direkten Papiergrößen-Enums, Ausrichtungs-Enums und numerischen Randwerten in Millimetern.

Schlüssel-Mappings:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (numerische Millimeter)

Speicherwachstum unter anhaltender Last

Benutzer haben von Speicheransammlungen berichtet, die bei PuppeteerSharpunter anhaltender Last auftreten, normalerweise durch manuelles Browser-Recycling gemildert:

// PuppeteerSharp- memory growth typically requires periodic recycling
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();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations

//IronPDF- reuse a single renderer across operations
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
}
C#

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;
    }
}

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;
}

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;

Kopf-/Fußzeilen-Platzhalter-Konvertierung

PuppeteerSharp-KlasseIronPDF 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 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");

Wasserzeichen

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);

Passwortschutz

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

Digitale Signaturen

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

PDF/A-Konformität

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);

Zusammenfassung des Leistungsvergleichs

MetrikPuppeteerSharpIronPDFVerbesserung
Erste PDF-Datei (Kaltstart)45s+~20s55%+ schneller
Nachfolgende PDFsVariableEinheitlichVorhersehbar
Speichernutzung500MB+ (wächst)~50MB (stabil)90% weniger Speicherplatz
Speicherplatz (Chromium)300MB+0Downloads eliminieren
Browser herunterladenErforderlichNicht erforderlichNull-Einstellung
Thread-SicherheitBeschränktVollZuverlässige Gleichzeitigkeit
PDF-Erstellungszeit45s20s55% 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 PuppeteerSharp NuGet-Paket
  • Löschen Sie den .local-chromium-Ordner, um ~300MB Speicherplatz freizugeben
  • Installieren Sie das IronPdf NuGet-Paket: dotnet add package IronPdf

Code-Änderungen

  • Namespace-Importe aktualisieren
  • Entfernen Sie BrowserFetcher.DownloadAsync()-Aufrufe
  • Entfernen Sie Puppeteer.LaunchAsync() und Browser-Management
  • Ersetzen Sie page.SetContentAsync() + page.PdfAsync() durch RenderHtmlAsPdf()
  • Ersetzen Sie page.GoToAsync() + page.PdfAsync() durch RenderUrlAsPdf()
  • 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).

Hinweis:: PuppeteerSharp ist eingetragenes Warenzeichen seines jeweiligen Eigentümers. Diese Seite ist nicht mit PuppeteerSharpverbunden, wird nicht von PuppeteerSharpunterstützt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.
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 Handbücher.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Buchen Sie Ihre kostenlose Live-Demo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Kundenlogos von Iron Software
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.