C#でDinkToPdfからIronPdfに移行する方法
DinkToPdfはwkhtmltopdfをラップし、そのセキュリティの脆弱性と技術的な制限をすべて受け継いでいます。 これらの問題を理解することは、移行の緊急性を評価する上で非常に重要です。
重大なセキュリティ問題
DinkToPdfは、wkhtmltopdfからパッチ未適用の重大なセキュリティ脆弱性を継承しています:
- CVE-2022-35583 (SSRF):サーバーサイドリクエストフォージェリにより、攻撃者が内部ネットワークリソースにアクセスできる 2.放棄されたプロジェクト: wkhtmltopdfは2020年からメンテナンスされていません 3.セキュリティパッチなし:既知の脆弱性は修正されない
技術的な問題
| 問題 | インパクト |
|---|---|
| スレッドセーフティ | SynchronizedConverterが本番環境で並行負荷がかかるとクラッシュする |
| ネイティブバイナリ | プラットフォーム固有の libwkhtmltox バイナリを使用した複雑なデプロイメント |
| CSSの制限事項 | Flexbox、Grid、モダンCSSのサポートはありません。 |
| JavaScript(ジャバスクリプト | 一貫性のない実行、タイムアウト |
| レンダリング。 | 旧式のWebKitエンジン(2015年頃) |
| メンテナンス | 最終更新: 2018 |
アーキテクチャの比較
| アスペクト | DinkToPdf | IronPDF |
|---|---|---|
| セキュリティ。 | CVE-2022-35583 (SSRF)、パッチ未適用 | 既知の脆弱性なし |
| レンダリングエンジン | 時代遅れのWebKit(2015年) | モダンChromium |
| スレッドセーフティ | 同時使用時のクラッシュ | 完全スレッドセーフ |
| ネイティブの依存関係 | プラットフォーム固有のバイナリ | 純粋なNuGetパッケージ |
| CSSサポート | フレックスボックス/グリッドなし | 完全なCSS3 |
| JavaScript(ジャバスクリプト | 限定的で一貫性がない | フルサポート |
| メンテナンス | 見捨てられた (2018) | 積極的なメンテナンス |
機能比較
| フィーチャー | DinkToPdf | IronPDF |
|---|---|---|
| HTMLからPDFへ | ✅ (古いエンジン) | ✅ (Chromium) |
| URLからPDFへ | ✅ | ✅ |
| カスタムマージン | ✅ | ✅ |
| ヘッダー/フッター | ✅ (限定) | ✅ (完全なHTML) |
| CSS3 | ❌ 制限付き | フル |
| フレックスボックス/グリッド | ❌ | ✅ |
| JavaScript | ⚠️ 有限会社 | フル |
| PDF操作 | ❌ | ✅ |
| フォーム入力 | ❌ | ✅ |
| デジタル署名 | ❌ | ✅ |
| 暗号化 | ❌ | ✅ |
| 透かし | ❌ | ✅ |
| マージ/スプリット | ❌ | ✅ |
移行前の準備
前提条件
あなたの環境がこれらの要件を満たしていることを確認してください:
- .NET Framework 4.6.2+または.NET Core 3.1 / .NET 5-9
- Visual Studio 2019+またはC#拡張機能付きVS Code
- NuGetパッケージマネージャへのアクセス
- IronPDFライセンスキー (ironpdf.com にて無料トライアル可能)
DinkToPdfの使用状況を確認する
ソリューションディレクトリで以下のコマンドを実行し、すべてのDinkToPdf参照を識別してください:
# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .
# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .
# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"予想される画期的な変更
| 変更 | DinkToPdf | IronPDF | インパクト |
|---|---|---|---|
| コンバーター | SynchronizedConverter(新しいPdfTools())。 | <コード>ChromePdfRenderer</コード | よりシンプルなインスタンス化 |
| ドキュメント | <コード>HtmlToPdfDocument</コード | 直接メソッド呼び出し | ドキュメントオブジェクトなし |
| 設定 | GlobalSettings +<コード>オブジェクト設定</コードです。 | <コード>レンダリングオプション</コード | 単一オプションオブジェクト |
| リターンタイプ | <コード>バイト[]</コード | <コード>PdfDocument</コード | より強力なオブジェクト |
| <ストロング>バイナリ</ストロング | <コード>libwkhtmltox.dll/so</コード | なし(マネージド) | ネイティブファイルの削除 |
| スレッドセーフ。 | SynchronizedConverterが必要です。 | デフォルトでスレッドセーフ | よりシンプルなコード |
| DI | シングルトン必須 | 生涯 | 柔軟性 |
ステップごとの移行プロセス
ステップ 1: NuGet パッケージを更新する。
DinkToPdfを削除し、IronPdfをインストールしてください:
# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdf# Remove DinkToPdf
dotnet remove package DinkToPdf
# Install IronPDF
dotnet add package IronPdfステップ 2: ネイティブ バイナリの削除
プロジェクトからこれらのプラットフォーム固有のファイルを削除してください:
- <コード>libwkhtmltox.dll</コード> (Windows)
- <コード>libwkhtmltox.so</コード> (Linux)
- <コード>libwkhtmltox.dylib</コード> (macOS)
IronPdfにはネイティブの依存関係はありません。
ステップ 3: 名前空間参照の更新
DinkToPdf名前空間をIronPdfに置き換えてください:
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;
// Add this
using IronPdf;ステップ 4: ライセンスの設定
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";完全な API 移行のリファレンス
コア クラス マッピング
| DinkToPdf | IronPDF | ノート |
|---|---|---|
SynchronizedConverter(シンクロナイズド・コンバーター | <コード>ChromePdfRenderer</コード | デフォルトでスレッドセーフ |
| <コード>BasicConverter</コード | <コード>ChromePdfRenderer</コード | 同じクラスでよりシンプルに |
| <コード>PdfTools</コード | 不要 | 内部化 |
| <コード>HtmlToPdfDocument</コード | 不要 | 直接メソッド呼び出し |
| <コード>グローバル設定</コード | <コード>レンダリングオプション</コード | レンダラーの一部 |
| <コード>オブジェクト設定</コード | <コード>レンダリングオプション</コード | レンダラーの一部 |
| <コード>マージン設定</コード | 個々のマージン特性 | MarginTop、MarginBottomなど。 |
グローバル設定のマッピング
| DinkToPdf グローバル設定 | IronPDF 同等物 |
|---|---|
ColorMode = ColorMode.Color です。 | デフォルト(常にカラー) |
Orientation = Orientation.Portrait です。 | PaperOrientation = PdfPaperOrientation.Portrait です。 |
Orientation = Orientation.Landscape. | PaperOrientation = PdfPaperOrientation.Landscape です。 |
PaperSize = PaperKind.A4. | PaperSize = PdfPaperSize.A4. |
Margins = new MarginSettings(). | 個々のマージン特性 |
マージン設定のマッピング
| DinkToPdf のマージン | IronPDF 同等物 |
|---|---|
マージン.トップ = 10 | マージントップ = 10 |
Margins.Bottom = 10. | MarginBottom = 10. |
Margins.Left = 15. | MarginLeft = 15. |
Margins.Right = 15. | MarginRight = 15. |
コード移行の例
基本的な HTML から PDF
基本的な変換は、DinkToPdfの冗長な設定からIronPdfの合理化されたAPIへの劇的な単純化を示しています。
DinkToPdfの実装:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.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>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.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>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
}
}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");
}
}IronPdfは20行のDinkToPdf設定を4行に減らします。 SynchronizedConverterも、PdfToolsも、HtmlToPdfDocumentも、ObjectSettingsもありません。 その他のオプションについては、HTML to PDF documentationを参照してください。
URLからPDFへの変換
DinkToPdfの実装:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.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 DinkToPdf
using DinkToPdf;
using DinkToPdf.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);
}
}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");
}
}IronPDFのRenderUrlAsPdfは入れ子になったObjectSettings.Pageの設定を直接メソッド呼び出しに置き換えます。 その他のオプションについては、URL to PDF documentationを参照してください。
ランドスケープと余白のカスタム設定
DinkToPdfの実装:
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.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 = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.pdf", pdf);
}
}// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.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 = 15, Right = 15 }
},
Objects = {
new ObjectSettings() {
HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
WebSettings = { DefaultEncoding = "utf-8" }
}
}
};
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("custom.pdf", pdf);
}
}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 = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.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 = 15;
renderer.RenderingOptions.MarginRight = 15;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
pdf.SaveAs("custom.pdf");
}
}IronPDFのRenderingOptionsはGlobalSettingsとMarginSettingsの両方を置き換え、統一された流暢なAPIを提供します。 その他の設定オプションについては、rendering options documentationを参照してください。
重要な移行に関する注意事項
ネイティブ バイナリの削除
最も重要なクリーンアップステップは、wkhtmltopdfネイティブバイナリを削除することです。 IronPDFにはネイティブの依存関係はありません:
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null# Delete native binaries
rm libwkhtmltox.* 2>/dev/nullシングルトンは必要ありません。
DinkToPdf の SynchronizedConverter<//code> は、クラッシュを避けるためにシングルトンとして登録する必要がありました。 IronPDFのChromePdfRendererはDIのライフタイムに関係なくスレッドセーフです:
//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();リチャーリターンタイプ
DinkToPdfはbyte[]を返します。 IronPDFは操作可能なPdfDocumentを返します:
//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");
//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");完全なCSS3サポート。
DinkToPdfでは失敗するモダンレイアウトもIronPdfでは完璧に機能します:
//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
//IronPDF- full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>"; // Broken!
//IronPDF- full support (modern Chromium)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!移行後のチェックリスト
コードの移行が完了したら、以下を確認してください:
- すべてのユニットテストを実行して、PDF生成が正しく機能することを確認します。
- マルチスレッドのシナリオをテストする(DinkToPdf ではクラッシュする)
- PDF出力品質を比較する(IronPDFのChromiumの方がレンダリング品質が良い)
- CSS レンダリングを検証します (Flexbox/Grid が動作するようになりました) -JavaScript実行のテスト (IronPDF で信頼性あり)
- CI/CD パイプラインを更新して wkhtmltopdf のインストールを削除します
- セキュリティスキャンのパスを検証する(CVE-2022-35583フラグはなくなりました)
- Docker/デプロイメント スクリプトからネイティブ バイナリ デプロイメントを削除する
PDFインフラストラクチャの将来性を確保する
.NET 10が目前に迫り、C# 14では新しい言語機能が導入されるため、積極的にメンテナンスされているPDFライブラリを選択することで、長期的な互換性を確保できます。 IronPDFの最新のChromiumエンジンは定期的なアップデートを受けていますが、DinkToPdfの放棄されたwkhtmltopdfは2015年の機能のまま凍結されています。
その他のリソース
DinkToPdfからIronPdfに移行することで、重大なセキュリティ脆弱性(CVE-2022-35583)、スレッドセーフのクラッシュ、ネイティブバイナリの展開の複雑さ、時代遅れのCSSレンダリングがなくなります。 最新のChromiumエンジンへの移行は、完全なCSS3サポート、信頼性の高いJavaScriptの実行、積極的にメンテナンスされるライブラリから得られる安心感を提供します。






