Przejdź do treści stopki
PRZEWODNIKI MIGRACJI

Jak przejść z Playwright na IronPDF w języku C#

Przejście zPlaywrightfor .NET naIronPDFzmienia proces tworzenia plików PDF z narzędzia do automatyzacji przeglądarki, skupionego na testowaniu, w specjalnie zaprojektowaną bibliotekę PDF. Niniejszy przewodnik przedstawia kompletną, krok po kroku ścieżkę migracji, która eliminuje złożone wzorce asynchroniczne, zarządzanie cyklem życia przeglądarki oraz pobieranie plików o rozmiarze ponad 400 MB, zapewniając jednocześnie lepszą wydajność i profesjonalne funkcje plików PDF.

Dlaczego warto przejść zPlaywrightna IronPDF

ZrozumieniePlaywrightdla .NET

Playwright for .NET to kompleksowa platforma testowa firmy Microsoft, a NIE biblioteka do generowania dokumentów. Została stworzona od podstaw z myślą o automatycznym testowaniu w przeglądarkach Chromium, Firefox i WebKit.Playwrightdoskonale sprawdza się w testowaniu scenariuszy: klikaniu przycisków, wypełnianiu formularzy, przechwytywaniu żądań sieciowych, robieniu zrzutów ekranu oraz sprawdzaniu zgodności między przeglądarkami.

Kluczowe zrozumienie:Playwrightto narzędzie testowe, które zostało przystosowane do generowania plików PDF. Tworzenie plików PDF jest jedynie efektem ubocznym funkcji drukowania przeglądarki (Ctrl+P), a nie głównym celem projektu. Powoduje to fundamentalne niezgodności architektoniczne:

  • Architektura oparta na testowaniu: Stworzona z myślą o interaktywnym testowaniu w przeglądarce, a nie o tworzeniu dokumentów w trybie bezinterfejsowym
  • Obciążenie związane z obsługą wielu przeglądarek: pobiera ponad 400 MB plików binarnych przeglądarek (Chromium, Firefox, WebKit), nawet jeśli potrzebne jest jedynie generowanie plików PDF
  • API zorientowane na testy: złożone wzorce asynchroniczne zaprojektowane z myślą o procesach automatyzacji testów, a nie generowaniu dokumentów
  • Brak funkcji dokumentów: brak zgodności z PDF/A, podpisów cyfrowych, znaków wodnych, scalania, zabezpieczeń

Problem z frameworkiem testowym

Playwright został zaprojektowany do testowania end-to-end, 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 400 MB plików do przeglądarki. Domyślna konfiguracja Playwrighta wymaga pobrania wielu przeglądarek, co może stanowić problem w środowiskach o ścisłych ograniczeniach zasobów.

  2. Złożone wzorce asynchroniczne z kontekstami przeglądarki i zarządzaniem stronami. Programiści muszą zapoznać się z kontekstami przeglądarek i zarządzaniem stronami, a także z odpowiednimi praktykami w zakresie usuwania danych.

  3. Architektura oparta na testowaniu nie jest zoptymalizowana pod kątem generowania dokumentów.

  4. Ograniczenia funkcji "Drukuj do pliku PDF" odpowiadające drukowaniu w przeglądarce za pomocą skrótu klawiszowego Ctrl+P. Układ strony może ulec zmianie, tła mogą być domyślnie pominięte, a wynik jest paginowany do druku.

  5. Brak obsługi formatów PDF/A lub PDF/UA w celu zapewnienia zgodności z wymogąmi dostępności.Playwrightnie może tworzyć dokumentów zgodnych ze standardami PDF/A (archiwizacja) ani PDF/UA (dostępność). W przypadku sekcji 508, dyrektyw UE dotyczących dostępności lub długoterminowych wymagań archiwizacyjnych potrzebna będzie dedykowana biblioteka plików PDF.

  6. Operacje wymagające dużych zasobów, wymagające pełnych instancji przeglądarki.

Problem z konfiguracją środowiska testowego

Playwright wymaga rozbudowanej konfiguracji zorientowanej na testowanie, którą rozumieją inżynierowie ds. kontroli jakości, ale która nie powinna być potrzebna twórcom dokumentacji:

Wymagana instalacja przeglądarki:

# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
SHELL

Konfiguracja uruchamiania przeglądarki:

// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
' Testing-focused launch options for PDF generation
Using playwright = Await Playwright.CreateAsync()
    Dim browser = Await playwright.Chromium.LaunchAsync(New BrowserTypeLaunchOptions With {
        .Headless = True,  ' Required for server environments
        .Args = New String() { "--disable-gpu", "--no-sandbox" } ' Linux/Docker configs
    })
End Using
$vbLabelText   $csharpLabel

Opcje konfiguracyjne dotyczące testowania:

  • Headless: Należy skonfigurować tryb bezinterfejsu graficznego dla środowiska produkcyjnego (domyślnie dla testów jest tryb z interfejsem graficznym)
  • SlowMo: Opóźnienia testowe (nieistotne dla generowania plików PDF)
  • Devtools: Konfiguracja narzędzi testowych (nie jest wymagana w przypadku dokumentów)
  • ExecutablePath: Niestandardowe ścieżki przeglądarki dla środowisk testowych
  • Proxy: Przechwytywanie ruchu sieciowego do celów testowych (niepotrzebne obciążenie)
  • DownloadsPath: Zarządzanie artefaktami testowymi
  • TracesDir: Ślady wykonania testów

Zarządzanie kontekstem przeglądarki:

// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
' Complex context lifecycle from testing paradigm
Dim context = Await browser.NewContextAsync(New BrowserNewContextOptions With {
    .ViewportSize = New ViewportSize With {.Width = 1920, .Height = 1080},
    .UserAgent = "custom-user-agent",
    .Locale = "en-US",
    .TimezoneId = "America/New_York"
})
Dim page = Await context.NewPageAsync()
' ... generate PDF ...
Await context.CloseAsync()  ' Manual cleanup required
Await browser.CloseAsync()  ' Manual cleanup required
$vbLabelText   $csharpLabel

Złożoność związana z obsługą wielu przeglądarek:

//Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
//Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
Option Strict On



' Playwright downloads multiple browsers by default
Await playwright.Chromium.LaunchAsync()  ' For Chrome testing
Await playwright.Firefox.LaunchAsync()   ' For Firefox testing
Await playwright.Webkit.LaunchAsync()    ' For Safari testing
' All downloaded but only Chromium needed for PDF generation
$vbLabelText   $csharpLabel

IronPDF: Zero konfiguracji, zero instalacji

// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' No installation, no configuration, no lifecycle management
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Prawdziwe rozwiązanie typu "plug-and-play":IronPDFeliminuje wszystkie obciążenia związane z frameworkami testowymi. Żadnych poleceń instalacyjnych przeglądarki, żadnej konfiguracji bezinterfejsowej, żadnego zarządzania kontekstem — wystarczy utworzyć instancję i wyrenderować. Stworzone specjalnie do generowania dokumentów, a nie zaadaptowane z narzędzi testowych.

Porównanie wydajnościPlaywrighti IronPDF

Metryka Playwright IronPDF
Główny cel Framework testowania E2E Generowanie dokumentów PDF
Filozofia projektowania Narzędzie testowe z funkcją obsługi plików PDF Biblioteka PDF stworzona specjalnie do tego celu
Wymagana instalacja playwright install (pobieranie 400 MB+) Brak — natychmiastowa konfiguracja
Wymagana konfiguracja Tryb bezinterfejsowy, opcje uruchamiania przeglądarki, konteksty Zero konfiguracji
Pobierz przeglądarkę Ponad 400 MB (Chromium, Firefox, WebKit) Wbudowany, zoptymalizowany silnik
Złożoność konfiguracji Instalacja z wiersza poleceń + konfiguracja uruchamiania Plug-and-play
Pierwsze renderowanie (zimny start) 4,5 sekundy 2,8 sekundy
Kolejne wersje 3,8–4,1 sekundy 0,8–1,2 sekundy
Pamięć na konwersję 280–420 MB 80–120 MB
Złożoność API Złożony cykl życia przeglądarki/kontekstu/strony w trybie asynchronicznym Proste, synchroniczne jednozdaniowe polecenia
Inicjalizacja CreateAsync() + LaunchAsync() + NewPageAsync() new ChromePdfRenderer()
Obsługa formatu PDF/A Niedostępne Obsługiwane
Dostępność PDF/UA Niedostępne Obsługiwane
Podpisy cyfrowe Niedostępne Obsługiwane
Edycja plików PDF Niedostępne Łączenie, dzielenie, stemplowanie, edycja
Profesjonalne wsparcie Społeczność Reklama z umową SLA

IronPDF został stworzony z myślą o generowaniu plików PDF. W przeciwieństwie do Playwright, który koncentruje się na testowaniu,IronPDFoferuje szereg funkcji API związanych z dokumentami. Opiera się na pojedynczej, zoptymalizowanej instancji Chromium, co sprzyja wydajności i umożliwia zarówno operacje synchroniczne, jak i asynchroniczne. Dzięki temu programiści, którzy potrzebują funkcji związanych z plikami PDF, zyskują prostszy model mentalny i przebieg pracy.

Dla zespołów planujących wdrożenie .NET 10 i C# 14 w latach 2025 i 2026,IronPDFoferuje specjalnie zaprojektowane rozwiązanie do obsługi plików PDF, które eliminuje obciążenie związane z automatyzacją przeglądarki, zapewniając jednocześnie lepszą wydajność i profesjonalne funkcje dokumentów.

Podsumowanie

Playwright to framework testowy firmy Microsoft przeznaczony dla inżynierów ds. kontroli jakości przeprowadzających automatyczne testy w różnych przeglądarkach. Wykorzystanie go do generowania plików PDF stanowi niedopasowanie architektury, które wymaga rozległej wiedzy z zakresu testowania:

  • Ręczna instalacja przeglądarki (playwright install)
  • Konfiguracja trybu bezinterfejsowego dla środowiska produkcyjnego
  • Zarządzanie opcjami uruchamiania przeglądarki
  • Konfiguracja cyklu życia kontekstu
  • Pobieranie plików w wielu przeglądarkach (400 MB+), gdy potrzebna jest tylko jedna
  • Złożone wzorce async/await z paradygmatu testowania

IronPDF to biblioteka do generowania dokumentów przeznaczona dla programistów tworzących procesy pracy z plikami PDF. To prawdziwie rozwiązanie typu "plug-and-play":

  • Nie wymaga instalacji — działa od razu
  • Zero konfiguracji — inteligentne ustawienia domyślne
  • Zero pobrań przeglądarki — w zestawie zoptymalizowany silnik
  • Proste API — nie trzeba uczyć się żadnych koncepcji testowania
  • Automatyczne zarządzanie zasobami — brak złożoności cyklu życia

Jeśli chcesz testować aplikacje internetowe w różnych przeglądarkach, skorzystaj z Playwright. Jeśli chcesz generować dokumenty PDF, użyj IronPDF. Nie dostosowuj frameworka testowego do generowania dokumentów — użyj narzędzia stworzonego specjalnie do tego zadania.


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 Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
# Remove Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
SHELL

W przypadkuIronPDFnie jest wymagany playwright install — silnik renderujący jest dołączany automatycznie.

Konfiguracja licencji

// 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"
$vbLabelText   $csharpLabel

Kompletna dokumentacija API

Zmiany w przestrzeni nazw

// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: Playwright
Imports Microsoft.Playwright
Imports System.Threading.Tasks

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Mapowania podstawowych interfejsów API

Interfejs APIPlaywright IronPDF API
Playwright.CreateAsync() new ChromePdfRenderer()
playwright.Chromium.LaunchAsync() Nie jest potrzebne
browser.NewPageAsync() Nie jest potrzebne
page.GotoAsync(url) renderer.RenderUrlAsPdf(url)
page.SetContentAsync(html) + page.PdfAsync() renderer.RenderHtmlAsPdf(html)
page.CloseAsync() Nie jest potrzebne
browser.CloseAsync() Nie jest potrzebne
PagePdfOptions.Format RenderingOptions.PaperSize
PagePdfOptions.Margin RenderingOptions.MarginTop/Bottom/Left/Right
PagePdfOptions.DisplayHeaderFooter TextFooter
PagePdfOptions.HeaderTemplate RenderingOptions.HtmlHeader
PagePdfOptions.FooterTemplate RenderingOptions.HtmlFooter
<span class='pageNumber'> {page}

Przykłady migracji kodu

Przykład 1: Konwersja ciągu znaków HTML do formatu PDF

Przed (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Await page.SetContentAsync(html)
        Await page.PdfAsync(New PagePdfOptions With {.Path = "output.pdf"})

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(ByVal args As String())
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Ten przykład ilustruje podstawową różnicę architektoniczną.Playwrightwymaga pięciu operacji asynchronicznych: Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync() oraz PdfAsync(), a także jawne czyszczenie przeglądarki za pomocą CloseAsync().

IronPDF eliminuje całą tę złożoność: utwórz ChromePdfRenderer, wywołaj RenderHtmlAsPdf() i SaveAs(). Żadnych wzorców asynchronicznych, żadnego cyklu życia przeglądarki, żadnego kodu czyszczącego. PodejścieIronPDFoferuje 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 (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Await page.GotoAsync("https://www.example.com")
        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "webpage.pdf",
            .Format = "A4"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

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");
    }
}
// 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
$vbLabelText   $csharpLabel

Playwright używa GotoAsync() do przejścia do adresu URL, po którym następuje PdfAsync().IronPDFudostępnia jedną metodę RenderUrlAsPdf(), która obsługuje nawigację i generowanie plików PDF w jednym wywołaniu. Należy pamiętać, żePlaywrightwymaga określenia Format w PagePdfOptions, podczas gdyIronPDFużywa RenderingOptions.PaperSize do konfiguracji rozmiaru papieru. Dowiedz się więcej z naszych samouczków.

Przykład 3: Niestandardowy rozmiar strony z marginesami

Przed (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>")
                Await page.PdfAsync(New PagePdfOptions With {
                    .Path = "custom.pdf",
                    .Format = "Letter",
                    .Margin = New Margin With {
                        .Top = "1in",
                        .Bottom = "1in",
                        .Left = "0.5in",
                        .Right = "0.5in"
                    }
                })
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
        renderer.RenderingOptions.MarginTop = 25
        renderer.RenderingOptions.MarginBottom = 25
        renderer.RenderingOptions.MarginLeft = 12
        renderer.RenderingOptions.MarginRight = 12
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>")
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Playwright używa wartości marginesów opartych na ciągach znaków ("1in", "0.5in"), podczas gdyIronPDFużywa wartości liczbowych w milimetrach. Przelicznik wynosi: 1 cal = 25,4 mm, więc "1in" staje się 25, a "0.5in" staje się w przybliżeniu 12. Format = "Letter" wPlaywrightodpowiada PaperSize = PdfPaperSize.Letter w IronPDF.

Przykład 4: Nagłówki, stopki i ustawienia niestandardowe

Przed (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Await page.SetContentAsync(html)

        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "custom.pdf",
            .Format = "A4",
            .Margin = New Margin With {.Top = "1cm", .Bottom = "1cm", .Left = "1cm", .Right = "1cm"},
            .DisplayHeaderFooter = True,
            .HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            .FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

Po (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        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.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main(args As String())
        Dim renderer = New ChromePdfRenderer()

        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 10
        renderer.RenderingOptions.MarginRight = 10
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.TextHeader.CenterText = "Header"
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}"

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Ten przykład pokazuje różnicę w składni symboli zastępczych nagłówka/stopki.Playwrightużywa symbolów zastępczych opartych na klasach HTML (<span class='pageNumber'></span>), podczas gdyIronPDFużywa symbolów zastępczych w postaci nawiasów klamrowych ({page}). Należy pamiętać, żePlaywrightwymaga DisplayHeaderFooter = true do włączenia nagłówków/stopek, podczas gdyIronPDFwłącza je automatycznie po ustawieniu treści nagłówka/stopki.


Ważne uwagi dotyczące migracji

Konwersja z trybu asynchronicznego na synchroniczny

Playwright wymaga stosowania async/await w całym kodzie;IronPDFobsługuje operacje synchroniczne:

// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
Imports System.Threading.Tasks
Imports Microsoft.Playwright

Public Class PdfGenerator
    ' Playwright: Async required
    Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync(html)
                Return Await page.PdfAsync()
            End Using
        End Using
    End Function

    ' IronPDF: Sync is simpler
    Public Function GeneratePdf(html As String) As Byte()
        Dim renderer = New ChromePdfRenderer()
        Return renderer.RenderHtmlAsPdf(html).BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Konwersja jednostek marginesu

Playwright używa jednostek typu string;IronPDFużywa milimetrów:

Playwright IronPDF(mm)
"1in" 25
"0.5in" 12
"1cm" 10

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

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

Eliminacja cyklu życia przeglądarki

Usuń cały kod zarządzania przeglądarką:

// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' Playwright: Explicit cleanup required
Await page.CloseAsync()
Await browser.CloseAsync()
playwright.Dispose()

' IronPDF: No disposal needed - just use the renderer
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Nowe możliwości po migracji

Po migracji doIronPDFzyskujesz możliwości, którychPlaywrightnie 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");
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")
$vbLabelText   $csharpLabel

Znaki wodne

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ochrona hasłem

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
$vbLabelText   $csharpLabel

Podpisy cyfrowe

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)
$vbLabelText   $csharpLabel

Zgodność z PDF/A

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
$vbLabelText   $csharpLabel

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj cały kod generujący pliki PDF w Playwright
  • Wartości marginesów dokumentu (przelicz cal/cm na milimetry)
  • Zwróć uwagę na składnię symboli zastępczych nagłówka/stopki przy konwersji
  • Uzyskaj klucz licencyjnyIronPDFze strony ironpdf.com

Zmiany w pakiecie

  • Usuń pakiet NuGet Microsoft.Playwright
  • Usuń folder .playwright, aby odzyskać około 400 MB miejsca na dysku
  • Zainstaluj pakiet NuGet IronPdf: dotnet add package IronPdf

Zmiany w kodzie

  • Zaktualizuj importy przestrzeni nazw
  • Zastąp async browser lifecycle przez ChromePdfRenderer
  • 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
  • Dodaj inicjalizację licencji podczas uruchamiania aplikacji

Po migracji

  • Wizualne porównanie pliku PDF
  • Sprawdź renderowanie nagłówków/stopek wraz z numerami stron
  • Sprawdź marginesy i dokładność rozmiaru strony
  • W razie potrzeby dodaj nowe funkcje (zabezpieczenia, znaki wodne, scalanie)

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

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie