Wie man von WebView2 zu IronPDF in C# migriert
WebView2, Microsofts einbettbares Edge/Chromium-Browser-Steuerelement, bietet Entwicklern eine Möglichkeit zur Anzeige von Webinhalten in Windows-Anwendungen. Wenn Entwicklungsteams jedoch versuchen, WebView2 für die PDF-Generierung zu nutzen, stoßen sie auf gravierende architektonische Einschränkungen, die es für Produktionsumgebungen ungeeignet machen. WebView2 ist ein Steuerelement zur Browsereinbettung, das für UI-Anwendungen entwickelt wurde, und keine Bibliothek zur PDF-Erzeugung.
Dieser Leitfaden bietet einen vollständigen Migrationspfad von WebView2 zu IronPDF, mit Schritt-für-Schritt-Anleitungen, Code-Vergleichen und praktischen Beispielen für professionelle .NET-Entwickler, die eine zuverlässige PDF-Erzeugung in ihren Anwendungen benötigen.
Kritische Warnung: WebView2 ist NICHT für die PDF-Erzeugung geeignet
Bevor der Migrationspfad untersucht wird, müssen Entwicklungsteams verstehen, warum WebView2 bei der PDF-Erstellung erhebliche Probleme verursacht:
| Problem | Auswirkungen | Schweregrad |
|---|---|---|
| Speicherlecks | WebView2 hat gut dokumentierte Speicherlecks in langlaufenden Prozessen. Ihr Server wird abstürzen. | KRITISCH |
| Nur für Windows | Keine Unterstützung für Linux, macOS, Docker oder Cloud-Umgebungen | KRITISCH |
| UI Thread erforderlich | Muss auf STA Thread mit Message Pump laufen. Kann nicht in Webservern oder APIs arbeiten. | KRITISCH |
| Nicht für PDFs geeignet | PrintToPdfAsync ist eine nachträgliche Überlegung, keine Kernfunktion. |
HOCH |
| Instabil in Dienstleistungen | Häufige Abstürze und Hänger bei Windows-Diensten und Hintergrundarbeitern | HOCH |
| Komplexer asynchroner Fluss | Navigationsereignisse, Rückrufe zum Abschluss, Race Conditions | HOCH |
| Edge Runtime-Abhängigkeit | Erfordert die Installation von Edge WebView2Runtime auf dem Zielrechner | MEDIUM |
| Kein Headless-Modus | Erstellt immer UI-Elemente, auch wenn sie versteckt sind | MEDIUM |
| Leistung | Langsames Starten, hoher Ressourcenverbrauch | MEDIUM |
| Keine professionelle Unterstützung | Microsoft unterstützt den Anwendungsfall der PDF-Generierung nicht | MEDIUM |
Fehlerszenarien in der realen Welt
Diese Codemuster führen zu Produktionsfehlern:
// DANGER: This code WILL cause problems in production
// Problem1: Memory leak - creates new WebView2for each PDF
public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash
{
using var webView = new WebView2(); // Memory not fully released!
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString(html);
// ... memory accumulates until OOM
}
// Problem2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
// Problem3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
// WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
// DANGER: This code WILL cause problems in production
// Problem1: Memory leak - creates new WebView2for each PDF
public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash
{
using var webView = new WebView2(); // Memory not fully released!
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString(html);
// ... memory accumulates until OOM
}
// Problem2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
// Problem3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
// WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
' DANGER: This code WILL cause problems in production
' Problem1: Memory leak - creates new WebView2 for each PDF
Public Async Function GeneratePdf(html As String) As Task(Of Byte()) ' Called 1000x/day = server crash
Using webView As New WebView2() ' Memory not fully released!
Await webView.EnsureCoreWebView2Async()
webView.CoreWebView2.NavigateToString(html)
' ... memory accumulates until OOM
End Using
End Function
' Problem2: UI thread requirement - crashes in ASP.NET
Public Function GenerateReport() As IActionResult ' FAILS - no STA thread
Dim webView As New WebView2() ' InvalidOperationException
' Additional code needed to handle the webView
Return Nothing
End Function
' Problem3: Windows Service instability
Public Class PdfService
Inherits BackgroundService ' Random crashes
Protected Overrides Async Function ExecuteAsync(token As CancellationToken) As Task
' WebView2+ no message pump = hangs, crashes, undefined behavior
End Function
End Class
IronPDF vs. WebView2: Funktionsvergleich
Das Verständnis der architektonischen Unterschiede hilft technischen Entscheidungsträgern, die Investition in die Migration zu bewerten:
| Aspekt | WebView2 | IronPDF |
|---|---|---|
| Zweck | Browser-Steuerung (UI) | PDF-Bibliothek (entwickelt für PDF) |
| Produktionsreif | NO | YES |
| Speichermanagement | Lecks in langlaufenden | Stabil, ordnungsgemäß entsorgt |
| Windows, Linux, macOS, Docker, Azure, AWS. | Nur für Windows | Windows, Linux, macOS, Docker |
| Thread-Anforderungen | STA + Message Pump | Jedes Thema |
| Server/Cloud | Nicht unterstützt | Unterstützt |
| Azure/AWS/GCP | Problematisch | Funktioniert perfekt |
| Docker | Nicht möglich | Offizielle Bilder verfügbar |
| ASP.NET Core | Kann nicht arbeiten | Erstklassige Unterstützung |
| Hintergrunddienste | Unstabil | Stabile |
| Unterstützte Kontexte | Nur WinForms/WPF | Jeder .NET-Kontext: Konsole, Web, Desktop |
| HTML zu PDF | Basic | Voll |
| URL zu PDF | Basic | Voll |
| Kopf-/Fußzeilen | NO | Ja (HTML) |
| Wasserzeichen | NO | Ja |
| PDFs zusammenführen | NO | Ja |
| PDFs aufteilen | NO | Ja |
| Digitale Signaturen | NO | Ja |
| Passwortschutz | NO | Ja |
| PDF/A-Konformität | NO | Ja |
| Professionelle Unterstützung | Keine für PDF | Ja |
| Dokumentation | Beschränkt | Umfangreiche |
Schnellstart: WebView2 zu IronPDF Migration
Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.
Schritt 1: WebView2-Paket entfernen
dotnet remove package Microsoft.Web.WebView2
dotnet remove package Microsoft.Web.WebView2
Oder aus Ihrer Projektdatei entfernen:
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
Schritt 2:IronPDF installieren
dotnet add package IronPdf
dotnet add package IronPdf
Schritt 3: Namespaces aktualisieren
Ersetzen Sie die WebView2-Namensräume durch den IronPDF-Namensraum:
// Before (WebView2)
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
// After (IronPDF)
using IronPdf;
// Before (WebView2)
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
// After (IronPDF)
using IronPdf;
Imports Microsoft.Web.WebView2.Core
Imports Microsoft.Web.WebView2.WinForms
' After (IronPDF)
Imports IronPdf
Schritt 4: Lizenz initialisieren
Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Beispiele für die Code-Migration
Konvertierung von HTML in PDF
Der grundlegendste Vorgang offenbart den Komplexitätsunterschied zwischen diesen .NET-PDF-Ansätzen.
WebView2 Ansatz:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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);
await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
);
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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);
await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
);
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>")
Await Task.Delay(2000)
Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
)
End Function
End Module
IronPDF-Ansatz:
// 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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")
pdf.SaveAs("output.pdf")
End Sub
End Class
Die WebView2-Version erfordert eine asynchrone Initialisierung mit EnsureCoreWebView2Async(), eine Navigation über NavigateToString(), ein unzuverlässiges Task.Delay(2000) zum Warten auf das Rendering sowie eine Interaktion mit dem DevTools-Protokoll. Mit IronPDF entfällt diese Zeremonie komplett: Renderer erstellen, HTML rendern, speichern.
Für fortgeschrittene HTML-zu-PDF-Szenarien siehe den HTML-zu-PDF-Konvertierungsleitfaden.
Konvertierung von URLs zu PDF
Die URL-zu-PDF-Konvertierung demonstriert den komplexen asynchronen Navigationsfluss von WebView2.
WebView2 Ansatz:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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));
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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));
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim tcs As New TaskCompletionSource(Of Boolean)()
AddHandler webView.CoreWebView2.NavigationCompleted, Sub(s, e) tcs.SetResult(True)
webView.CoreWebView2.Navigate("https://example.com")
Await tcs.Task
Await Task.Delay(1000)
Dim result As String = Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{""printBackground"": true}"
)
Dim base64 As String = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString()
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64))
End Function
End Module
IronPDF-Ansatz:
// 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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("output.pdf")
End Sub
End Class
WebView2 erfordert das Erstellen eines TaskCompletionSource, das Abonnieren von NavigationCompleted-Ereignissen, das Aufrufen von CallDevToolsProtocolMethodAsync, das Parsen von JSON-Antworten und das Dekodieren von Base64-Daten.IronPDF stellt eine spezielle Methode RenderUrlAsPdf bereit, die die gesamte Komplexität intern handhabt.
In der URL zur PDF-Dokumentation finden Sie Informationen zur Authentifizierung und zu benutzerdefinierten Kopfzeilenoptionen.
Benutzerdefinierte PDF-Einstellungen aus HTML-Dateien
Die Konfiguration von Seitenausrichtung, Rändern und Papiergröße erfordert unterschiedliche Ansätze.
WebView2 Ansatz:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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);
var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings();
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape;
printSettings.MarginTop = 0.5;
printSettings.MarginBottom = 0.5;
using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings))
{
Console.WriteLine("Custom PDF created");
}
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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);
var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings();
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape;
printSettings.MarginTop = 0.5;
printSettings.MarginBottom = 0.5;
using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings))
{
Console.WriteLine("Custom PDF created");
}
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.Core
Imports Microsoft.Web.WebView2.WinForms
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim htmlFile As String = Path.Combine(Directory.GetCurrentDirectory(), "input.html")
webView.CoreWebView2.Navigate(htmlFile)
Await Task.Delay(3000)
Dim printSettings = webView.CoreWebView2.Environment.CreatePrintSettings()
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape
printSettings.MarginTop = 0.5
printSettings.MarginBottom = 0.5
Using stream = Await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings)
Console.WriteLine("Custom PDF created")
End Using
End Function
End Module
IronPDF-Ansatz:
// 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");
}
}
// 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");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Imports System.IO
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
Dim htmlFile As String = Path.Combine(Directory.GetCurrentDirectory(), "input.html")
Dim pdf = renderer.RenderHtmlFileAsPdf(htmlFile)
pdf.SaveAs("custom.pdf")
Console.WriteLine("Custom PDF created")
End Sub
End Module
WebView2 benötigt eine 3-sekündige Task.Delay (eine unzuverlässige Schätzung), erstellt Druckeinstellungen über die Umgebung und verwendet PrintToPdfAsync mit einem Stream.IronPDF bietet direkte RenderingOptions Eigenschaften mit klaren Namen und verwendet Millimeter für präzisere Messungen.
Erweiterte PDF-Optionen mit DevTools Protocol
Komplexe WebView2-Konfigurationen erfordern die Interaktion mit dem DevTools-Protokoll.
WebView2 Ansatz:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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));
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
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));
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports System.Text.Json
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim htmlPath As String = Path.GetFullPath("document.html")
Dim tcs As New TaskCompletionSource(Of Boolean)()
AddHandler webView.CoreWebView2.NavigationCompleted, Sub(s, e) tcs.SetResult(True)
webView.CoreWebView2.Navigate($"file:///{htmlPath}")
Await tcs.Task
Await Task.Delay(1000)
Dim options = New With {
.landscape = False,
.printBackground = True,
.paperWidth = 8.5,
.paperHeight = 11,
.marginTop = 0.4,
.marginBottom = 0.4,
.marginLeft = 0.4,
.marginRight = 0.4
}
Dim result As String = Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
JsonSerializer.Serialize(options)
)
Dim base64 As String = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString()
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64))
End Function
End Module
IronPDF-Ansatz:
// 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");
}
}
// 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");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim 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
Dim pdf = renderer.RenderHtmlFileAsPdf("document.html")
pdf.SaveAs("output.pdf")
End Sub
End Class
WebView2 erfordert das Erstellen anonymer Objekte, die Serialisierung in JSON, den Aufruf von DevTools-Protokollmethoden, das Parsen von JSON-Antworten und das manuelle Dekodieren von Base64.IronPDF bietet typisierte Eigenschaften mit eindeutigen Namen und Enum-Werten wie PdfPaperSize.Letter.
WebView2 API zu IronPDFMapping Referenz
Dieses Mapping beschleunigt die Migration, indem es direkte API-Entsprechungen aufzeigt:
| WebView2API | IronPDF-Äquivalent |
|---|---|
new WebView2() |
new ChromePdfRenderer() |
EnsureCoreWebView2Async() |
Nicht anwendbar |
NavigateToString(html) + PrintToPdfAsync() |
RenderHtmlAsPdf(html) |
Navigate(url) + PrintToPdfAsync() |
RenderUrlAsPdf(url) |
PrintSettings.PageWidth |
RenderingOptions.PaperSize |
PrintSettings.PageHeight |
RenderingOptions.PaperSize |
PrintSettings.MarginTop |
RenderingOptions.MarginTop |
PrintSettings.Orientation |
RenderingOptions.PaperOrientation |
ExecuteScriptAsync() |
JavaScript in HTML |
AddScriptToExecuteOnDocumentCreatedAsync() |
HTML <script> Tags |
| Navigation Ereignisse | WaitFor.JavaScript() |
CallDevToolsProtocolMethodAsync("Page.printToPDF") |
RenderHtmlAsPdf() |
Gängige Migrationsprobleme und Lösungen
Ausgabe 1: Speicherlecks
WebView2 Problem: Der Speicher wird nicht vollständig freigegeben, wenn WebView2Instanzen gelöscht werden. Lang laufende Prozesse akkumulieren Speicher bis zum Absturz.
IronPDF-Lösung: Ordnungsgemäße Garbage Collection ohne Lecks:
//IronPDF- clean memory management
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Properly disposed
//IronPDF- clean memory management
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Properly disposed
Imports IronPdf
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using
Ausgabe 2: Kein UI-Thread in Webanwendungen
WebView2 Problem: Benötigt STA-Thread mit Message Pump. ASP.NET Core-Controller können keine WebView2-Instanzen erstellen.
IronPDF Lösung: Funktioniert auf jedem Thread:
// ASP.NET Core - just works
public async Task<IActionResult> GetPdf()
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
// ASP.NET Core - just works
public async Task<IActionResult> GetPdf()
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class YourController
Inherits Controller
Public Async Function GetPdf() As Task(Of IActionResult)
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Function
End Class
Ausgabe 3: Komplexität von Navigationsereignissen
WebView2 Problem: Muss asynchrone Navigationsereignisse, Completion-Callbacks und Race Conditions mit TaskCompletionSource behandeln.
IronPDF Lösung: Synchroner oder asynchroner Einzelmethodenaufruf:
// Simple and predictable
var pdf = renderer.RenderHtmlAsPdf(html);
// or
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
// Simple and predictable
var pdf = renderer.RenderHtmlAsPdf(html);
// or
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
Ausgabe 4: Maßeinheiten
WebView2 verwendet Zoll für die Abmessungen (8,5 x 11 für Letter). IronPDF verwendet Millimeter für präzisere Messungen.
Umsetzungsansatz:
// 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);
// 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);
' 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)
WebView2-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Dokumentieren Sie den gesamten WebView2PDF-Generierungscode in Ihrer Codebasis. Identifizieren Sie, wo WebView2Probleme verursacht (Speicherlecks, Abstürze, Bereitstellungsprobleme). Lesen Sie die IronPDF Dokumentation, um sich mit den Funktionen vertraut zu machen.
Aufgaben der Code-Aktualisierung
- Microsoft.Web.WebView2 NuGet-Paket entfernen
- IronPDF NuGet-Paket installieren
- Entfernen Sie WinForms/WPF-Abhängigkeiten, wenn sie nur für die PDF-Erzeugung verwendet werden
- Ersetzen Sie den WebView2-Code durch
ChromePdfRenderer - STA-Thread-Anforderungen entfernen
- Entfernen Sie Navigationsereignisbehandler und
TaskCompletionSource-Muster - Entfernen Sie die
Task.DelayHacks - IronPDF-Lizenzinitialisierung beim Start hinzufügen
Post-Migrationstests
Überprüfen Sie diese Aspekte nach der Migration:
- Test in der Zielumgebung (ASP.NET, Docker, Linux, falls zutreffend)
- Überprüfung der PDF-Ausgabequalität auf Übereinstimmung mit den Erwartungen
- Testen Sie die korrekte Darstellung von JavaScript-lastigen Seiten
- Überprüfen, ob Kopf- und Fußzeilen mit den HTML-Funktionen von IronPDF funktionieren
- Lasttest für Speicherstabilität bei längeren Operationen
- Testen Sie langlaufende Szenarien ohne Speicheranhäufung
Aktualisierung der Bereitstellung
- Aktualisieren von Docker-Images, falls zutreffend (Entfernen von Edge WebView2Runtime)
- Edge WebView2Runtime-Abhängigkeit aus den Serveranforderungen entfernen
- Aktualisierung der Dokumentation zu den Serveranforderungen
- Überprüfen Sie, ob die plattformübergreifende Bereitstellung auf den Zielplattformen funktioniert
Die wichtigsten Vorteile der Migration zu IronPDF
Der Wechsel von WebView2 zu IronPDF bietet mehrere entscheidende Vorteile:
Plattformübergreifende Unterstützung: Im Gegensatz zu WebView2, das nur unter Windows lauffähig ist, funktioniert IronPDF unter Windows, Linux, macOS und Docker. Diese Flexibilität ermöglicht die Bereitstellung in Azure, AWS, GCP und jeder anderen Cloud-Umgebung ohne Plattformbeschränkungen.
Keine UI-Abhängigkeiten:IronPDF benötigt weder STA-Threads noch Message Pumps oder WinForms/WPF-Kontexte. Sie funktioniert in Konsolenanwendungen, Web-APIs, Windows-Diensten und Background Workern.
Speicherstabilität: Eine ordnungsgemäße Speicherbereinigung beseitigt die Speicherlecks, die WebView2 bei langlaufenden Prozessen plagen. Die Produktionsserver bleiben stabil.
Einfache API: Einzelne Methodenaufrufe ersetzen komplexe Navigationsereignisse, Completion-Callbacks, DevTools-Protokollinteraktionen und Base64-Dekodierung.
Erweiterte PDF-Funktionen: Kopf- und Fußzeilen, Wasserzeichen, Zusammenführen/Aufteilen, digitale Signaturen, Passwortschutz und PDF/A-Konformität – Funktionen, die WebView2 nicht bieten kann.
Aktive Weiterentwicklung: Da die Verbreitung von .NET 10 und C# 14 bis 2026 zunimmt, gewährleisten die regelmäßigen Updates von IronPDF die Kompatibilität mit aktuellen und zukünftigen .NET Versionen.

