フッターコンテンツにスキップ
ビデオ

How to Render PDFs with Custom Paper Size | IronPDF

wkhtmltopdfは、Qt 4.8 + QtWebKitを使用してHTMLドキュメントをPDFに変換するための広く使用されているツールです。 コマンドライン機能と無償ライセンスで開発者の間で人気があるにもかかわらず、このプロジェクトは現在、もはや無視できない重大なセキュリティリスクを抱えています。 GitHubリポジトリは2023年1月2日にアーカイブされました。 最後の上流リリースは2020年6月11日の0.12.6です。 CVE-2022-35583 (CVSS 9.8, SSRF)は未修正のままです。

このガイドでは、アプリケーションからこのセキュリティリスクを排除する必要のあるプロ for .NET開発者のために、ステップバイステップの手順、コード比較、実用的な例を用いて、wkhtmltopdfからIronPDFへの完全な移行パスを提供します。

重大なセキュリティ警告:CVE-2022-35583

wkhtmltopdfには、修正されることのない重大なセキュリティ脆弱性が含まれています:

問題 詳細 ステータス
CVE-2022-35583 (SSRF, CWE-918) 重大 (CVSS 9.8) 未修正 — メンテナが争議中
GitHubリポアーカイブ済み 読み取り専用 2023年1月2日
最後の上流リリース 0.12.6 2020年6月11日
基盤エンジン Qt 4.8 + QtWebKit (Qt 4.8 EOL 2015) OBSOLETE
CSSグリッドサポート None ブロークン
Flexboxサポート 部分的 ブロークン
ES6+ for JavaScript 制限的 ブロークン

SSRF攻撃の仕組み

Server-Side Request Forgery 脆弱性は、攻撃者が細工した HTML を通して内部サービスにアクセスし、認証情報を盗み、内部ネットワークをスキャンし、機密データを流出させることを可能にします:


<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>

<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
HTML

wkhtmltopdfがこのHTMLをレンダリングするとき、ファイアウォールやセキュリティコントロールをバイパスして、サーバーのネットワークコンテキストからこれらのURLを取得します。

影響を受けるラッパー・ライブラリについて

.NETラッパーのすべては同じwkhtmltopdfネイティブバイナリをバンドルまたはシェルアウトしているため、ラッパー自体のアクティブ性に関係なくCVEのエクスポージャを受け継ぎます:

ラッパー・ライブラリ 最新のNuGet セキュリティリスク
DinkToPdfを使用してください。 1.0.8 (2017年4月) — 放棄 CVE-2022-35583を受け継ぐ
Rotativa.AspNetCore (webgio fork) 1.4.0 (2023年11月) — ラッパー更新、バイナリ凍結 CVE-2022-35583を受け継ぐ
TuesPechkinさん 2.1.1 (2015年1月) — 放棄 CVE-2022-35583を受け継ぐ
Haukcode.WkHtmlToPdfDotNet (formerly WkHtmlToPdf-DotNet) 1.5.95 (2024年10月) — ラッパー更新、バイナリ凍結 CVE-2022-35583を受け継ぐ
NReco.PdfGenerator(英語 ラッパー更新、wkhtmltopdfをバンドル CVE-2022-35583を受け継ぐ

これらのライブラリを使用する場合、すべてのHTML入力を消毒しない限り、アプリケーションはCVE-2022-35583にさらされています。

IronPDFとwkhtmltopdfの比較:機能の比較

アーキテクチャの違いを理解することは、技術的な意思決定者が移行への投資を評価するのに役立ちます:

フィーチャー wkhtmltopdf IronPDF
ライセンスについて LGPLv3 (無料) 商用
レンダリングエンジン Qt 4.8 + QtWebKit (Qt 4.8 EOL 2015) 現在のChromiumエンジン
セキュリティの脆弱性 CVE-2022-35583 (CVSS 9.8) 未修正、争議中 重大なCVE報告なし
アクティブなメンテナンス GitHubリポアーカイブ済み2023年1月2日; 最後のリリース2020年6月 定期的なリリースによる積極的なメンテナンス
最新ウェブ標準のサポート 制限付き(broken flexbox、CSS Gridなし) サポート対象
統合とサポート コミュニティフォーラム限定 豊富なドキュメントと専用サポート
CSSグリッド ❌ 未対応 対応言語
Flexbox(フレックスボックス ⚠ 壊れています 対応言語
ES6+ for JavaScript ❌ 未対応 対応言語
非同期/待機 ❌ 未対応 対応言語
PDF操作 ❌ 未対応 対応言語
デジタル署名 ❌ 未対応 対応言語
PDF/Aコンプライアンス ❌ 未対応 対応言語

クイックスタート:wkhtmltopdfからIronPDFへのマイグレーション

これらの基本的なステップを踏めば、すぐにでも移行を開始できます。

ステップ 1:wkhtmltopdfパッケージとバイナリを削除する

すべてのwkhtmltopdfラッパー・パッケージを削除してください:

# Remove wkhtmltopdf wrapper (whichever you're using)
dotnet remove package Haukcode.WkHtmlToPdfDotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Remove wkhtmltopdf binary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
# Remove wkhtmltopdf wrapper (whichever you're using)
dotnet remove package Haukcode.WkHtmlToPdfDotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Remove wkhtmltopdf binary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
SHELL

ステップ2: IronPDFをインストールする

# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
SHELL

ステップ 3: 名前空間の更新

wkhtmltopdfの名前空間をIronPDFの名前空間に置き換える:

// Before (wkhtmltopdf)
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

ステップ 4: ライセンスの初期化

アプリケーション起動時のライセンス初期化を追加します:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

コード移行の例

HTML を PDF に変換する

最も基本的な操作は、これら for .NET PDFアプローチの複雑さの違いを明らかにします。

wkhtmltopdfのアプローチ:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.WkHtmlToPdfDotNet.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter As New SynchronizedConverter(New PdfTools())
        Dim doc As New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = New List(Of ObjectSettings) From {
                New ObjectSettings() With {
                    .HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

wkhtmltopdf は、SynchronizedConverterPdfTools で作成し、HtmlToPdfDocumentGlobalSettingsObjects で構築し、PaperSize のようなプロパティを設定し、converter.Convert() を呼び出して生のバイトを取得し、File.WriteAllBytes() でファイルに手動で書き込みを行う必要があります。

IronPDF はこの儀式を全く排除します—ChromePdfRenderer を作成し、RenderHtmlAsPdf() を呼び出し、組み込みの SaveAs() メソッドを使用します。

高度なHTMLからPDFへのシナリオについては、HTMLからPDFへの変換ガイドをご覧ください。

URLをPDFに変換する

URLからPDFへの変換も、似たような複雑さのパターンを示しています。

wkhtmltopdfのアプローチ:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.WkHtmlToPdfDotNet.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter As New SynchronizedConverter(New PdfTools())
        Dim doc As New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = New List(Of ObjectSettings) From {
                New ObjectSettings() With {
                    .Page = "https://www.example.com"
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

wkhtmltopdf は ObjectSettings の中で Page プロパティを使ってURLを指定し、同じ文書構築パターンを要求します。IronPDFは意図を明確に表現する専用の RenderUrlAsPdf() メソッドを提供します。

認証とカスタムヘッダーオプションについては、URL to PDF documentationを参照してください。

カスタム設定:ページ構成を含むHTMLファイル

方向、余白、用紙サイズの設定には、さまざまなアプローチが必要です。

wkhtmltopdfのアプローチ:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
Imports Haukcode.WkHtmlToPdfDotNet
Imports Haukcode.WkHtmlToPdfDotNet.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())
        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Landscape,
                .PaperSize = PaperKind.A4,
                .Margins = New MarginSettings() With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
            },
            .Objects = {
                New ObjectSettings() With {
                    .Page = "input.html",
                    .WebSettings = New WebSettings() With {.DefaultEncoding = "utf-8"}
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("custom-output.pdf", pdf)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 10
        renderer.RenderingOptions.MarginRight = 10
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4

        Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
        pdf.SaveAs("custom-output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

wkhtmltopdf は、一連の設定を GlobalSettingsObjects にネストし、MarginSettings を別個のオブジェクトとして扱います。IronPDFは RenderingOptions という直接的なプロパティを提供し、PaperSize といった明確な名前をつけています。

wkhtmltopdf APIからIronPDFへのマッピングリファレンス

このマッピングは、APIと同等のものを直接示すことで、移行を加速します:

CLIからIronPDFへのマッピング

wkhtmltopdfのCLIオプション IronPDF 同等物
wkhtmltopdf input.html output.pdf renderer.RenderHtmlFileAsPdf()
wkhtmltopdf URL output.pdf renderer.RenderUrlAsPdf()
--page-size A4 RenderingOptions.PaperSize = PdfPaperSize.A4
--page-size Letter RenderingOptions.PaperSize = PdfPaperSize.Letter
--orientation Landscape RenderingOptions.PaperOrientation = Landscape
--margin-top 10mm RenderingOptions.MarginTop = 10
--margin-bottom 10mm RenderingOptions.MarginBottom = 10
--margin-left 10mm RenderingOptions.MarginLeft = 10
--margin-right 10mm RenderingOptions.MarginRight = 10
--header-html header.html RenderingOptions.HtmlHeader
--footer-center "[page]" {page} placeholder
--footer-center "[toPage]" {total-pages} placeholder
--enable-javascript デフォルトで有効
--javascript-delay 500 RenderingOptions.WaitFor.RenderDelay = 500
--dpi 300 RenderingOptions.Dpi = 300
--grayscale RenderingOptions.GrayScale = true

C# ラッパーAPIマッピング

wkhtmltopdfラッパー IronPDF
SynchronizedConverter ChromePdfRenderer
HtmlToPdfDocument RenderingOptions
GlobalSettings.Out pdf.SaveAs()
GlobalSettings.PaperSize RenderingOptions.PaperSize
GlobalSettings.Orientation RenderingOptions.PaperOrientation
GlobalSettings.Margins RenderingOptions.Margin*
ObjectSettings.Page RenderHtmlFileAsPdf()
ObjectSettings.HtmlContent RenderHtmlAsPdf()
converter.Convert(doc) renderer.RenderHtmlAsPdf()

プレースホルダーの構文の移行

wkhtmltopdfプレースホルダ IronPDF プレースホルダー
[page] {page}
[toPage] {total-pages}
[date] {date}
[time] {time}
[title] {html-title}
[url] {url}

一般的な移行の問題と解決策

課題 1: ヘッダー/フッターのプレースホルダーの構文

wkhtmltopdf: [page][toPage] のような角括弧構文を使用します。

解決策: IronPDFの中括弧プレースホルダーを更新しました:

// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
' Before (wkhtmltopdf)
FooterSettings = New With {.Left = "Page [page] of [toPage]"}

' After (IronPDF)
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    .MaxHeight = 25
}
$vbLabelText   $csharpLabel

課題 2: JavaScript 遅延設定

wkhtmltopdf: 限定された信頼性の JavaScriptDelay プロパティを使用します。

ソリューション: IronPDFは複数のオプションを提供します:

renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = True

' Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500)

' Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded")

' Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true")
$vbLabelText   $csharpLabel

課題3: モダンなCSSがレンダリングされない

症状: CSS Grid および Flexbox レイアウトがwkhtmltopdfで正しく表示されません。

ソリューション: IronPDFのChromiumエンジンは最新のCSSを正しく処理します:

// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
Dim html As String = "
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>"

Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

課題 4: 同期レンダリングと非同期レンダリング

wkhtmltopdf:ラッパーは同期スレッドとブロックスレッドです。

ソリューション: IronPDFは非同期レンダリングをサポートしています:

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
Imports System.Threading.Tasks

Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
    Dim renderer As New ChromePdfRenderer()
    Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
    Return pdf.BinaryData
End Function
$vbLabelText   $csharpLabel

wkhtmltopdf移行チェックリスト

マイグレーション前のタスク

コードベースを監査して、wkhtmltopdfの使用法をすべて特定してください:

# Find all wkhtmltopdf references
grep -r "Haukcode.WkHtmlToPdfDotNet\|WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa\|NReco.PdfGenerator" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find all wkhtmltopdf references
grep -r "Haukcode.WkHtmlToPdfDotNet\|WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa\|NReco.PdfGenerator" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
SHELL

削除するwkhtmltopdfバイナリファイルを探し出し、文書化する。 ドキュメントの現在の設定(用紙サイズ、余白、ヘッダー/フッター)。

コード更新タスク

1.すべてのwkhtmltopdfラッパーNuGetパッケージを削除する。 2.wkhtmltopdfバイナリを削除する (wkhtmltopdf.exe、wkhtmltox.dll) 3.IronPDFNuGet パッケージをインストールします

  1. 使用していたラッパーから Haukcode.WkHtmlToPdfDotNet のネームスペースインポートを IronPdf に更新します
  2. SynchronizedConverterChromePdfRenderer に置き換えます
  3. HtmlToPdfDocument パターンを直接レンダリングメソッドに変換します
  4. GlobalSettings の設定を RenderingOptions に更新します
  5. MarginSettings から個別のプロパティにマージン設定を変換します
  6. プレースホルダー構文を更新します ([page][toPage]{total-pages}) 10.起動時にIronPDFライセンスの初期化を追加する

移行後のテスト

移行後、これらの点を検証してください:

  • PDF出力の視覚的比較(最新のCSSサポートにより改善されるはずです)
  • 最新のCSSレンダリングの検証(CSS GridとFlexboxが動作するようになりました)
  • JavaScriptを多用するページのテスト
  • wkhtmltopdfバイナリが残っていないことを確認するためのセキュリティスキャン
  • パフォーマンス比較のための負荷テスト

セキュリティ検証

# Scan for any remaining wkhtmltopdf artifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
# Scan for any remaining wkhtmltopdf artifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
SHELL

IronPDFに移行する主な利点

wkhtmltopdfからIronPDFに移行することで、いくつかの重要な利点が得られます:

セキュリティ: CVE-2022-35583 およびすべての wkhtmltopdf の脆弱性が排除されました。 IronPDFには既知のCVEはなく、定期的にセキュリティアップデートが行われます。

最新のレンダリング エンジン:IronPDFは最新の Chromium エンジンを使用し、CSS3、CSS グリッド、Flexbox、ES6+ JavaScript を完全にサポートします。 最新のフレームワークは正しくレンダリングされます。

簡素化された API:ドキュメント構築パターンに代わって直接レンダリング メソッドが採用されています。 組み込みの SaveAs() メソッドで手動のバイト処理が不要になります。

拡張機能: PDF 操作、デジタル署名、PDF/A 準拠、透かし、結合/分割操作は、wkhtmltopdf では提供できない組み込み機能です。

アクティブな開発: IronPDFの定期的な更新により、現在 for .NETリリースを追跡しているため、最新 for .NETおよびC#言語バージョンが提供されるたびにサポートされます。

非同期サポート:ネイティブの async/await サポートにより、高負荷の Web アプリケーションでのスレッドのブロックを防止します。

ご注意DinkToPdf, NReco, Rotativa, TuesPechkin, および wkhtmltopdf はそれぞれの所有者の登録商標です。 このサイトは DinkToPdf, NReco, Rotativa, TuesPechkin, または wkhtmltopdf とは関係がなく、支持またはスポンサーされていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね