IRONSOFTWAREHOME
FILMY

Jak oczyścić plik PDF w języku C# | IronPDF

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

WebView2, kontrola przeglądarki Edge/Chromium do osadzania od Microsoftu (Microsoft.Web.WebView2), oferuje programistom sposób na wyświetlanie treści webowych w aplikacjach Windows. Jednak kiedy zespoły deweloperskie próbują użyć WebView2 do generowania PDF, napotykają ograniczenia budowlane, które czynią go złym rozwiązaniem do scenariuszy bezgłowych i serwerowych. WebView2 to kontrolka osadzająca przeglądarkę zaprojektowana dla aplikacji UI, a nie biblioteka do generowania PDF.

Przewodnik ten dostarczy migracyjna ścieżka z WebView2 do IronPDF, z porównaniami kodowymi i praktycznymi przykładami dla deweloperów .NET, którzy potrzebują niezawodnej generacji PDF w swoich aplikacjach.

Dlaczego WebView2 jest złym wyborem do generowania PDF

Przed badaniem ścieżki migracji, warto zrozumieć dlaczego WebView2 jest złym wyborem dla bezgłowego tworzenia PDF:

ProblemWpływWaga
Wycieki pamięciZgłoszone przerosty pamięci w długotrwałych procesach, które wielokrotnie tworzą instancje WebView2.WYSOKI
Tylko dla systemu WindowsBrak wsparcia dla Linux, macOS, Docker lub środowisk w chmurze innych niż WindowsKLUCZOWE
Wymagany wątek dotyczący interfejsu użytkownikaMusi działać na wątku STA z pompą komunikatów. Nieodpowiednia dla serwerów webowych lub interfejsów API działających w tle.KLUCZOWE
Nieprzeznaczone do plików PDFPrintToPdfAsync to dodatkowa funkcjonalność, nie podstawowa cechaWYSOKI
Niestabilne w usługachZgłoszone awarie i zawieszki w Windows Services i pracownikach działających w tleWYSOKI
Złożony przepływ asynchronicznyZdarzenia nawigacyjne, wywołania zwrotne po zakończeniu, warunki wyściguWYSOKI
Zależność środowiska uruchomieniowego EdgeWymaga zainstalowanego czasu działania Edge WebView2 na docelowej maszynieSREDNI
Brak trybu bezinterfejsowegoZaprojektowane wokół kontrolki UI; nie jest bezgłowy rendererSREDNI
WydajnośćPowolny start, duże zużycie zasobówSREDNI
Brak Wsparcia PDFMicrosoft nie pozycjonuje WebView2 jako produktu do generowania PDFSREDNI

Scenariusze awarii w praktyce

Te wzorce kodu często powodują problemy w produkcji:

// WARNING: These patterns are known to cause problems in headless / server scenarios

// Problem 1: Memory growth - creates a new WebView2 per PDF
public async Task<byte[]> GeneratePdf(string html) // High call volume accumulates memory
{
    using var webView = new WebView2(); // Disposal does not fully reclaim native resources
    await webView.EnsureCoreWebView2Async();
    webView.CoreWebView2.NavigateToString(html);
    // ... memory growth reported over time
}

// Problem 2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
    var webView = new WebView2(); // InvalidOperationException
}

// Problem 3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
    protected override async Task ExecuteAsync(CancellationToken token)
    {
        // WebView2 + no message pump = hangs, crashes, undefined behavior
    }
}

IronPDF vs WebView2: Porównanie funkcji

Zrozumienie różnic architektonicznych pomaga decydentom technicznym w ocenie inwestycji w migrację:

AspektWebView2IronPDF
CelSterowanie przeglądarką (UI)Biblioteka PDF (przeznaczona dla formatu PDF)
Gotowe do produkcjiNIETAK
Zarządzanie pamięciąZgłoszone przerosty pamięci w długotrwałychStabilny, prawidłowo usunięty
Obsługa platformTylko dla systemu WindowsWindows, Linux, macOS, Docker
Wymagania dotyczące wątkuSTA + Message PumpKażdy wątek
Serwer/ChmuraNieobsługiwaneObsługiwane
Azure/AWS/GCPProblematyczneDziała idealnie
DockerNiemożliweDostępne są oficjalne zdjęcia
ASP.NET CoreNie mogę pracowaćWsparcie na najwyższym poziomie
Usługi w tleNiestabilnyStabilny
Obsługiwane kontekstyTylko WinForms/WPFDowolny kontekst .NET: konsola, internet, komputer stacjonarny
HTML do PDFPodstawowePełna
URL do pliku PDFPodstawowePełna
Nagłówki/stopkiNIETak (HTML)
Znaki wodneNIETak
Łączenie plików PDFNIETak
Podział plików PDFNIETak
Podpisy cyfroweNIETak
Ochrona hasłemNIETak
Zgodność z PDF/ANIETak
Profesjonalne wsparcieBrak dla pliku PDFTak
DokumentacjaOgraniczoneObszerne

Szybki start: Migracja z WebView2 do IronPDF

Migrację można rozpocząć natychmiast, wykonując te podstawowe kroki.

Krok 1: Usuń pakiet WebView2

dotnet remove package Microsoft.Web.WebView2
SHELL

Lub usuń z pliku projektu:

<!-- REMOVE these packages -->
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
XML

Krok 2: Zainstaluj IronPDF

dotnet add package IronPdf

Krok 3: Aktualizacja przestrzeni nazw

Zastąp przestrzenie nazw WebView2 przestrzenią nazw IronPDF:

// Before (WebView2)
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;

// After (IronPDF)
using IronPdf;

Krok 4: Inicjalizacja licencji

Dodaj inicjalizację licencji podczas uruchamiania aplikacji:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Przykłady migracji kodu

Konwersja HTML do PDF

Najbardziej podstawowa operacja ujawnia różnicę w złożoności między tymi podejściami do obsługi plików PDF w środowisku .NET.

Podejście WebView2:

// NuGet: Install-Package Microsoft.Web.WebView2
// (the WinForms host lives in the same package; no separate .WinForms package)
// Requires the Edge WebView2 Runtime installed on the target machine. Windows-only.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;

class Program
{
    static async Task Main()
    {
        var webView = new WebView2();
        await webView.EnsureCoreWebView2Async();

        webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>");
        await Task.Delay(2000);

        // PrintToPdfAsync(path, settings) returns Task<bool>; null = default settings
        bool ok = await webView.CoreWebView2.PrintToPdfAsync("output.pdf", null);
    }
}

Podejście IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
        pdf.SaveAs("output.pdf");
    }
}

Wersja WebView2 wymaga asynchronicznej inicjalizacji za pomocą EnsureCoreWebView2Async(), nawigacji przez NavigateToString(), Task.Delay(2000) do oczekiwania na renderowanie, oraz końcowego wywołania PrintToPdfAsync, które zwraca Task<bool> wskazujący na sukces. IronPDF eliminuje tę ceremonię - utwórz renderer, renderuj HTML, zapisz.

W przypadku zaawansowanych scenariuszy konwersji HTML do PDF zapoznaj się z przewodnikiem po konwersji HTML do PDF.

Konwersja adresów URL do formatu PDF

Konwersja adresu URL do formatu PDF ilustruje złożony, asynchroniczny przebieg nawigacji w WebView2.

Podejście WebView2:

// NuGet: Install-Package Microsoft.Web.WebView2
// (Edge Chromium control; requires Edge WebView2 Runtime; Windows-only.)
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;

class Program
{
    static async Task Main()
    {
        var webView = new WebView2();
        await webView.EnsureCoreWebView2Async();

        var tcs = new TaskCompletionSource<bool>();
        webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);

        webView.CoreWebView2.Navigate("https://example.com");
        await tcs.Task;
        await Task.Delay(1000);

        var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
            "Page.printToPDF",
            "{\"printBackground\": true}"
        );

        var base64 = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
        File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
    }
}

Podejście IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("output.pdf");
    }
}

WebView2 wymaga utworzenia TaskCompletionSource, subskrypcji zdarzeń NavigationCompleted, wywołania CallDevToolsProtocolMethodAsync, parsowania odpowiedzi JSON oraz dekodowania danych base64. IronPDF udostępnia dedykowaną metodę RenderUrlAsPdf, która wewnętrznie zajmuje się całą złożonością.

Zapoznaj się z dokumentacją dotyczącą konwersji adresów URL do formatu PDF, aby uzyskać informacje na temat uwierzytelniania i opcji niestandardowych nagłówków.

Niestandardowe ustawienia PDF z plików HTML

Konfiguracja orientacji strony, marginesów i rozmiaru papieru wymaga różnych podejść.

Podejście WebView2:

// NuGet: Install-Package Microsoft.Web.WebView2
// CreatePrintSettings() lives on CoreWebView2Environment.
// Margin* / PageWidth / PageHeight on CoreWebView2PrintSettings are in INCHES.
// PrintToPdfAsync(path, settings) returns Task<bool> (true on success) — not a stream.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;

class Program
{
    static async Task Main()
    {
        var webView = new WebView2();
        await webView.EnsureCoreWebView2Async();

        string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
        webView.CoreWebView2.Navigate(htmlFile);

        await Task.Delay(3000);

        CoreWebView2PrintSettings printSettings = webView.CoreWebView2.Environment.CreatePrintSettings();
        printSettings.Orientation = CoreWebView2PrintOrientation.Landscape;
        printSettings.MarginTop = 0.5;     // inches
        printSettings.MarginBottom = 0.5;  // inches
        printSettings.ShouldPrintBackgrounds = true;

        bool ok = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings);
        Console.WriteLine(ok ? "Custom PDF created" : "PrintToPdfAsync returned false");
    }
}

Podejście IronPDF:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 50;
        renderer.RenderingOptions.MarginBottom = 50;
        
        string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
        var pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
        pdf.SaveAs("custom.pdf");
        
        Console.WriteLine("Custom PDF created");
    }
}

WebView2 wymaga 3-sekundowego Task.Delay (niewiarygodne przypuszczenie), tworzenia ustawień drukowania przez CoreWebView2.Environment oraz await na PrintToPdfAsync(path, settings), które zwraca Task<bool> zamiast strumienia. WebView2 wyraża marginesy w calach; IronPDF używa milimetrów za pośrednictwem bezpośrednich właściwości RenderingOptions.

Zaawansowane opcje PDF z protokołem DevTools

Złożone konfiguracje WebView2 wymagają interakcji z protokołem DevTools.

Podejście WebView2:

// NuGet: Install-Package Microsoft.Web.WebView2
// Uses raw Chrome DevTools Protocol via CallDevToolsProtocolMethodAsync.
// (Page.printToPDF returns base64 in result.data; units are inches.)
using System;
using System.IO;
using System.Threading.Tasks;
using System.Text.Json;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;

class Program
{
    static async Task Main()
    {
        var webView = new WebView2();
        await webView.EnsureCoreWebView2Async();
        
        var htmlPath = Path.GetFullPath("document.html");
        var tcs = new TaskCompletionSource<bool>();
        webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);
        
        webView.CoreWebView2.Navigate($"file:///{htmlPath}");
        await tcs.Task;
        await Task.Delay(1000);
        
        var options = new
        {
            landscape = false,
            printBackground = true,
            paperWidth = 8.5,
            paperHeight = 11,
            marginTop = 0.4,
            marginBottom = 0.4,
            marginLeft = 0.4,
            marginRight = 0.4
        };
        
        var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
            "Page.printToPDF",
            JsonSerializer.Serialize(options)
        );
        
        var base64 = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
        File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
    }
}
C#

Podejście 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 = 40;
        renderer.RenderingOptions.MarginBottom = 40;
        renderer.RenderingOptions.MarginLeft = 40;
        renderer.RenderingOptions.MarginRight = 40;
        renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        
        var pdf = renderer.RenderHtmlFileAsPdf("document.html");
        pdf.SaveAs("output.pdf");
    }
}

WebView2 wymaga konstruowania anonimowych obiektów, serializacji do JSON, wywoływania metod Protokółu DevTools, parsowania odpowiedzi JSON oraz ręcznego dekodowania base64. IronPDF dostarcza typowane właściwości z jasnymi nazwami i wartościami wyliczeniowymi jak PdfPaperSize.Letter.

Odnośnik do dokumentacji API WebView2 dla IronPDF

To mapowanie przyspiesza migrację, pokazując bezpośrednie odpowiedniki API:

Interfejs API WebView2Odpowiednik IronPDF
new WebView2()new ChromePdfRenderer()
EnsureCoreWebView2Async()Nie dotyczy
NavigateToString(html) + PrintToPdfAsync()RenderHtmlAsPdf(html)
Navigate(url) + PrintToPdfAsync()RenderUrlAsPdf(url)
PrintSettings.PageWidthRenderingOptions.PaperSize
PrintSettings.PageHeightRenderingOptions.PaperSize
PrintSettings.MarginTopRenderingOptions.MarginTop
PrintSettings.OrientationRenderingOptions.PaperOrientation
ExecuteScriptAsync()JavaScript w HTML
AddScriptToExecuteOnDocumentCreatedAsync()HTML <script> tagi
Zdarzenia nawigacyjneWaitFor.JavaScript()
CallDevToolsProtocolMethodAsync("Page.printToPDF")RenderHtmlAsPdf()

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Przerost Pamięci

Problem WebView2: Przerost pamięci zgłoszony w długotrwałych procesach, które wielokrotnie tworzą instancje WebView2, szczególnie bez stabilnej pompy komunikatów.

Rozwiązanie IronPDF: Przewidywalne zarządzanie i przyjazny cykl życia using:

// IronPDF - clean memory management
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
    pdf.SaveAs("output.pdf");
} // Properly disposed

Problem 2: Brak wątku UI w aplikacjach internetowych

Problem z WebView2: Wymaga wątku STA z pompą komunikatów. Kontrolery ASP.NET Core nie mogą tworzyć instancji WebView2.

Rozwiązanie IronPDF: Działa na dowolnym wątku:

// ASP.NET Core - just works
public async Task<IActionResult> GetPdf()
{
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}

Problem 3: Złożoność zdarzeń nawigacyjnych

Problem WebView2: Konieczne jest obsłużenie asynchronicznych zdarzeń nawigacji, wywołań zwrotnych zakończenia oraz wyścigów z TaskCompletionSource.

Rozwiązanie IronPDF: Synchroniczne lub asynchroniczne wywołanie pojedynczej metody:

// Simple and predictable
var pdf = renderer.RenderHtmlAsPdf(html);
// or
var pdf = await renderer.RenderHtmlAsPdfAsync(html);

Problem 4: Jednostki miary

WebView2 używa cali jako jednostki wymiarów (8,5 x 11 dla formatu Letter). IronPDF używa milimetrów dla większej precyzji pomiarów.

Podejście do konwersji:

// WebView2: PageWidth = 8.27 (inches for A4)
// IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

// Or custom size in mm
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297);

Lista kontrolna migracji WebView2

Zadania przed migracją

Zadokumentuj cały kod generujący pliki PDF w WebView2 w swoim kodzie źródłowym. Zidentyfikuj, gdzie WebView2 powoduje problemy (wycieki pamięci, awarie, problemy z wdrażaniem). Zapoznaj się z dokumentacją IronPDF, aby poznać możliwości tego rozwiązania.

Zadania związane z aktualizacją kodu

  1. Usuń pakiet NuGet Microsoft.Web.WebView2
  2. Zainstaluj pakiet NuGet IronPDF
  3. Usunąć zależności od WinForms/WPF, jeśli są one używane wyłącznie do generowania plików PDF
  4. Zastąp kod WebView2 używając ChromePdfRenderer
  5. Usuń wymagania dotyczące wątków STA
  6. Usuń obsługę zdarzeń nawigacji i wzorce TaskCompletionSource
  7. Usuń hacki Task.Delay
  8. Dodaj inicjalizację licencji IronPDF podczas uruchamiania

Testy po migracji

Po migracji należy zweryfikować następujące aspekty:

  • Przetestuj w środowisku docelowym (ASP.NET, Docker, Linux, jeśli dotyczy)
  • Sprawdź, czy jakość pliku PDF odpowiada oczekiwaniom
  • Sprawdź, czy strony z dużą ilością kodu JavaScript wyświetlają się poprawnie
  • Sprawdź, czy nagłówki i stopki działają z funkcjami HTML IronPDF
  • Test obciążeniowy stabilności pamięci podczas długotrwałej pracy
  • Testuj scenariusze długotrwałe bez gromadzenia pamięci

Aktualizacje dotyczące wdrażania

  • W razie potrzeby zaktualizuj obrazy Docker (usuń Edge WebView2 Runtime)
  • Usunąć zależność od środowiska uruchomieniowego Edge WebView2 z wymagań serwera
  • Aktualizacja dokumentacji dotyczącej wymagań serwerowych
  • Sprawdź, czy wdrożenie wielopłatformowe działa na platformach docelowych
Zwróć uwagę: WebView2 jest zarejestrowanym znakiem towarowym jego właściciela. Ta strona nie jest powiązana z firmą Microsoft, nie jest przez nią promowana ani sponsorowana. Wszystkie nazwy produktów, logo 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