如何在 C# 中從 WebView2 遷移到 IronPDF
WebView2 是 Microsoft 的可嵌入式 Edge/Chromium 瀏覽器控制項,提供開發人員在 Windows 應用程式中顯示網頁內容的方式。 然而,當開發團隊嘗試使用WebView2來產生 PDF 時,他們會遇到嚴重的架構限制,使其不適合生產環境。WebView2是專為 UI 應用程式設計的瀏覽器嵌入控制項,而非 PDF 產生函式庫。
本指南提供了從WebView2到IronPDF的完整遷移路徑,其中包含分步說明、程式碼比較以及實用範例,適合在應用程式中需要可靠 PDF 生成的 .NET 專業開發人員使用。
重要警告:WebView2 不適合 PDF 生成。
在研究遷移路徑之前,開發團隊必須瞭解為何WebView2在用於建立 PDF 時會產生重大問題:
| 問題 | 影響力 | 嚴重性 |
|---|---|---|
| 記憶體洩漏 | WebView2 在長時間運行的過程中會發生記憶體洩漏,這一點已被充分記錄。 您的伺服器將會當機。 | 重點 |
| 僅限視窗 | 不支援 Linux、macOS、Docker 或雲端環境 | 重點 |
| UI 線程需求。 | 必須在具有訊息泵的 STA 線程上執行。無法在 Web 伺服器或 API 中運作。 | 重點 |
| 非專為 PDF 設計 | PrintToPdfAsync 是事後新增的功能,並非核心功能。 |
高 |
| 服務中的不穩定 | Windows 服務和背景工作者常見的當機和擱置問題 | 高 |
| 複雜的同步流程 | 導覽事件、完成回呼、競爭條件 | 高 |
| Edge 運行時依賴性 | 需要在目標機器上安裝 EdgeWebView2Runtime | 中 |
| 無頭模式 | 即使隱藏,也要始終創建 UI 元素 | 中 |
| 表現 | 啟動緩慢、資源消耗大 | 中 |
| 無專業支援。 | Microsoft 不支援 PDF 生成的使用個案 | 中 |
真實世界的失敗情境
這些程式碼模式會導致生產失敗:
// DANGER: This code WILL cause problems in production
//問題1: Memory leak - creates newWebView2for 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
}
//問題2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//問題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
}
}
// DANGER: This code WILL cause problems in production
//問題1: Memory leak - creates newWebView2for 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
}
//問題2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//問題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
}
}
' DANGER: This code WILL cause problems in production
'問題1: 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
'問題2: UI thread requirement - crashes in ASP.NET
Public Function GenerateReport() As IActionResult ' FAILS - no STA thread
Dim webView As New WebView2() ' InvalidOperationException
' Additional logic would go here
Return Nothing ' Placeholder return
End Function
'問題3: 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
IronPDFvs WebView2:功能比較
了解架構上的差異有助於技術決策者評估遷移投資:
| 範疇 | WebView2 | IronPDF |
|---|---|---|
| 目的 | 瀏覽器控制 (UI) | PDF 圖書館(專為 PDF 設計) |
| 生產就緒 | 無 | 是 |
| 記憶體管理 | 長期運作中的洩漏 | 穩定、處理得宜 |
| 平台支援 | 僅限 Windows | Windows、Linux、macOS、Docker |
| 線程要求 | STA + 訊息泵 | 任何線程 |
| 伺服器/雲端 | 不支援 | 支援 |
| Azure/AWS/GCP。 | 問題 | 完美運作 |
| Docker | 不可能 | 提供官方圖片 |
| ASP.NET Core。 | 不能工作 | 一流的支援 |
| 背景服務 | 不穩定 | 穩定 |
| 支援的上下文 | 僅限 WinForms/WPF | 任何 .NET 上下文:控制台、網頁、桌面 |
| HTML至PDF | 基本的 | 全文 |
| URL轉PDF | 基本的 | 全文 |
| 頁首/頁腳 | 無 | 是 (HTML) |
| 水印。 | 無 | 是 |
| 合併 PDF 文件 | 無 | 是 |
| 分割 PDFs | 無 | 是 |
| 數位簽名 | 無 | 是 |
| 密碼保護 | 無 | 是 |
| PDF/A合規性 | 無 | 是 |
| 專業支援。 | PDF 無 | 是 |
| 說明文件 | 限額 | 廣泛 |
快速入門:WebView2 到IronPDF的遷移。
只要完成這些基本步驟,就可以立即開始遷移。
步驟 1:移除WebView2套件
dotnet remove package Microsoft.Web.WebView2
dotnet remove package Microsoft.Web.WebView2
或從專案檔案中移除:
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
步驟 2:安裝 IronPDF
dotnet add package IronPdf
dotnet add package IronPdf
步驟 3:更新命名空間
用IronPDF命名空間取代WebView2命名空間:
// 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
步驟 4:初始化授權
在應用程式啟動時加入授權初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
程式碼遷移範例
將 HTML 轉換為 PDF
最基本的操作揭示了這些 .NET PDF 方式之間的複雜性差異。
WebView2 方法:
// 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 方法:
// 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
WebView2 版本需要使用 EnsureCoreWebView2Async() 進行非同步初始化,透過 NavigateToString() 進行導航,使用不可靠的 Task.Delay(2000) 等待渲染,以及與 DevTools 協定互動。IronPDF完全省去了這個儀式-建立渲染器、渲染 HTML、儲存。
如需進階的 HTML 至IronPDF情境,請參閱 HTML 至 PDF 轉換指南。
將 URL 轉換為 PDF
URL 到 PDF 的轉換展示了WebView2複雜的同步導覽流程。
WebView2 方法:
// 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 方法:
// 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 需要建立 TaskCompletionSource,訂閱 NavigationCompleted 事件,呼叫 CallDevToolsProtocolMethodAsync,解析 JSON 回應,以及解碼 base64 資料。IronPDF提供了一個專門的 RenderUrlAsPdf 方法,該方法在內部處理所有複雜性。
探索URL至PDF文件的認證和自訂標頭選項。
從 HTML 檔案自訂 PDF 設定
配置頁面方向、邊界和紙張大小需要不同的方法。
WebView2 方法:
// 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 方法:
// 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 需要 3 秒 Task.Delay(一個不可靠的猜測),透過環境創建列印設置,並使用 PrintToPdfAsync 進行流處理。IronPDF提供直接的 RenderingOptions 屬性,名稱清晰,並使用毫米進行更精確的測量。
使用 DevTools 通訊協定的進階 PDF 選項
複雜的WebView2配置需要 DevTools 協定的互動。
WebView2 方法:
// 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 方法:
// 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 需要建構匿名物件、序列化為 JSON、呼叫 DevTools 協定方法、解析 JSON 回應以及手動解碼 base64。IronPDF提供類型化的屬性,具有清晰的名稱和枚舉值,例如 PdfPaperSize.Letter。
WebView2 API到IronPDF的映射參考。
此對應可透過顯示直接的 API 對應關係來加速遷移:
| WebView2 API | IronPDF 同等級產品 |
|---|---|
new WebView2() |
new ChromePdfRenderer() |
EnsureCoreWebView2Async() |
不適用 |
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() |
HTML 中的 JavaScript |
AddScriptToExecuteOnDocumentCreatedAsync() |
HTML <script> 標籤 |
| 導覽事件 | WaitFor.JavaScript() |
CallDevToolsProtocolMethodAsync("Page.printToPDF") |
RenderHtmlAsPdf() |
常見的遷移問題與解決方案
問題 1:記憶體洩漏
WebView2 問題:當處理WebView2實體時,記憶體未完全釋放。 長時間執行的進程會累積記憶體,直到當機。
IronPDF 解決方案:正確的垃圾回收,沒有洩漏:
//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
問題 2:Web 應用程式中沒有 UI 線程
WebView2 問題: 需要 STA 線程與訊息泵。ASP.NET Core 控制器無法建立WebView2實體。
IronPDF 解決方案: 可在任何線程上運作:
// 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
問題 3:導航事件的複雜性
WebView2 問題:必須處理非同步導航事件、完成回呼和競態條件 TaskCompletionSource。
IronPDF 解決方案:同步或異步單方法呼叫:
// 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);
第 4 期:測量單位
WebView2 使用英寸表示尺寸(8.5 x 11 表示 Letter)。 IronPDF 使用毫米進行更精確的測量。
轉換方法:
// 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遷移清單
遷移前的任務
在您的程式碼庫中記錄所有WebView2PDF 生成程式碼。 找出WebView2在哪些地方造成問題(記憶體洩漏、當機、部署問題)。 檢閱 IronPDF 文件以熟悉功能。
程式碼更新任務
1.移除 Microsoft.Web.WebView2 NuGet 套件 2.安裝IronPDFNuGet 套件 3.如果僅用於製作 PDF,請移除 WinForms/WPF 的相依性
- 將WebView2程式碼替換為
ChromePdfRenderer5.移除 STA 線程需求 - 移除導航事件處理程序和
TaskCompletionSource模式 - 移除
Task.Delayhacks 8.在啟動時增加IronPDF授權初始化功能
後遷移測試
轉移後,驗證這些方面:
- 在目標環境(ASP.NET、Docker、Linux(如適用))中進行測試
- 驗證 PDF 輸出品質符合預期
- 測試 JavaScript 繁重的頁面是否能正確呈現
- 驗證標頭和標腳是否能與IronPDF的 HTML 功能配合使用
- 針對記憶體在長時間操作下的穩定性進行負載測試
- 測試長時間執行的情境,無須累積記憶體
部署更新
- 更新 Docker 映像(如適用)(移除 EdgeWebView2Runtime
- 從伺服器需求中移除 EdgeWebView2Runtime 的依賴性
- 更新伺服器需求文件
- 驗證跨平台部署是否能在目標平台上運作
遷移到IronPDF的主要優點。
從WebView2轉換到IronPDF提供了幾個關鍵優勢:
跨平台支援:與WebView2僅限 Windows 的限制不同,IronPDF 可在 Windows、Linux、macOS 和 Docker 上運行。 這種靈活性可讓您部署到 Azure、AWS、GCP 以及任何雲端環境,而不受平台限制。
無 UI 依賴項:IronPDF不需要 STA 執行緒、訊息循環或 WinForms/WPF 上下文。 它適用於主控台應用程式、Web API、Windows 服務和背景工作者。
記憶體穩定性:適當的垃圾回收可以消除WebView2在長時間運行的進程中常見的記憶體洩漏問題。 生產伺服器保持穩定。
簡單 API:單一方法呼叫取代了複雜的導航事件、完成回呼、DevTools 協定互動和 base64 解碼。
擴充 PDF 功能:頁首、頁尾、浮水印、合併/分割、數位簽章、密碼保護和 PDF/A 合規性-WebView2 無法提供的功能。
積極開發:隨著 .NET 10 和 C# 14 的普及,IronPDF 將持續更新,確保與目前和未來的 .NET 版本相容。

