WebView2とIronPDFの比較:技術比較ガイド
.NET開発者がHTMLコンテンツをPDFに変換する必要がある場合、Chromiumベースのレンダリングエンジンを持つMicrosoftのWebView2コントロールが潜在的なソリューションとして登場することがあります。しかし、WebView2は基本的にUIアプリケーション用に設計されたブラウザ埋め込みコントロールであり、PDF生成ライブラリではありません。 この技術比較では、WebView2とIronPDFを比較し、アーキテクトや開発者がPDF出力のためにブラウザコントロールを埋め込むことと、専用のPDFライブラリを使用することの決定的な違いを理解できるようにします。
WebView2を理解する
WebView2(Microsoft Edge)は、Edge/ChromiumエンジンをネイティブWindowsアプリケーションに統合する、汎用性の高い埋め込み可能なブラウザコントロールです。 このコントロールは、制限されたエコシステム内でMicrosoft Edgeブラウザのブラウジング体験をサポートし、HTML5、CSS3、およびJavaScriptコンテンツを表示するための最新のWeb標準コンプライアンスを提供します。
WebView2のPDF生成機能は、PrintToPdfAsyncメソッドとDevTools Protocolの統合を通じて存在します。 ただし、この機能は中核機能ではなく、後付けになります:
- ブラウザコントロールアーキテクチャ:サーバーサイドのPDF生成ではなく、UIアプリケーションにウェブコンテンツを埋め込むために設計されています。
- Windowsのみのプラットフォーム: Linux、macOS、Docker、またはクラウド環境のサポートはありません。
- UIスレッドの要件: メッセージポンプを備えたSTAスレッドで実行する必要があります。
- Edgeランタイムの依存性:対象マシンにEdge WebView2ランタイムがインストールされている必要があります。
- ヘッドレスモードなし:非表示の場合でも常に UI 要素を作成します。
PDF生成におけるWebView2の制限事項
移行ガイドの文書では、PDF生成にWebView2を使用する際の重要な問題を特定しています:
| 課題 | インパクト | 重要度 |
|---|---|---|
| メモリリーク | WebView2は、長時間実行プロセスにおけるメモリリークを文書化しています。 | 重要 |
| Windowsのみ | Linux、macOS、Docker、クラウド環境のサポートはありません。 | 重要 |
| UIスレッド必須 | メッセージポンプを備えたSTAスレッドで実行する必要があります。 | 重要 |
| PDFには対応していません | PrintToPdfAsyncは後付けです。 | 高 |
| サービスの不安定性 | Windowsサービスでよくあるクラッシュとハングアップ | 高 |
| 複雑な非同期フロー | ナビゲーションイベント、完了コールバック、レースコンディション | 高 |
| Edgeのランタイム依存性 | 対象マシンにEdgeWebView2Runtimeが必要です。 | 中級 |
| ヘッドレスモードなし | 非表示でも常にUI要素を作成 | 中級 |
IronPDFの理解
IronPDFはHTMLやウェブコンテンツからPDFを生成するために特別に設計されたPDFライブラリです。 WebView2のブラウザに埋め込むアプローチとは異なり、IronPDFはクロスプラットフォームのサポートとサーバーサイドの機能を備えた専用のPDF生成エンジンを提供します。
主な特徴は以下のとおりです:
- 目的別PDFライブラリ: UIの埋め込みではなく、PDF生成のためにゼロから設計されています。
- クロスプラットフォーム対応: Windows、Linux、macOS、Docker、iOS、Android
- 任意のスレッド操作: STAスレッドやメッセージポンプの要件はありません。
- サーバー/クラウド対応: ASP.NET Core、Azure、AWS、GCP、およびDockerに対応しています。
- 外部依存なし:自己完結型で、ランタイムのインストールは必要ありません。
- 包括的なPDFの機能: ヘッダー/フッター、透かし、結合/分割、電子署名、PDF/Aコンプライアンス
機能比較
以下の表はWebView2とIronPDFの基本的な違いを示しています:
| フィーチャー | WebView2 | IronPDF |
|---|---|---|
| 目的 | ブラウザコントロール(UI) | PDFライブラリ(PDF用に設計) |
| プロダクションレディ | NO | はい |
| メモリ管理 | 長期にわたる | 安定した適切な処理 |
| プラットフォームサポート | Windowsのみ | Windows、Linux、macOS、Docker |
| スレッドの要件 | STA + メッセージポンプ | スレッド |
| サーバー/クラウド | サポートされていません | サポート対象 |
| Azure/AWS/GCP(アジュール/AWS/GCP | 問題点 | 完璧な翻訳 |
| ドッカー。 | 不可 | 利用可能な公式画像 |
| .NETコア。 | 不可 | 一流のサポート |
| バックグラウンドサービス | 不安定 | 安定性 |
| コンソールアプリ | 複雑なハック | はい |
| WinForms/WPFについて | はい | はい |
| ヘッダー/フッター | NO | はい(HTML) |
| ウォーターマーク。 | NO | はい |
| PDFをマージする。 | NO | はい |
| PDFを分割する。 | NO | はい |
| デジタル署名。 | NO | はい |
| パスワード保護 | NO | はい |
| PDF/Aコンプライアンス | NO | はい |
| フォーム入力 | NO | はい |
| プロフェッショナルサポート | PDF使用不可 | はい |
| ドキュメント | 限定的なPDFドキュメント | 広範囲 |
APIアーキテクチャの違い
WebView2とIronPDFのアーキテクチャの違いは、それぞれのアプローチがどのようにPDFを生成するかを検証することですぐに明らかになります。
WebView2複雑な非同期パターン
WebView2は、ブラウザの初期化、ナビゲーション、イベント処理、DevToolsプロトコルの呼び出しを含む、複数ステップの非同期処理を必要とします:
// 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このコードは、EnsureCoreWebView2Async()による明示的な初期化、NavigateToString()を使用したナビゲーション、コンテンツのロードを待機するための任意の遅延、低レベルのDevToolsプロトコル呼び出しなど、いくつかのWebView2の複雑さを示しています。 Task.Delayは、コンテンツがいつ準備完了になるかの信頼できない推測を表しています。
IronPDFのシンプルなアプローチ
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 ClassChromePdfRendererクラスは、すべてのレンダリングの複雑さを内部で処理します。 初期化セレモニー、ナビゲーションイベント、タイミングの推測はありません。 包括的なHTML変換ガイダンスについては、HTML to PDFチュートリアルをご覧ください。
URLからPDFへの変換
ウェブページをPDFドキュメントに変換することは、WebView2とIronPDFの間の複雑さのギャップを示しています。
WebView2の実装
WebView2では、ナビゲーションのイベント処理、完了コールバック、手動のPDF抽出が必要です:
// 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この実装では、ナビゲーションを追跡するために TaskCompletionSource<//code> を作成し、<code>NavigationCompleted イベントを購読し、DevTools Protocol からの JSON レスポンスを解析し、Base64 デコードを処理する必要があります。 ナビゲーションの完了後に追加されるTask.Delay(1000)は、JavaScriptの実行が終了したことを確認しようとするもので、これも信頼できないタイミングハックです。
IronPDFの実装
IronPdfは単一のメソッドコールで直接URLレンダリングを提供します:
// 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 ClassRenderUrlAsPdfメソッドは、ナビゲーション、JavaScriptの実行、コンテンツの読み込みを内部で処理します。 イベントサブスクリプション、タイミング推測、Base64解析はありません。
カスタムPDF設定とオプション
ページの寸法、余白、向きを設定することで、APIの使い勝手に大きな違いがあることがわかります。
WebView2DevTools プロトコルの構成
WebView2は、JSONシリアライズとDevTools Protocolパラメータを必要とします:
// 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 ModuleWebView2は寸法にインチを使用し、匿名オブジェクトとJSONシリアライゼーションを必要とし、イベントハンドラとタイミング遅延で複雑な非同期フローを維持します。
IronPDFレンダリングオプションの設定
IronPdfはRenderingOptionsプロパティを通して強く型付けされた設定を提供します:
// 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 ClassIronPDFは正確な測定のためにミリメートルを使用し、標準的な用紙サイズのためにPdfPaperSize列挙型を提供し、ファイルベースのコンテンツのためにRenderHtmlFileAsPdf()のような専用メソッドを提供します。
カスタム向きのHTMLファイルをPDFに
HTMLファイルを横向きに変換することで、RenderingOptionsに対するPrintSettingsのアプローチを示しています。
WebView2PrintSettingsのアプローチ
WebView2は、代替のPrintToPdfAsyncメソッドをCoreWebView2PrintSettingsで提供しています:
// 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 Module3秒のTask.Delay-印刷前にコンテンツが読み込まれるようにするための、さらに長い任意の待ち時間-に注意してください。
IronPDFの合理化された構成
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 ModuleAPIマッピングリファレンス
WebView2からIronPDFへの移行を検討しているチームは、このマッピングがコンセプトの等価性を理解するのに役立つと思います:
| WebView2 API | IronPDF 同等物 |
|---|---|
new WebView2(). | new ChromePdfRenderer(). |
EnsureCoreWebView2Async()を使用してください。 | 該当なし |
NavigateToString(html)と PrintToPdfAsync()です。 | RenderHtmlAsPdf(html)を使用してください。 |
Navigate(url) + PrintToPdfAsync(). | RenderUrlAsPdf(url)を使用してください。 |
Navigate(ファイル) + PrintToPdfAsync()。 | RenderHtmlFileAsPdf(ファイル)</code |
PrintSettings.PageWidthを使用してください。 | RenderingOptions.PaperSize</code |
PrintSettings.PageHeight(プリント設定.ページ高さ | RenderingOptions.PaperSize</code |
PrintSettings.MarginTop。 | RenderingOptions.MarginTop。 |
PrintSettings.Orientation</code | RenderingOptions.PaperOrientation</code |
| ナビゲーションイベント | WaitFor.JavaScript()</code |
printBackground: true | PrintHtmlBackgrounds = true です。 |
チームがWebView2からIronPDFへの移行を検討するとき
WebView2の代替としてIronPDFを評価するよう開発チームに促すシナリオがよくあります:
クロスプラットフォームの要件
WebView2はWindowsのみの制限のため、Linuxサーバー、Dockerコンテナ、クラウド環境をターゲットとしたアプリケーションには適していません。 Azure、AWS、GCP、またはコンテナ化されたインフラストラクチャにデプロイするチームは、PDF生成にWebView2を使用できません。
サーバーサイドPDF生成
WebView2のSTAとメッセージポンプによるUIスレッド要件は、ASP.NET Core、バックグラウンドサービス、APIエンドポイントと基本的に互換性がありません。 Webリクエストに応答してPDFを生成する必要があるアプリケーションは、WebView2を使用できません。
メモリの安定性に関する懸念
WebView2が文書化した、長時間実行するプロセスでのメモリリークは、本番環境でサーバークラッシュを引き起こします。 一日中継続的にPDFを生成するアプリケーションは、メモリ不足の状態が発生するまでメモリを蓄積します。
PDFの機能要件
WebView2のPrintToPdfAsyncは、基本的なHTMLからPDFへの変換のみを提供します。 ヘッダー/フッター、透かし、PDFの結合/分割、電子署名、パスワード保護、PDF/Aコンプライアンスを必要とするチームは、他をあたる必要があります。
簡易開発
WebView2が必要とする複雑な非同期フロー-初期化、ナビゲーションイベント、完了コールバック、タイミング遅延、JSONシリアライズ、Base64デコード-は、IronPDFの単一メソッドアプローチと比較して、開発とメンテナンスに多大なオーバーヘッドをもたらします。
IronPDFの追加機能
基本的なPDF生成にとどまらず、IronPDFはWebView2が提供できないドキュメント操作機能を提供します:
- PDFのマージ: 複数のドキュメントを1つのファイルに結合する。
- ドキュメントの分割: ページ範囲を別々のPDFに抽出する。
- デジタル署名: 文書の信頼性のために暗号署名を適用する。
- 透かし: テキストまたは画像の透かしを追加する。
- PDF/Aコンプライアンス: アーカイブ規格のドキュメントを作成する。
- フォーム入力: PDFフォームフィールドをプログラムで入力します。
- ヘッダーとフッター: 自動ページ番号付けとブランディング。
- パスワード保護: ユーザーと所有者のパスワードでPDFを暗号化します。
- Dockerデプロイメント: Linuxデプロイメントのための公式コンテナイメージ。
.NETの互換性と将来の準備
WebView2のWindows専用アーキテクチャは、クロスプラットフォーム化が進む.NETエコシステムにおいて、その将来性を制限しています。 IronPDFは定期的なアップデートでアクティブな開発を維持し、.NET 8、.NET 9、そして2026年に予定されている.NET 10を含む将来のリリースとの互換性を保証します。ライブラリのAPI全体にわたるasync/awaitのサポートは、C# 14で予想される機能を含む最新のC#開発プラクティスに沿っています。
結論
WebView2とIronPDFは.NETでPDFを生成するための根本的に異なるアプローチです。 WebView2はブラウザ埋め込みコントロールで、たまたまPDF印刷をサポートしています。 Windowsのみのプラットフォーム制限、UIスレッド要件、メモリリーク問題、PDF固有の機能の欠如により、本格的なPDF生成ワークロードには不向きです。
IronPDFはHTMLをPDFに変換するために特別に設計されたPDFライブラリで、クロスプラットフォームのサポート、サーバーサイドの機能、包括的なPDF操作機能を備えています。 その合理化されたAPIは、WebView2が必要とする複雑な非同期パターン、イベント処理、タイミングハックを排除します。
現在、PDF生成にWebView2を使用しているチームにとって、文書化された安定性の問題、プラットフォームの制限、機能のギャップを考慮すると、専用の代替ツールの評価が不可欠です。 WebView2とIronPDF間のAPIマッピングは簡単で、IronPDFは一貫して少ないコードで済み、WebView2が課すアーキテクチャ上の制約を排除しています。
その他の実装ガイダンスについては、IronPDFドキュメントやチュートリアルを参照してください。