フッターコンテンツにスキップ
移行ガイド

Haukcode.DinkToPdfからIronPdfへの移行

Haukcode.DinkToPdf は、かつて人気があった DinkToPdf ライブラリの続編であり、wkhtmltopdf バイナリを使用して .NET アプリケーション用に HTML を PDF に変換します。 Haukcode.DinkToPdf は、元のプロジェクトが中断された後も .NET Core に追従し続けましたが、上流の依存関係に起因する重大なセキュリティ問題を抱えています。 wkhtmltopdf プロジェクトは 2023 年 1 月にアーカイブされたため、これらの問題は解決されません。

このガイドでは、PDF 生成ワークフローからセキュリティ リスクを排除することを目指すプロの .NET 開発者向けに、Haukcode.DinkToPdf からIronPDFへの徹底的な移行パスを提供します。これには、ステップバイステップの手順、コードの比較、実用的な例が含まれます。

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

Haukcode.DinkToPdf は、対処できない重大なセキュリティ脆弱性を wkhtmltopdf から継承しています。

CVE-2022-35583 - 重大な SSRF の脆弱性 (CVSS 9.8)

wkhtmltopdfライブラリ(およびHaukcode.DinkToPdfを含むすべてのラッパー)は、Server-Side Request Forgery(SSRF)の脆弱性があります:

-攻撃ベクトル:悪意のあるHTMLコンテンツにより、サーバーが内部リソースを取得する可能性がある

  • AWS メタデータ攻撃: http://169.254.169.254にアクセスして AWS 認証情報を盗むことができます -内部ネットワークアクセス:内部サービスをスキャンしてアクセスできます -ローカルファイルのインクルード: file://プロトコル経由でローカルファイルを読み取ることができます -影響:完全なインフラの乗っ取りが可能

この脆弱性に対する修正はありません なぜならwkhtmltopdfは放棄され、2023年にアーカイブされたからです。最後のリリースは 2020 年のバージョン 0.12.6 です。

IronPDFvs Haukcode.DinkToPdf:機能比較

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

アスペクトHaukcode.DinkToPdfIronPDF
基盤エンジンwkhtmltopdf(Qt WebKit ~2015)Chromium (定期的に更新)
セキュリティステータスCVE-2022-35583 (CRITICAL、未修正)積極的にパッチを適用
プロジェクトステータス放棄されたプロジェクトのフォーク積極的に開発
HTML5/CSS3制限的フルサポート
JavaScript(ジャバスクリプト限定的で安全ではないフルV8エンジン
ネイティブバイナリ必須(プラットフォーム固有)自己完結型
スレッドセーフティシングルトンパターンが必要スレッドセーフ設計
サポートコミュニティ限定プロフェッショナルサポート
更新情報特になし定期リリース
ライセンスMIT (無料)無料トライアル付き商用

クイックスタート:Haukcode.DinkToPdfからIronPDFへの移行

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

ステップ 1: DinkToPdf とネイティブ バイナリを削除する。

Haukcode.DinkToPdf NuGetパッケージを削除してください:

# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNet
# Remove NuGet packages
dotnet remove package DinkToPdf
dotnet remove package Haukcode.DinkToPdf
dotnet remove package Haukcode.WkHtmlToPdf-DotNet
SHELL

プロジェクトからネイティブバイナリを削除する:

  • <コード>libwkhtmltox.dll</コード> (Windows)
  • <コード>libwkhtmltox.so</コード> (Linux)
  • <コード>libwkhtmltox.dylib</コード> (macOS)

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

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

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

DinkToPdf名前空間をIronPdfに置き換えてください:

// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
// Before (Haukcode.DinkToPdf)
using DinkToPdf;
using DinkToPdf.Contracts;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
$vbLabelText   $csharpLabel

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

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

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

コード移行の例

基本的なHTMLからPDFへの変換

最も基本的な操作は、これらの.NET PDFライブラリの複雑さの違いを明らかにします。

Haukcode.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 = "<html><body><h1>Hello World</h1></body></html>",
                }
            }
        };

        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 = "<html><body><h1>Hello World</h1></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

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

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;
using System.IO;

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");
    }
}
$vbLabelText   $csharpLabel

Haukcode.DinkToPdfは、PdfToolsSynchronizedConverterを作成し、入れ子になったGlobalSettingsObjectsHtmlToPdfDocumentを構成し、HtmlContentObjectSettingsを追加し、converter.Convert()を呼び出す必要があります。Convert()を呼び出して生のバイトを取得し、File.WriteAllBytes()で手動でファイルに書き込む。

IronPDFはこれを3行に単純化します: ChromePdfRendererを作成し、RenderHtmlAsPdf()を呼び出し、組み込みのSaveAs()メソッドを使用します。

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

URLをPDFに変換する

URLからPDFへの変換でも、同様のパターンの違いが見られます。

Haukcode.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);
    }
}
$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");
    }
}
$vbLabelText   $csharpLabel

Haukcode.DinkToPdfは、URLに対してObjectSettings.Pageと同じドキュメント構築パターンを使用します。 IronPDFは意図を明確に表現する専用のRenderUrlAsPdf()メソッドを提供します。

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

カスタムページ設定

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

Haukcode.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.Letter,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("landscape.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.Letter,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>",
                }
            }
        };

        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("landscape.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// 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.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");

        pdf.SaveAs("landscape.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.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;

        var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Landscape Document</h1><p>Custom page settings</p></body></html>");

        pdf.SaveAs("landscape.pdf");
    }
}
$vbLabelText   $csharpLabel

Haukcode.DinkToPdfは、GlobalSettings内の設定を、別のMarginSettingsオブジェクトでネストします。 IronPDFはPaperSizePaperOrientation、そして個々のマージンプロパティのような明確な名前のRenderingOptionsプロパティを直接提供します。

Haukcode.DinkToPdf APIからIronPdfへのマッピングリファレンス

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

コンバーター・クラスのマッピング

Haukcode.DinkToPdfIronPDFノート
SynchronizedConverter(シンクロナイズド・コンバーター<コード>ChromePdfRenderer</コードスレッドセーフ、シングルトン不要
<コード>BasicConverter</コード<コード>ChromePdfRenderer</コード同じクラスで両方を処理
<コード>PdfTools</コード該当なし不要
<コード>IConverter</コード該当なしレンダラーを直接使用する

ドキュメント構成マッピング

Haukcode.DinkToPdfIronPDFノート
<コード>HtmlToPdfDocument</コードメソッドコールRenderHtmlAsPdf()を直接使用してください。
<コード>グローバル設定</コード<コード>レンダリングオプション</コードレンダリング前の設定
<コード>オブジェクト設定</コード<コード>レンダリングオプション</コード1つにまとめる
converter.Convert(doc).renderer.RenderHtmlAsPdf(html).PdfDocument<//code> を返します。

GlobalSettingsプロパティのマッピング

GlobalSettings プロパティIronPDF プロパティノート
カラーモードRenderingOptions.GrayScale(レンダリングオプション.グレイスケールブール値、グレースケールにはtrueを設定します。
<コード>オリエンテーション</コード<コード>RenderingOptions.PaperOrientation</コードポートレートまたは風景
<コード>用紙サイズ</コード<コード>RenderingOptions.PaperSize</コードPdfPaperSize列挙型を使用してください。
<コード>マージン.トップ</コードRenderingOptions.MarginTop単位:ミリメートル
<コード>マージン.ボトム</コードRenderingOptions.MarginBottom単位:ミリメートル
<コード>マージン.左</コードRenderingOptions.MarginLeft(レンダリングオプション.マージンレフト)。単位:ミリメートル
<コード>マージン.Right</コード<コード>RenderingOptions.MarginRight</コード単位:ミリメートル

オブジェクト設定プロパティのマッピング

オブジェクト設定プロパティIronPDF 同等物ノート
<コード>HtmlContent</コードRenderHtmlAsPdf()の最初のパラメータ直接パラメータ
<コード>ページ</コード> (URL)renderer.RenderUrlAsPdf(url)のようにします。別メソッド
HeaderSettings.Right = "[ページ]"TextHeader.RightText = "{page}".さまざまなプレースホルダ構文

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

Haukcode.DinkToPdfIronPDFノート
<コード>[ページ]</コード<コード>{ページ}</コード現在のページ番号
<コード>[toPage]</コード<コード>{総ページ数}</コード総ページ数
<コード>[日付]</コード{date}<//code>現在の日付

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

課題 1: シングルトンの要件

Haukcode.DinkToPdf:ネイティブのwkhtmltopdfバイナリのスレッド安全性の問題のため、シングルトンとしてSynchronizedConverterを必要とします。

ソリューション: IronPDFのChromePdfRendererは設計上スレッドセーフです:

// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
// Before (DinkToPdf) - MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

// After (IronPDF) - Can be singleton or transient (both work)
services.AddSingleton<IPdfService, IronPdfService>();
// Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
$vbLabelText   $csharpLabel

課題 2: ネイティブのバイナリ依存

Haukcode.DinkToPdf:プラットフォーム固有のネイティブライブラリ(libwkhtmltox.dll/so/dylib)が必要です。

ソリューション: IronPDFはネイティブバイナリに依存せず、自己完結しています。 移行後、これらのファイルを削除してください:

  • <コード>libwkhtmltox.dll</コード> (Windows)
  • <コード>libwkhtmltox.so</コード> (Linux)
  • <コード>libwkhtmltox.dylib</コード> (macOS)

課題3:リターン・タイプの違い

Haukcode.DinkToPdf: converter.Convert()byte[]を直接返します。

ソリューション: IronPDFは複数の出力オプションを持つPdfDocumentオブジェクトを返します:

var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData;  // Get bytes
pdf.SaveAs("output.pdf");       // Or save directly
var pdf = renderer.RenderHtmlAsPdf(html);
byte[] bytes = pdf.BinaryData;  // Get bytes
pdf.SaveAs("output.pdf");       // Or save directly
$vbLabelText   $csharpLabel

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

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

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

// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    RightText = "Page {page} of {total-pages}"
};
// Before (DinkToPdf)
HeaderSettings = { Right = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    RightText = "Page {page} of {total-pages}"
};
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf移行チェックリスト

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

コードベースを監査して、DinkToPdf の使用状況をすべて確認してください:

# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .

# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .

# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .

# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .
# Find DinkToPdf namespace usage
grep -r "using DinkToPdf\|using Haukcode" --include="*.cs" .

# Find converter usage
grep -r "SynchronizedConverter\|BasicConverter\|HtmlToPdfDocument" --include="*.cs" .

# Find native library loading
grep -r "wkhtmltopdf\|libwkhtmltox" --include="*.cs" --include="*.csproj" .

# Find GlobalSettings/ObjectSettings usage
grep -r "GlobalSettings\|ObjectSettings\|MarginSettings" --include="*.cs" .
SHELL

現在の GlobalSettings<//code> と ObjectSettings<//code> の設定を文書化します。 削除可能なネイティブライブラリのロードコードを特定する。

コード更新タスク

1.DinkToPdf NuGet パッケージの削除 2.IronPdf NuGetパッケージをインストールする 3.名前空間のインポートをDinkToPdfからIronPdfに更新してください。 4.SynchronizedConverterChromePdfRendererに置き換えてください。 5.HtmlToPdfDocumentパターンを直接メソッド呼び出しに変換する 6.GlobalSettingsRenderingOptionsに変換してください。 7.ObjectSettings<//code> を RenderingOptions<//code> に変換してください。 8.プレースホルダの構文を更新 ([page]{page},<コード>[toPage]</コード→ {total-pages}) 9.起動時にIronPDFライセンスの初期化を追加する

インフラストラクチャのクリーンアップタスク

1.ネイティブバイナリの削除 (libwkhtmltox.*) 2.ネイティブライブラリの読み込みコードを削除 3.CustomAssemblyLoadContextが存在する場合は削除してください。 4.依存性注入の更新(シングルトンは不要になりました) 5.ネイティブバイナリのプラットフォーム検出コードの削除

移行後のテスト

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

  • HTMLからPDFへの変換テスト
  • URLからPDFへの変換テスト
  • ページ設定の確認(サイズ、向き、余白)
  • プレースホルダーでヘッダーとフッターを確認する
  • 実際のHTMLテンプレートでテスト
  • 負荷テスト

IronPDFに移行する主な利点

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

セキュリティ: CVE-2022-35583 (SSRF) およびパッチが適用されないその他の wkhtmltopdf の脆弱性を排除します。

最新のレンダリング エンジン: 2015 年に廃止された Qt WebKit の代わりに、積極的に更新されている Chromium を使用します。HTML5、CSS3、JavaScript を完全にサポートします。

ネイティブ バイナリなし:プラットフォーム固有の DLL を管理する必要のない自己完結型ライブラリ。 Windows、Linux、macOSへの展開を簡素化します。

スレッド セーフティ:シングルトン要件はありません。リクエストごとのインスタンス化を含む任意のパターンでChromePdfRenderer自由に使用できます。

よりシンプルな API:複雑なドキュメント オブジェクトの構築ではなく、直接メソッド呼び出し ( RenderHtmlAsPdf()RenderUrlAsPdf() )。

積極的な開発: .NET 10 と C# 14 の採用が 2026 年まで増加するにつれて、IronPDF の定期的な更新により、現在のおよび将来の .NET バージョンとの互換性が確保されます。

カーティス・チャウ
テクニカルライター

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

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