比較

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 は変換に SynchronizedConverterPdfTools を使用します。 構成は、ページ オプション (ColorMode、Orientation、PaperSize、Margins) の GlobalSettings とコンテンツ (HTML 文字列の HtmlContent、URL の Page) の ObjectSettings を含む 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年)Chromium(現在)
HTML5/CSS3制限的サポート対象
JavaScript(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 では、PdfTools を使用して SynchronizedConverter を作成し、ネストされた GlobalSettings および ObjectSettings オブジェクトを使用して HtmlToPdfDocument を構築し、生のバイトを取得するために Convert() を呼び出して、最後に File.WriteAllBytes() を使用して手動でディスクに書き込む必要があります。

IronPDF はChromePdfRenderer を作成し、HTML 文字列で RenderHtmlAsPdf() を直接呼び出して、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() メソッドを提供します。これは、この特定のユース ケース向けのよりクリーンな API です。

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 プロパティを使用します。 プロパティは、型指定された列挙型 (PdfPaperOrientation.Landscape) を使用して個別に設定されます (MarginTop など)。 どちらもマージンの単位にミリメートルを使用しています。

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

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

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

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

Haukcode.DinkToPdfIronPDF
SynchronizedConverterChromePdfRenderer
BasicConverterChromePdfRenderer
PdfTools該当なし
IConverter該当なし

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

Haukcode.DinkToPdfIronPDF
HtmlToPdfDocumentメソッドコール
GlobalSettingsRenderingOptions
ObjectSettingsRenderingOptions
converter.Convert(doc)renderer.RenderHtmlAsPdf(html)

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

GlobalSettings プロパティIronPDF プロパティ
ColorModeRenderingOptions.GrayScale
OrientationRenderingOptions.PaperOrientation
PaperSizeRenderingOptions.PaperSize
Margins.TopRenderingOptions.MarginTop
Margins.BottomRenderingOptions.MarginBottom
Margins.LeftRenderingOptions.MarginLeft
Margins.RightRenderingOptions.MarginRight

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

オブジェクト設定プロパティIronPDF 同等物
HtmlContent最初のパラメータはRenderHtmlAsPdf()
Page (URL)renderer.RenderUrlAsPdf(url)
HeaderSettings.Right = "[page]"TextHeader.RightText = "{page}"

プレースホルダーの構文の違い

ヘッダー/フッターのプレースホルダーは、ライブラリ間で異なる構文を使用します:

Haukcode.DinkToPdfIronPDF
[page]{page}
[toPage]{total-pages}
[date]{date}

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

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(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.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が必要です。
  • スレッド安全性の問題: シングルトンパターンが必要です。
  • 限られたウェブ標準: 時代遅れのQt WebKitエンジン
  • プロフェッショナルサポートはありません:コミュニティのみのサポートです。
  • 技術的負債:放棄されたプロジェクトへの依存は、リスクを増大させます。

IronPDFの強み

  • 積極的なセキュリティパッチ適用:定期的なアップデートで脆弱性に対処します。
  • 最新のChromiumエンジン: 現在のウェブ標準をサポートしています。
  • 自己完結型:ネイティブバイナリに依存しない。
  • スレッドセーフ設計:柔軟なデプロイパターン
  • 完全な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の評価を開始し、包括的なドキュメントを参照して、特定の要件への適合性を評価してください。