C#'ta WebView2'den IronPDF'ye Nasıl Geçilir
WebView2, Microsoft'un yerleştirilebilir Edge/Chromium tarayıcı kontrolü (Microsoft.Web.WebView2), geliştiricilere Windows uygulamalarında web içeriğini görüntüleme olanağı sunar. Ancak, geliştirme ekipleri PDF oluşturmak içinWebView2kullanmaya çalıştığında, başsız ve sunucu senaryoları için uygun olmayan mimari sınırlamalara kapılırlar. WebView2, UI uygulamaları için tasarlanmış bir tarayıcı gömme kontrolüdür, PDF oluşturma kütüphanesi değil.
Bu kılavuz, .NET geliştiricilerinin uygulamalarında güvenilir PDF oluşturma ihtiyacı duymaları durumunda, WebView2'den IronPDF'ye geçiş yolu sağlamakta olup, kod karşılaştırmaları ve pratik örneklerle birlikte.
Neden WebView2 PDF Oluşturma için Uygun Değil
Geçiş yolunu incelemeden önce, WebView2'nin neden başsız PDF oluşturma için uygun olmadığına anlamanın faydası vardır:
| Sorun | Etki | Ciddiyet |
|---|---|---|
| Bellek Sızıntıları | Tekrar tekrarWebView2örnekleri oluşturan uzun süreli işlemlerde bellek artışı rapor edilir. | YÜKSEK |
| Sadece Windows | Linux, macOS, Docker veya Windows dışı bulut ortamları için destek yok | KRİTİK |
| UI İpliği Gerekli | Mesaj pompası ile bir STA iş parçacığında çalıştırılması gerekir. Web sunucuları veya arka plan API'leri için uygun değil. | KRİTİK |
| PDF İçin Tasarlanmamış | PrintToPdfAsync, bir ikincil yetenek olup, ana özellik değildir. |
YÜKSEK |
| Servislerde İstikrarsız | Windows Hizmetlerinde ve arka plan çalışanlarında çöküşler ve kilitlenmeler rapor edilir | YÜKSEK |
| Karmaşık Asenkron Akış | Gezinme olayları, tamamlama geri aramaları, yarış koşulları | YÜKSEK |
| Edge Çalışma Zamanı Bağımlılığı | Hedef makine üzerinde EdgeWebView2Çalışma Zamanı yüklenmiş olmalıdır | ORTA |
| Başsız Mod Yok | Bir UI kontrolü etrafında tasarlanmıştır; başsız bir işleyici değil | ORTA |
| Performans | Yavaş başlangıç, ağır kaynak tüketimi | ORTA |
| PDF Destek Hikayesi Yok | Microsoft, WebView2'yi bir PDF oluşturma ürünü olarak konumlandırmaz | ORTA |
Gerçek Dünya Başarısızlık Senaryoları
Bu kod modelleri üretimde genellikle sorunlara yol açar:
// WARNING: These patterns are known to cause problems in headless / server scenarios
//Sorun1: Memory growth - creates a newWebView2per 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
}
//Sorun2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//Sorun3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
//WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
// WARNING: These patterns are known to cause problems in headless / server scenarios
//Sorun1: Memory growth - creates a newWebView2per 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
}
//Sorun2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//Sorun3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
//WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
' WARNING: These patterns are known to cause problems in headless / server scenarios
' Sorun1: Memory growth - creates a new WebView2 per PDF
Public Async Function GeneratePdf(html As String) As Task(Of Byte()) ' High call volume accumulates memory
Using webView As New WebView2() ' Disposal does not fully reclaim native resources
Await webView.EnsureCoreWebView2Async()
webView.CoreWebView2.NavigateToString(html)
' ... memory growth reported over time
End Using
End Function
' Sorun2: 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 exception or use STA thread
End Function
' Sorun3: 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: Özellik Karşılaştırması
Mimari farklılıkları anlamak, teknik karar vericilerin geçiş yatırımını değerlendirmesine yardımcı olur:
| Aspekt | WebView2 | IronPDF |
|---|---|---|
| Amacı | Tarayıcı kontrolü (UI) | PDF kütüphanesi (PDF için tasarlanmış) |
| Üretime Hazır | HAYIR | EVET |
| Bellek Yönetimi | Uzun süreli süreçlerde bellek artışı rapor edilir | Kararlı, doğru şekilde atılır |
| Platform Desteği | Sadece Windows | Windows, Linux, macOS, Docker |
| İş Parçacığı Gereksinimleri | STA + Mesaj Pompası | Herhangi bir iş parçacığı |
| Sunucu/Bulut | Desteklenmiyor | Desteklenen |
| Azure/AWS/GCP | Problematik | Mükemmel çalışır |
| Docker | Mümkün değil | Resmi görüntüler mevcut |
| ASP.NET Core | Çalışamaz | Birinci sınıf destek |
| Arka Plan Hizmetleri | Kararsız | Kararlı |
| Desteklenen Bağlamlar | WinForms/WPF sadece | Herhangi bir .NET bağlamı: konsol, web, masaüstü |
| HTML'den PDF'ye | Temel | Tam |
| URL'den PDF'ye | Temel | Tam |
| Başlıklar/Altbilgiler | HAYIR | Evet (HTML) |
| Filigranlar | HAYIR | Evet |
| PDF'leri Birleştirme | HAYIR | Evet |
| PDF'leri Bölme | HAYIR | Evet |
| Dijital İmzalar | HAYIR | Evet |
| Şifre Koruması | HAYIR | Evet |
| PDF/A Uyumlu | HAYIR | Evet |
| Profesyonel Destek | PDF için yok | Evet |
| Dokümantasyon | Sınırlı | Kapsamlı |
Hızlı Başlat: WebView2'den IronPDF'e Geçiş
Geçiş bu öncü adımlarla hemen başlayabilir.
Adım 1: WebView2 Paketini Kaldırın
dotnet remove package Microsoft.Web.WebView2
dotnet remove package Microsoft.Web.WebView2
Ya da proje dosyanızdan çıkarın:
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
Adım 2: IronPDF Yükleme
dotnet add package IronPdf
3. Adım: Namespace'leri Güncelleme
WebView2 ad alanlarınıIronPDF ad alanı ile değiştirin:
// 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
Adım 4: Lisansı Başlat
Uygulama başlangıcında lisans başlatmayı ekleyin:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Kod Göç Örnekleri
HTML'yi PDF'ye Dönüştürme
En temel işlem, bu .NET PDF yaklaşımları arasındaki karmaşıklık farkını ortaya çıkarır.
WebView2 Yaklaşımı:
// NuGet: Install-Package Microsoft.Web.WebView2
// (the WinForms host lives in the same package; no separate .WinForms package)
// Requires the EdgeWebView2Runtime 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);
}
}
// NuGet: Install-Package Microsoft.Web.WebView2
// (the WinForms host lives in the same package; no separate .WinForms package)
// Requires the EdgeWebView2Runtime 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);
}
}
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)
' PrintToPdfAsync(path, settings) returns Task(Of Boolean); Nothing = default settings
Dim ok As Boolean = Await webView.CoreWebView2.PrintToPdfAsync("output.pdf", Nothing)
End Function
End Module
IronPDF Yaklaşımı:
// 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 sürümü, EnsureCoreWebView2Async() ile asenkron başlatma, NavigateToString() ile gezinme, render için beklemek üzere bir Task.Delay(2000) ve başarıyı gösteren bir Task<bool> döndüren son bir PrintToPdfAsync çağrısı gerektirir.IronPDF bu töreni ortadan kaldırır—bir işleyici oluşturun, HTML işleyin, kaydedin.
İleri düzey HTML-to-PDF senaryoları için HTML'den PDF'ye dönüşüm rehberine bakın.
URL'leri PDF'ye Dönüştürme
URL'den PDF'e dönüştürme, WebView2'nin karmaşık asenkron navigasyon akışını gösterir.
WebView2 Yaklaşımı:
// NuGet: Install-Package Microsoft.Web.WebView2
// (Edge Chromium control; requires EdgeWebView2Runtime; 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));
}
}
// NuGet: Install-Package Microsoft.Web.WebView2
// (Edge Chromium control; requires EdgeWebView2Runtime; 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));
}
}
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 Yaklaşımı:
// 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, bir TaskCompletionSource oluşturmayı, NavigationCompleted olaylarına abone olmayı, CallDevToolsProtocolMethodAsync çağırmayı, JSON yanıtlarını ayrıştırmayı ve base64 verilerini decode etmeyi gerektirir. IronPDF, tüm karmaşıklığı dahili olarak ele alan özel bir RenderUrlAsPdf yöntemi sağlar.
Kimlik doğrulama ve özel başlık seçenekleri için URL'den PDF'ye dokümantasyonu inceleyin.
HTML Dosyalarından Özel PDF Ayarları
Sayfa yönlendirmesi, kenar boşlukları ve kağıt boyutu farklı yaklaşımlar gerektirir.
WebView2 Yaklaşımı:
// 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");
}
}
// 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");
}
}
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 As CoreWebView2PrintSettings = webView.CoreWebView2.Environment.CreatePrintSettings()
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape
printSettings.MarginTop = 0.5 ' inches
printSettings.MarginBottom = 0.5 ' inches
printSettings.ShouldPrintBackgrounds = True
Dim ok As Boolean = Await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings)
Console.WriteLine(If(ok, "Custom PDF created", "PrintToPdfAsync returned false"))
End Function
End Module
IronPDF Yaklaşımı:
// 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 saniyelik bir Task.Delay (güvenilmez bir tahmin), CoreWebView2.Environment ile yazdırma ayarları oluşturma ve bir akış yerine Task<bool> döndüren bir await çağrısı gerektirir.WebView2marjinleri inç cinsinden ifade eder; IronPDF, doğrudan RenderingOptions özellikleri aracılığıyla milimetre kullanır.
DevTools Protokolü ile Gelişmiş PDF Seçenekleri
KarmaşıkWebView2yapılandırmaları, DevTools Protokolü etkileşimi gerektirir.
WebView2 Yaklaşımı:
// 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));
}
}
// 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));
}
}
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 Yaklaşımı:
// 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, anonim nesneler oluşturarak JSON'a serileştirme, DevTools Protokolü yöntemlerini çağırma, JSON yanıtlarını ayrıştırma ve base64'ü elle decode etmeyi gerektirir. IronPDF, PdfPaperSize.Letter gibi net adlara sahip yazılı özellikler ve enum değerleri sağlar.
WebView2 API'den IronPDF Haritalama Referansı
Bu eşleştirme, doğrudan API eşdeğerlerini göstererek geçişi hızlandırır:
| WebView2 API | IronPDF Eşdeğeri |
|---|---|
new WebView2() |
new ChromePdfRenderer() |
EnsureCoreWebView2Async() |
Yok |
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'de JavaScript |
AddScriptToExecuteOnDocumentCreatedAsync() |
HTML <script> etiketleri |
| Gezinme olayları | WaitFor.JavaScript() |
CallDevToolsProtocolMethodAsync("Page.printToPDF") |
RenderHtmlAsPdf() |
Yaygın Göç Sorunları ve Çözümleri
Problemi 1: Bellek Büyümesi
WebView2 Problemi: Uzun süreli çalışan işlemlerdeWebView2örneklerinin tekrarlı oluşturulmasında bellek büyümesi rapor edilmektedir, özellikle sabit bir mesaj pompası olmadan durumlarda.
IronPDF Çözümü: Öngörülebilir bertaraf ve using uyumlu yaşam döngüsü:
//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
Sorun 2: Web Uygulamaları İçin UI İpliği Yok
WebView2 Sorunu: Mesaj pompası ile STA iş parçacığı gerektirir. ASP.NET Core kontrolörleriWebView2örnekleri oluşturamaz.
IronPDF Çözümü: Herhangi bir iş parçacığında çalışır:
// 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
Sorun 3: Navigasyon Olayı Karmaşıklığı
WebView2 Sorunu: TaskCompletionSource ile asenkron gezinme olaylarını, tamamlama geri çağrılarını ve yarış durumu koşullarını ele almak gerekir.
IronPDF Çözümü: Senkron veya asenkron tek bir yöntem çağrısı:
// 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);
Sorun 4: Ölçü Birimleri
WebView2, ölçüler için inç kullanır (Mektup için 8,5 x 11). IronPDF, daha kesin ölçümler için milimetre kullanır.
Dönüşüm yaklaşımı:
// 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 Geçiş Kontrol Listesi
Geçiş Öncesi Görevler
Kod tabanınızdaWebView2PDF oluşturma kodunun tamamını belgeleyin. WebView2'nin sorunlara neden olduğu yerleri belirleyin (bellek sızıntıları, çökmeler, dağıtım sorunları). IronPDF belgelerini gözden geçirerek özellikleri öğrenin.
Kod Güncelleme Görevleri
- Microsoft.Web.WebView2 NuGet paketini kaldırın 2.IronPDF NuGet paketini yükleyin
- PDF oluşturma için sadece kullanılıyorsa WinForms/WPF bağımlılıklarını kaldırın
4.WebView2kodunu
ChromePdfRendererile değiştirin - STA iş parçacığı gerekliliklerini kaldırın
- Gezinti olay işleyicilerini ve
TaskCompletionSourcekalıplarını kaldırın Task.Delayhilelerini kaldırın- Başlangıçta IronPDF lisans başlatması ekleyin
Geçiş Sonrası Testler
Geçiş sonrasında bu yönleri doğrulayın:
- Hedef ortamda test edin (ASP.NET, Docker, Linux uygunsa)
- PDF çıktı kalitesinin beklentilere uygun olmasını doğrulayın
- JavaScript ağırlıklı sayfaların düzgün render edildiğini test edin
- IronPDF'in HTML yetenekleriyle başlıkların ve dipnotların çalıştığını doğrulayın
- Uzun işletim sürecinin bellek stabilitesini yük test edin
- Bellek birikimi olmadan uzun süreli senaryoları test edin
Dağıtım Güncellemeleri
- Uygunsa Docker imajlarını güncelleyin (EdgeWebView2Çalışma Zamanı'nı kaldırın)
- Sunucu gereksinimlerinden EdgeWebView2Çalışma Zamanı bağımlılığını kaldırın
- Sunucu gereksinimleri belgesini güncelleyin
- Platformlar arası dağıtımın hedef platformlarda çalıştığını doğrulayın

