IRONSOFTWAREHOME
FILMY

Jak renderować obrazy przechowywane w usłudze Azure Blob Storage w języku C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Migracja zPuppeteerSharpdo IronPDF przenosi twój workflow generowania PDF z narzędzia do automatyzacji przeglądarek z zależnością Chromium Ponad 300 MB do dedykowanej biblioteki PDF z automatycznym zarządzaniem pamięcią. Ten przewodnik dostarcza krok po kroku ścieżkę migracji, która eliminuje pobieranie Chromium w czasie działania, adresuje zgłaszany wzrost pamięci pod obciążeniem i dodaje wszechstronne funkcje manipulacji PDF.

Dlaczego warto przejść zPuppeteerSharpna IronPDF

Zrozumienie PuppeteerSharp

PuppeteerSharp to port biblioteki Puppeteer firmy Google na platformę .NET, zapewniający funkcje automatyzacji przeglądarki w języku C#. Generuje pliki PDF przy użyciu wbudowanej w przeglądarce Chrome funkcji drukowania do pliku PDF — tak samo jak po naciśnięciu klawiszy Ctrl+P w przeglądarce. Wynikiem tego jest gotowy do druku plik zoptymalizowany pod kątem papieru, który różni się od tego, co widzisz na ekranie.

PuppeteerSharp został zaprojektowany do testowania stron internetowych i scrapingu, a nie do generowania dokumentów. Chociaż jest to możliwe, użyciePuppeteerSharpdo generowania plików PDF stwarza poważne wyzwania produkcyjne.

Problem automatyzacji przeglądarki

PuppeteerSharp został zaprojektowany do automatyzacji przeglądarek, a nie do generowania dokumentów. Powoduje to zasadnicze problemy podczas korzystania z niego w przypadku plików PDF:

  1. Przed pierwszym użyciem wymagane jest pobranie ponad 300 MB pakietu Chromium. Znaczącą wadąPuppeteerSharpjest jego spory rozmiar po wdrożeniu, głównie z powodu dołączonego pliku binarnego Chromium. Ten znaczny rozmiar może powodować nadmierne powiększenie obrazów Docker i powodować problemy z zimnym startem w środowiskach bezserwerowych.

  2. Raportowany wzrost pamięci pod obciążeniem wymagający ręcznego recyklingu przeglądarki. Pod obciążeniem, użytkownicyPuppeteerSharpzgłaszali kumulację pamięci między instancjami przeglądarek, zwykle adresowaną przez ręczne recykling procesów.

  3. Złożone wzorce asynchroniczne z zarządzaniem cyklem życia przeglądarki.

  4. Wydruk do pliku PDF (odpowiednik skrótu klawiszowego Ctrl+P, a nie zrzut ekranu). Układ strony może ulec zmianie, tła mogą być domyślnie pominięte, a wynik jest paginowany pod kątem drukowania, a nie dopasowany do okna przeglądarki.

  5. Brak obsługi formatów PDF/A lub PDF/UA w celu spełnienia wymagań zgodności.PuppeteerSharpnie może generować dokumentów zgodnych ze standardami PDF/A (archiwizacja) ani PDF/UA (dostępność).

  6. Brak manipulacji plikami PDF – wyłącznie generowanie, bez scałania/dzielenia/edycji. ChociażPuppeteerSharpskutecznie generuje pliki PDF, brakuje mu możliwości dalszej obróbki, takich jak scałanie, dzielenie, zabezpieczanie lub edycja plików PDF.

PorównaniePuppeteerSharpi IronPDF

AspektPuppeteerSharpIronPDF
Główny celAutomatyzacja przeglądarkiGenerowanie plików PDF
Zależność od ChromiumPobieranie osobnego pliku o rozmiarze ponad 300 MBWbudowany, zoptymalizowany silnik
Złożoność APIAsynchroniczny cykl życia przeglądarki/stronySynchroniczne jednozdaniowe
InicjalizacjaBrowserFetcher.DownloadAsync() + LaunchAsyncnew ChromePdfRenderer()
Zarządzanie pamięciąRęczne recykling przeglądarkiAutomatyczne
Pamięć pod obciążeniemRaportowany wzrost na ciężkich przepustowościachStabilność w biegu
Obsługa formatu PDF/ANiedostępneObsługiwane
Dostępność PDF/UANiedostępneObsługiwane
Edycja plików PDFNiedostępneŁączenie, dzielenie, stemplowanie, edycja
Podpisy cyfroweNiedostępneObsługiwane
Bezpieczeństwo wątkówOgraniczony (według wskazówek upstream)Pełna
LicencjonowanieMIT (open source)Licencja komercyjna

Obsługa platform

Biblioteka.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDFPełnaPełnaPełnaPełna
PuppeteerSharppoprzez netstandard2.0PełnaPełnaPełna

Wsparcie IronPDF w całym nowoczesnym celu .NET oznacza, że bez problemu wpasowuje się w większość istniejących aplikacji bez tarcia zgodności.


Zanim zaczniesz

Wymagania wstępne

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com

Zmiany w pakiecie NuGet

# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

Żaden BrowserFetcher.DownloadAsync() nie jest wymagany z IronPDF - silnik renderujący jest automatycznie dołączany.

Konfiguracja licencji

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Kompletna dokumentacija API

Zmiany w przestrzeni nazw

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

Mapowania podstawowych interfejsów API

PuppeteerSharp APIIronPDF APIUwagi
new BrowserFetcher().DownloadAsync()Nie jest potrzebneNie wymaga pobierania przeglądarki
Puppeteer.LaunchAsync(options)Nie jest potrzebneBrak zarządzania przeglądarką
browser.NewPageAsync()Nie jest potrzebneBrak kontekstu strony
page.GoToAsync(url)renderer.RenderUrlAsPdf(url)Bezpośrednie tłumaczenie
page.SetContentAsync(html)renderer.RenderHtmlAsPdf(html)Bezpośrednie tłumaczenie
page.PdfAsync(path)pdf.SaveAs(path)Po renderowaniu
await page.CloseAsync()Nie jest potrzebneAutomatyczne czyszczenie
await browser.CloseAsync()Nie jest potrzebneAutomatyczne czyszczenie
PdfOptions.FormatRenderingOptions.PaperSizeRozmiar papieru
PdfOptions.LandscapeRenderingOptions.PaperOrientationOrientacja
PdfOptions.MarginOptionsRenderingOptions.MarginTop/Bottom/Left/RightIndywidualne marginesy
PdfOptions.PrintBackgroundRenderingOptions.PrintHtmlBackgroundsDrukowanie w tle
PdfOptions.HeaderTemplateRenderingOptions.HtmlHeaderNagłówki HTML
PdfOptions.FooterTemplateRenderingOptions.HtmlFooterStopki HTML
page.WaitForSelectorAsync()RenderingOptions.WaitFor.HtmlElementIdPoczekaj na element

Przykłady migracji kodu

Przykład 1: Podstawowa konwersja HTML do PDF

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

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

Ten przykład ilustruje podstawową różnicę architektoniczną.PuppeteerSharpwymaga sześciu operacji asynchronicznych: BrowserFetcher.DownloadAsync() (300MB+ pobieranie Chromium), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), oraz page.PdfAsync(), plus właściwe zakończenie za pomocą await using.

IronPDF eliminuje całą tę złożoność: utwórz ChromePdfRenderer, wywołaj RenderHtmlAsPdf(), i SaveAs(). Bez wzorców asynchronicznych, bez cyklu życia przeglądarki, bez pobierania Chromium. Podejście IronPDF oferuje bardziej przejrzystą składnię i lepszą integrację z nowoczesnymi aplikacjami .NET. Kompleksowe przykłady można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: Konwersja adresów URL do formatu PDF

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

Po (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 używa GoToAsync() do nawigacji do URL, a następnie PdfAsync().IronPDF udostępnia pojedynczą metodę RenderUrlAsPdf(), która obsługuje nawigację i generowanie PDF w jednym wywołaniu. Dowiedz się więcej z naszych samouczków.

Przykład 3: Niestandardowe ustawienia strony z marginesami

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

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

Ten przykład pokazuje, jak opcje PDF są mapowane między dwiema bibliotekami.PuppeteerSharpużywa PdfOptions razem z Format, Landscape, i MarginOptions zawierającymi wartości string ("20mm").IronPDF używa właściwości RenderingOptions z bezpośrednimi Enum dla rozmiaru papieru, orientacji i wartościami numerycznymi marginesu w milimetrach.

Kluczowe powiązania:

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (liczbowo w milimetrach)

Wzrost pamięci pod ciągłym obciążeniem

Użytkownicy zgłaszali kumulację pamięci zPuppeteerSharppod ciągłym obciążeniem, zazwyczaj łagodzoną przez ręczne recykling przeglądarki:

//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 eliminuje potrzebę stosowania infrastruktury puli przeglądarek, której wymaga PuppeteerSharp:

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

Ważne uwagi dotyczące migracji

Konwersja z trybu asynchronicznego na synchroniczny

PuppeteerSharp wymaga stosowania async/await w całym tekście;IronPDF obsługuje operacje synchroniczne:

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

Konwersja jednostek marginesu

PuppeteerSharp używa jednostek typu string;IronPDF używa milimetrów:

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

Konwersja symboli zastępczych nagłówków/stopek

KlasaPuppeteerSharpIronPDF Placeholder
<span class='pageNumber'>{page}
<span class='totalPages'>{total-pages}
<span class='date'>{date}
<span class='title'>{html-title}

Nowe możliwości po migracji

Po migracji do IronPDF zyskujesz możliwości, którychPuppeteerSharpnie jest w stanie zapewnić:

Łączenie plików PDF

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");

Znaki wodne

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

Ochrona hasłem

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

Podpisy cyfrowe

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

Zgodność z PDF/A

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

Podsumowanie porównania wydajności

MetrykaPuppeteerSharpIronPDFUlepszenie
Pierwszy plik PDF (Cold Start)45s+~20 sO ponad 55% szybciej
Kolejne pliki PDFZmiennaSpójnośćPrzewidywalne
Wykorzystanie pamięci500 MB+ (wzrasta)~50 MB (wersja stabilna)O 90% mniej pamięci
Miejsce na dysku (Chromium)Ponad 300 MB0Wyeliminuj pliki do pobrania
Pobierz przeglądarkęWymaganeNie jest potrzebneZero konfiguracji
Bezpieczeństwo wątkówOgraniczonePełnaNiezawodna współbieżność
Czas generowania pliku PDF45s20sO 55% szybciej

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj wszystkie użyciaPuppeteerSharpw kodzie źródłowym
  • Wartości marginesów dokumentu (przelicz ciągi znaków na milimetry)
  • Zwróć uwagę na składnię symboli zastępczych nagłówka/stopki przy konwersji
  • Usuń infrastrukturę pulowania/recyklingu przeglądarek
  • Uzyskaj klucz licencyjny IronPDF ze strony ironpdf.com

Zmiany w pakiecie

  • Usuń pakiet NuGet PuppeteerSharp
  • Usuń folder .local-chromium, aby odzyskać około 300MB miejsca na dysku
  • Zainstaluj pakiet NuGet IronPdf: dotnet add package IronPdf

Zmiany w kodzie

  • Zaktualizuj importy przestrzeni nazw
  • Usuń wywołania BrowserFetcher.DownloadAsync()
  • Usuń Puppeteer.LaunchAsync() i zarządzanie przeglądarką
  • Zamień page.SetContentAsync() + page.PdfAsync() na RenderHtmlAsPdf()
  • Zamień page.GoToAsync() + page.PdfAsync() na RenderUrlAsPdf()
  • Zamień wartości marginesów na wartości w milimetrach
  • Przekształć składnię symboli zastępczych nagłówków/stopek
  • Usuń cały kod dotyczący zamykania przeglądarki/strony
  • Usuń infrastrukturę puli przeglądarek
  • Dodaj inicjalizację licencji podczas uruchamiania aplikacji

Po migracji

  • Wizualne porównanie pliku PDF
  • Test obciążeniowy pod kątem stabilności pamięci (powinna pozostać stabilna bez recyklingu)
  • Sprawdź renderowanie nagłówków/stopek wraz z numerami stron
  • W razie potrzeby dodaj nowe funkcje (zabezpieczenia, znaki wodne, scałanie)

Zwróć uwagę: PuppeteerSharp jest zarejestrowanym znakiem towarowym odpowiedniego właściciela. Ta witryna nie jest powiązana z, potwierdzona ani sponsorowana przez PuppeteerSharp. Wszystkie nazwy produktów, loga i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta