比較

Haukcode.DinkToPdf vs IronPDF:技術比較ガイド

.NET 開発者が PDF 生成オプションを検討する場合、Haukcode.DinkToPdf は、wkhtmltopdf バイナリを使用する廃止された DinkToPdf プロジェクトの継続として目立ちます。 Haukcode.DinkToPdf は基本的な HTML から PDF への変換機能を提供しますが、wkhtmltopdf による重大なセキュリティ リスクを伴い、プロジェクトの中止により、このリスクは修正されません。IronPDFは別のオプションを提供します。これは、定期的なセキュリティ更新を備えた最新の Chromium エンジンを使用してアクティブにメンテナンスされるライブラリです。

この比較では、関連する技術的側面から両方のライブラリをレビューし、開発者とアーキテクトが .NET PDF のニーズに応じて情報に基づいた選択を行うのに役立ちます。

Haukcode.DinkToPdf の探索

Haukcode.DinkToPdf は、かつて人気があった DinkToPdf ライブラリの継続版であり、現在は廃止された wkhtmltopdf バイナリ上に構築されています。 このライブラリは、HTML から PDF への変換機能を提供しながら、.NET Core との互換性を維持することを目的としています。 中止されたプロジェクトの継続であるため、Haukcode.DinkToPdf には顕著な制限があります。

Haukcode.DinkToPdf は、変換にPdfToolsSynchronizedConverterを使用します。 構成は、ページ オプションのGlobalSettings (ColorMode、Orientation、PaperSize、Margins) とコンテンツのObjectSettings (HTML 文字列の HtmlContent、URL の Page) を含むHtmlToPdfDocumentオブジェクトを通じて管理されます。converter.Convert(doc).メソッドは生の byte[] データを返します。

ライブラリには、プラットフォーム固有のネイティブバイナリが必要です:libwkhtmltox.dll (Windows), libwkhtmltox.so (Linux), libwkhtmltox.dylib (macOS). スレッド セーフを実現するには、wkhtmltopdf の制限により、 SynchronizedConverterをシングルトン パターンで使用する必要があります。

IronPDFの探索

IronPdfは独自に開発された.NETライブラリで、最新のChromiumレンダリングエンジンを使用しています。このライブラリは定期的なアップデート、Professionalなサポート、継続的なセキュリティパッチで積極的にメンテナンスされています。

IronPDFはChromePdfRendererを主要なレンダリングクラスとして使用し、RenderingOptionsプロパティを通して設定を行います。 RenderHtmlAsPdf()RenderUrlAsPdf()のようなメソッドは、SaveAs()で保存したり、BinaryDataとしてアクセスできるPdfDocumentオブジェクトを返します。 ライブラリは、外部のネイティブバイナリを必要とせず、自己完結型であり、シングルトンパターンを必要としない設計によりスレッドセーフです。

重要なセキュリティの考慮事項

これらのライブラリの最も大きな違いは、セキュリティです。 Haukcode.DinkToPdfは、CVSSスコア9.8の重大なServer-Side Request Forgery (SSRF)の脆弱性であるCVE-2022-35583を継承しています。

CVE-2022-35583攻撃ベクトル:

  • 悪意のあるHTMLコンテンツは、サーバーに内部リソースをフェッチさせる可能性があります。
  • AWSメタデータ攻撃はhttp://169.254.169.254にアクセスして認証情報を盗むことができる
  • 社内ネットワークのスキャンと社内サービスへのアクセス
  • file://プロトコルによるローカルファイルのインクルード
  • 完全なインフラストラクチャー買収の可能性

この脆弱性に対する修正はありませんなぜならwkhtmltopdfは放棄されているからです(2023年1月からアーカイブされており、最後のリリースは2020年の0.12.6です)。

セキュリティ面Haukcode.DinkToPdfIronPDF
クリティカルなCVECVE-2022-35583 (CVSS 9.8、未修正)積極的にパッチを適用
基盤エンジンwkhtmltopdf(Qt WebKit ~2015)Chromium (定期的に更新)
プロジェクトステータス放棄されたプロジェクトのフォーク積極的に開発
セキュリティ・アップデート特になし定期リリース
サポートコミュニティ限定プロフェッショナルサポート

アーキテクチャとエンジンの比較

基本的なアーキテクチャの違いは、レンダリングの品質、最新のWeb標準のサポート、デプロイの複雑さに影響します。

アスペクトHaukcode.DinkToPdfIronPDF
レンダリングエンジンQt WebKit(~2015年)クロミウム(現在)
HTML5/CSS3制限的サポート対象
JavaScript(ジャバスクリプト限定的で安全ではないフルV8エンジン
ネイティブバイナリ必須(プラットフォーム固有)自己完結型
スレッドセーフティシングルトンパターンが必要スレッドセーフ設計
更新情報特になし定期リリース

Haukcode.DinkToPdfは、時代遅れのQt WebKitエンジンに依存しているため、長年にわたるセキュリティパッチが適用されておらず、最新のWeb標準のサポートも限られています。 IronPDFのChromiumエンジンは定期的なアップデートで最新のウェブ標準をサポートします。

コードの比較:一般的なPDF操作

HTMLからPDFへの変換

最も基本的な操作は、API設計の違いを示しています。

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を作成し、入れ子になったGlobalSettingsObjectSettingsオブジェクトでHtmlToPdfDocumentを構築し、Convert()を呼び出して生のバイトを取得し、File.WriteAllBytes()で手動でディスクに書き込む必要があります。WriteAllBytes()で手動でディスクに書き込む。

IronPDFはChromePdfRendererを作成し、RenderHtmlAsPdf()をHTML文字列で直接呼び出し、SaveAs()で保存します。 最新のAPI設計により、操作は大幅に簡潔になります。

高度なHTMLレンダリングオプションについては、HTMLから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プロパティを持つ同じHtmlToPdfDocument構造を使用しています。 IronPDFはURLを直接受け取る専用のRenderUrlAsPdf()メソッドを提供します。

Haukcode.DinkToPdfによるURLレンダリングは、悪意のあるURLやリダイレクトがサーバーを悪用する可能性があるため、CVE-2022-35583 SSRF脆弱性のリスクがあることに注意してください。

カスタムページ設定

ページ構成は、さまざまな構成モデルを示しています。

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は、ネストされたMarginSettingsオブジェクトを持つGlobalSettingsを通してページ設定を構成します。 プロパティは、Orientation.LandscapePaperKind.Letterのような列挙型を使用します。

IronPDFはRenderingOptionsプロパティをレンダラー上で直接使用します。 プロパティは、型付き列挙型(PdfPaperSize.LetterPaperOrientationMarginTopなど)で個別に設定されます(PdfPaperSize.LetterPdfPaperOrientation.Landscape)。 どちらもマージンの単位にミリメートルを使用しています。

レンダリングの設定については、IronPDFチュートリアルをご覧ください。

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

Haukcode.DinkToPdfの移行を評価したり、機能を比較したりする開発者のために、このマッピングは同等の操作を示しています:

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

Haukcode.DinkToPdfIronPDF
SynchronizedConverter(シンクロナイズド・コンバーター<コード>ChromePdfRenderer</コード
<コード>BasicConverter</コード<コード>ChromePdfRenderer</コード
<コード>PdfTools</コード該当なし
<コード>IConverter</コード該当なし

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

Haukcode.DinkToPdfIronPDF
<コード>HtmlToPdfDocument</コードメソッドコール
<コード>グローバル設定</コード<コード>レンダリングオプション</コード
<コード>オブジェクト設定</コード<コード>レンダリングオプション</コード
converter.Convert(doc).renderer.RenderHtmlAsPdf(html).

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

GlobalSettings プロパティIronPDF プロパティ
カラーモードRenderingOptions.GrayScale(レンダリングオプション.グレイスケール
<コード>オリエンテーション</コード<コード>RenderingOptions.PaperOrientation</コード
<コード>用紙サイズ</コード<コード>RenderingOptions.PaperSize</コード
<コード>マージン.トップ</コード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>

スレッドセーフティと依存性注入

Haukcode.DinkToPdfは、wkhtmltopdf.Haukcode.DinkToPdfから継承されたスレッドセーフの制限のため、慎重な取り扱いが必要です。

Haukcode.DinkToPdf(シングルトンが必要です):

// Startup.cs - MUST be singleton due to thread safety issues
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
}
// Startup.cs - MUST be singleton due to thread safety issues
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
}
$vbLabelText   $csharpLabel

IronPDF(フレキシブル):

// Startup.cs - Can be singleton or transient (both work)
public void ConfigureServices(IServiceCollection services)
{
    IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
    services.AddSingleton<IPdfService, IronPdfService>();
    // Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
}
// Startup.cs - Can be singleton or transient (both work)
public void ConfigureServices(IServiceCollection services)
{
    IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
    services.AddSingleton<IPdfService, IronPdfService>();
    // Or services.AddTransient<IPdfService, IronPdfService>() - both are safe!
}
$vbLabelText   $csharpLabel

IronPDFは設計上スレッドセーフであり、シングルトン要件なしで柔軟な依存性注入パターンを可能にします。

機能比較の概要

フィーチャーHaukcode.DinkToPdfIronPDF
ソースオリジン放棄されたプロジェクトのフォーク独自開発
セキュリティアップストリームから継承されたCVE(修正不可)積極的なパッチ適用と安全性
コミュニティ&サポート小規模かつ散発的大規模で、活発で、熱心な
機能と更新情報限定的かつ散発的開発が活発なレギュラー
マルチスレッドサポートシングルトンパターンが必要完全サポートと最適化
ネイティブバイナリ必須(プラットフォーム固有)自己完結型
HTML5/CSS3制限的サポート対象
JavaScript(ジャバスクリプト制限的フルV8エンジン
ライセンスMIT (無料)無料トライアル付き商用

チームがHaukcode.DinkToPdfからIronPdfへの移行を検討するとき

開発チームはいくつかの理由からHaukcode.DinkToPdfからIronPdfへの移行を評価しています:

重大なセキュリティ脆弱性: CVE-2022-35583 (SSRF) は、CVSS 9.8 の重大な脆弱性であり、修正されることはありません。 ユーザが提供した HTML を処理したり、外部 URL をレンダリングするアプリケーションに対して、この脆弱性は、AWS クレデンシャルの窃取、内部ネットワークへのアクセス、ローカルファイルのインクルード攻撃を可能にします。

廃止された基盤技術: wkhtmltopdf は廃止されました (2023 年 1 月にアーカイブ、最終リリース 2020 年)。 継続としての Haukcode.DinkToPdf では、基盤となるテクノロジーの根本的な問題に対処できません。 時代遅れの Qt WebKit エンジン(~2015 年)は、長年のセキュリティパッチが適用されていません。

ネイティブ バイナリ管理: Haukcode.DinkToPdf では、プラットフォーム固有のバイナリ ( libwkhtmltox.dlllibwkhtmltox.solibwkhtmltox.dylib ) を配布する必要があります。 これは、デプロイメント、CI/CDパイプライン、コンテナ化を複雑にします。 IronPdfは外部バイナリを含まない自己完結型です。

スレッド セーフティの制限:必須のSynchronizedConverterシングルトン パターンにより、アーキテクチャの柔軟性が制限され、負荷がかかったときにボトルネックが発生する可能性があります。 IronPdfは設計上スレッドセーフであり、リクエストごとのインスタンスが可能です。

最新の Web 標準: HTML5/CSS3 のサポートが制限されており、JavaScript の実行が安全でないために、最新の Web コンテンツのレンダリング機能が制限されます。 IronPDFのChromiumエンジンは最新のウェブ標準をサポートします。

長期的な存続可能性:放棄されたテクノロジーへの依存は、時間の経過とともに技術的負債を生み出し、その負債は増大します。2026年までにプロジェクトが.NET 10およびC# 14へと拡大するにつれて、メンテナンスされていないwkhtmltopdfラッパーへの依存を維持することはますます困難になります。

長所と考慮点

Haukcode.DinkToPdfの強み

-フリーでオープンソース:ライセンス費用のかからないMITライセンス -基本機能:基本的なHTMLからPDFへの変換をサポート -既存のコードベース:すでに DinkToPdf を使用しているチームには馴染みのあるコードベース

Haukcode.DinkToPdfについての考察

-重大なセキュリティ脆弱性: CVE-2022-35583 は修正不可能 -廃止された技術:廃止されたwkhtmltopdfをベースに構築 -ネイティブバイナリ依存関係:プラットフォーム固有のDLLが必要 -スレッドセーフティの問題:シングルトンパターンが必要 -制限されたWeb標準:時代遅れのQt WebKitエンジン -専門家によるサポートなし:コミュニティのみのサポート -技術的負債:放棄されたプロジェクトへの依存はリスクを増大させる

IronPDFの強み

-アクティブセキュリティパッチ:定期的なアップデートで脆弱性に対処 -最新のChromiumエンジン:最新のWeb標準のサポート -自己完結型:ネイティブバイナリ依存性なし -スレッドセーフ設計:柔軟な展開パターン -完全なHTML5/CSS3/JavaScript:最新のレンダリング機能 -プロフェッショナルサポート:専用のエンジニアリングサポート -包括的なリソース:広範なチュートリアルドキュメント

IronPDFについての考察

-商用ライセンス:実稼働環境での使用に必要

結論

Haukcode.DinkToPdfとIronPDFは、.NETアプリケーションにおけるPDF生成への根本的に異なるアプローチを表しています。 Haukcode.DinkToPdf は、廃止された wkhtmltopdf バイナリをラップする、放棄された DinkToPdf プロジェクトの継続であるため、修正されることのない重大なセキュリティ脆弱性 (CVE-2022-35583) を抱えています。 このライブラリは、ネイティブのバイナリ配布、スレッドセーフのためのシングルトンパターンを必要とし、限定的な最新のWeb標準のサポートを提供します。

IronPdfは最新のChromiumエンジン、定期的なセキュリティアップデート、スレッドセーフアーキテクチャにより、積極的にメンテナンスされた代替ツールを提供します。 この自己完結型ライブラリは、HTML5/CSS3/JavaScriptを完全にサポートしながら、ネイティブのバイナリ管理を排除します。

組織が.NET 10、C# 14、および2026年までのアプリケーション開発を計画する中で、重大な修正不可能な脆弱性を抱えたまま放棄された技術に依存し続けるか、最新の機能を備えた積極的に保守されるソリューションを採用するかの選択は、セキュリティ態勢と開発速度の両方に大きく影響します。 セキュアなPDF生成、モダンなレンダリング、簡素化されたデプロイメントを必要とするチームはIronPDFがこれらの要件に効果的に対応していることに気づくでしょう。

無料トライアルでIronPDFの評価を開始し、包括的なドキュメントを参照して、特定の要件への適合性を評価してください。