C#でwkhtmltopdfからIronPDFに移行する方法
wkhtmltopdfは、Qt WebKitを使ってHTML文書をPDFに変換するツールとして広く使われてきました。 コマンドライン機能と無償ライセンスで開発者の間で人気があるにもかかわらず、このプロジェクトは現在、もはや無視できない重大なセキュリティリスクを抱えています。 このライブラリは2016年から2017年にかけて公式に放棄され、重大度CRITICALの脆弱性(CVE-2022-35583)は永久にパッチが適用されていません。
このガイドでは、アプリケーションからこのセキュリティリスクを排除する必要のあるプロ for .NET開発者のために、ステップバイステップの手順、コード比較、実用的な例を用いて、wkhtmltopdfからIronPDFへの完全な移行パスを提供します。
重大なセキュリティ警告:CVE-2022-35583
wkhtmltopdfには、修正されることのない重大なセキュリティ脆弱性が含まれています:
| 問題 | 重要度 | ステータス |
|---|---|---|
| CVE-2022-35583 | クリティカル (9.8/10) | UNPATCHED |
| SSRFの脆弱性について | インフラ買収リスク | UNPATCHED |
| 最終更新日 | 2016-2017 | ABANDONED |
| WebKitバージョン | 2015 (Qt WebKit) | OBSOLETE |
| CSSグリッドサポート | なし | ブロークン |
| 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"/>
wkhtmltopdfがこのHTMLをレンダリングするとき、ファイアウォールやセキュリティコントロールをバイパスして、サーバーのネットワークコンテキストからこれらのURLを取得します。
影響を受けるラッパー・ライブラリについて
wkhtmltopdfのすべて for .NETラッパーは、これらの脆弱性を継承しています:
| ラッパー・ライブラリ | ステータス | セキュリティリスク |
|---|---|---|
| DinkToPdfを使用してください。 | 中止 | ⚠️ 重要 |
| Rotativa(ロータティバ | 中止 | ⚠️ 重要 |
| TuesPechkinさん | 中止 | ⚠️ 重要 |
| WkHtmlToPdf-DotNet。 | 中止 | ⚠️ 重要 |
| NReco.PdfGenerator(英語 | wkhtmltopdfを使用 | ⚠️ 重要 |
これらのライブラリのいずれかを使用している場合、CVE-2022-35583.に対する脆弱性があります。
IronPDFとwkhtmltopdfの比較:機能の比較
アーキテクチャの違いを理解することは、技術的な意思決定者が移行への投資を評価するのに役立ちます:
| フィーチャー | wkhtmltopdf | IronPDF |
|---|---|---|
| ライセンスについて | LGPLv3 (無料) | 商用 |
| レンダリングエンジン | Qt WebKit (2015) | 現在のChromiumエンジン |
| セキュリティの脆弱性 | CVE-2022-35583、パッチが適用されていない主な問題 | 既知のCVEはありません |
| アクティブなメンテナンス。 | 2017年以降、意味のある更新がなく、放棄されました。 | 定期的なリリースによる積極的なメンテナンス |
| 最新ウェブ標準のサポート | 制限付き(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 WkHtmlToPdf-DotNet
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 WkHtmlToPdf-DotNet
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.
ステップ2: IronPDFをインストールする
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
ステップ 3: 名前空間の更新
wkhtmltopdf名前空間をIronPdf名前空間に置き換えてください:
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
// After (IronPDF)
using IronPdf;
' Before (wkhtmltopdf)
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
' After (IronPDF)
Imports IronPdf
ステップ 4: ライセンスの初期化
アプリケーション起動時のライセンス初期化を追加します:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
コード移行の例
HTML を PDF に変換する
最も基本的な操作は、これら for .NET PDFアプローチの複雑さの違いを明らかにします。
wkhtmltopdfのアプローチ:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
Imports System.IO
Class Program
Shared Sub Main()
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument() With {
.GlobalSettings = New GlobalSettings() With {
.ColorMode = ColorMode.Color,
.Orientation = Orientation.Portrait,
.PaperSize = PaperKind.A4
},
.Objects = {
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 Class
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
wkhtmltopdf では、SynchronizedConverter を PdfTools で作成し、GlobalSettings と Objects で HtmlToPdfDocument を構築し、Orientation、および PaperSize などのプロパティを設定し、生のバイトを取得するために converter.Convert() を呼び出して、File.WriteAllBytes() を使用してファイルに手動で書き込む必要があります。
IronPDFこの手続きは完全に省略されており、ChromePdfRenderer を作成し、RenderHtmlAsPdf() を呼び出し、組み込みの SaveAs() メソッドを使用します。
高度なHTMLからPDFへのシナリオについては、HTMLからPDFへの変換ガイドをご覧ください。
URLをPDFに変換する
URLからPDFへの変換も、似たような複雑さのパターンを示しています。
wkhtmltopdfのアプローチ:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports 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 ObjectSettings() With {
.Page = "https://www.example.com"
}
}
}
Dim pdf As Byte() = converter.Convert(doc)
File.WriteAllBytes("webpage.pdf", pdf)
End Sub
End Module
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
wkhtmltopdf は、ObjectSettings の Page プロパティを使用して URL を指定しますが、同じドキュメント構築パターンが必要です。IronPDFは、意図を明確に表現する専用の RenderUrlAsPdf() メソッドを提供します。
認証とカスタムヘッダーオプションについては、URL to PDF documentationを参照してください。
カスタム設定:ページ構成を含むHTMLファイル
方向、余白、用紙サイズの設定には、さまざまなアプローチが必要です。
wkhtmltopdfのアプローチ:
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using 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 WkHtmlToPdf-DotNet
Imports WkHtmlToPdfDotNet
Imports WkHtmlToPdfDotNet.Contracts
Imports System.IO
Class Program
Shared Sub Main()
Dim converter As New SynchronizedConverter(New PdfTools())
Dim doc As 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 Class
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
wkhtmltopdf は、GlobalSettings と Objects 内に設定をネストし、MarginSettings を別のオブジェクトとして保存します。IronPDFは、PaperSize のような明確な名前を持つ直接的な RenderingOptions プロパティを提供します。
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} プレースホルダー |
--footer-center "[toPage]" |
{total-pages} プレースホルダー |
--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
}
課題 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")
課題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)
課題 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
wkhtmltopdf移行チェックリスト
マイグレーション前のタスク
コードベースを監査して、wkhtmltopdfの使用法をすべて特定してください:
# Find all wkhtmltopdf references
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find all wkhtmltopdf references
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
削除するwkhtmltopdfバイナリファイルを探し出し、文書化する。 ドキュメントの現在の設定(用紙サイズ、余白、ヘッダー/フッター)。
コード更新タスク
1.すべてのwkhtmltopdfラッパーNuGetパッケージを削除する。 2.wkhtmltopdfバイナリを削除する (wkhtmltopdf.exe、wkhtmltox.dll) 3.IronPdf NuGetパッケージをインストールする
- 名前空間のインポートを
WkHtmlToPdfDotNetからIronPdfに更新します。 SynchronizedConverterをChromePdfRendererに置き換えます。HtmlToPdfDocumentパターンを直接レンダリング方法に変換するGlobalSettings構成をRenderingOptionsに更新します。- マージン設定を
MarginSettingsから個別のプロパティに変換する - プレースホルダー構文を更新します (
[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
IronPDFに移行する主な利点
wkhtmltopdfからIronPdfに移行することで、いくつかの重要な利点が得られます:
セキュリティ: CVE-2022-35583 およびすべての wkhtmltopdf の脆弱性が排除されました。 IronPDFには既知のCVEはなく、定期的にセキュリティアップデートが行われます。
最新のレンダリング エンジン:IronPDFは最新の Chromium エンジンを使用し、CSS3、CSS グリッド、Flexbox、ES6+ JavaScript を完全にサポートします。 最新のフレームワークは正しくレンダリングされます。
簡素化された API:ドキュメント構築パターンに代わって直接レンダリング メソッドが採用されています。 組み込みの SaveAs() メソッドにより、手動でのバイト処理が不要になります。
拡張機能: PDF 操作、デジタル署名、PDF/A 準拠、透かし、結合/分割操作は、wkhtmltopdf では提供できない組み込み機能です。
積極的な開発: .NET 10 と C# 14 の採用が 2026 年まで増加するにつれて、IronPDF の定期的な更新により、現在のおよび将来 for .NETバージョンとの互換性が確保されます。
非同期サポート:ネイティブの async/await サポートにより、高負荷の Web アプリケーションでのスレッドのブロックを防止します。

