比較

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の基本的な違いを示しています:

フィーチャーWebView2IronPDF
目的ブラウザコントロール(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
$vbLabelText   $csharpLabel

このコードは、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 Class
$vbLabelText   $csharpLabel

ChromePdfRendererクラスは、すべてのレンダリングの複雑さを内部で処理します。 初期化セレモニー、ナビゲーションイベント、タイミングの推測はありません。 包括的な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
$vbLabelText   $csharpLabel

この実装では、ナビゲーションを追跡するために 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 Class
$vbLabelText   $csharpLabel

RenderUrlAsPdfメソッドは、ナビゲーション、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 Module
$vbLabelText   $csharpLabel

WebView2は寸法にインチを使用し、匿名オブジェクトと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 Class
$vbLabelText   $csharpLabel

IronPDFは正確な測定のためにミリメートルを使用し、標準的な用紙サイズのために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 Module
$vbLabelText   $csharpLabel

3秒の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 Module
$vbLabelText   $csharpLabel

APIマッピングリファレンス

WebView2からIronPDFへの移行を検討しているチームは、このマッピングがコンセプトの等価性を理解するのに役立つと思います:

WebView2 APIIronPDF 同等物
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.MarginTopRenderingOptions.MarginTop
PrintSettings.Orientation</codeRenderingOptions.PaperOrientation</code
ナビゲーションイベントWaitFor.JavaScript()</code
printBackground: truePrintHtmlBackgrounds = 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が提供できないドキュメント操作機能を提供します:

.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ドキュメントチュートリアルを参照してください。