比較

DinkToPdf vs IronPdf:技術比較ガイド

DinkToPdfvs IronPDF:.NET開発者のための技術比較

.NET開発者がPDF生成ライブラリを評価するとき、DinkToPdfはwkhtmltopdfバイナリをラップした人気のあるオープンソースオプションとして浮上します。 しかし、重大なセキュリティの脆弱性、スレッドの安全性の問題、メンテナンスの放棄などにより、多くのチームが代替案を検討するようになりました。 IronPDFはChromiumレンダリングエンジンとネイティブバイナリ依存のない、最新でアクティブにメンテナンスされたソリューションを提供します。

この比較では、プロの開発者やアーキテクトが.NET PDFの要件について十分な情報を得た上で決定できるように、技術的に関連する次元で両ライブラリを検証します。

DinkToPdfについて

DinkToPdfは、wkhtmltopdfのラッパーを使用してHTMLからPDFへの変換を可能にする、C#エコシステムのオープンソースライブラリです。 ライブラリはMITライセンスを使用しているため、さまざまなプロジェクトでの統合や変更が可能です。

DinkToPdfは、wkhtmltopdfの機能をカプセル化し、開発者がCSSとJavaScriptを含むHTMLコンテンツをPDF文書に変換できるようにします。 ただし、このライブラリは、重大なCVE-2022-35583 SSRF (Server-Side Request Forgery)問題を含む、wkhtmltopdfバイナリに関連するすべてのセキュリティ脆弱性と制限を継承します。 wkhtmltopdfプロジェクトは2020年から放棄され、DinkToPdf自体は2018年に更新された。

ライブラリは、プラットフォーム固有のネイティブバイナリ(Windowsの場合はlibwkhtmltox.dll、Linuxの場合はlibwkhtmltox.so、macOSの場合はlibwkhtmltox.dylib)をデプロイする必要があり、デプロイの複雑さとメンテナンスのオーバーヘッドを生み出します。 さらに、DinkToPdfはスレッドセーフではないため、SynchronizedConverterラッパーを使用しても、同時実行環境ではドキュメントに失敗することがあります。

IronPDFの理解

IronPDFは商用.NET PDFライブラリで、HTMLからPDFへの変換に最新のChromiumレンダリングエンジンを使用しています。 このライブラリは、外部のネイティブバイナリに依存することなく、包括的なPDF生成・操作機能を提供します。

IronPDFは.NET Framework 4.6.2+、.NET Core 3.1+、.NET 5/6/7/8/9をサポートし、ネイティブの依存性管理を排除した純粋なNuGetパッケージデプロイメントモデルを採用しています。 このライブラリは、スレッドセーフな並行処理ができるように設計されており、DinkToPdfのようなクラッシュを起こすことなく、堅牢な並列PDF生成が可能です。

セキュリティの比較

これらの.NET PDFライブラリの最も大きな違いは、セキュリティの意味合いです。

セキュリティ面DinkToPdfIronPDF
既知の脆弱性についてCVE-2022-35583 (SSRF)既知の脆弱性なし
未パッチデザインによる軽減
コアの依存関係wkhtmltopdf(2020年廃止予定)モダンChromium
セキュリティ・アップデートなし(プロジェクト中止)定期的な更新

DinkToPdf は、wkhtmltopdf の CVE-2022-35583 Server-Side Request Forgery 脆弱性を継承しています。 この脆弱性は、攻撃者が内部ネットワークリソースにアクセスすることを可能にし、信頼されていない HTML コンテンツを処理するアプリケーションに重大なセキュリティリスクをもたらします。 wkhtmltopdfが放棄された状態であるため、これらの脆弱性にパッチが適用されることはありません。

アーキテクチャとレンダリング エンジンの比較

アスペクトDinkToPdfIronPDF
レンダリングエンジン時代遅れのWebKit(2015年頃)モダンChromium
スレッドセーフティ同時使用時のクラッシュ完全スレッドセーフ
ネイティブの依存関係プラットフォーム固有のバイナリ純粋なNuGetパッケージ
CSSサポートフレックスボックス/グリッドなし完全なCSS3
JavaScript(ジャバスクリプト限定的で一貫性がないフルサポート
メンテナンス見捨てられた (2018)積極的なメンテナンス
サポートコミュニティ限定プロフェッショナルサポート

DinkToPdfのwkhtmltopdf依存ファイルは、2015年頃の古いWebKitエンジンを使用しています。このため、FlexboxやGridレイアウトのような最新のCSS機能が正しくレンダリングされないというレンダリングの制限が発生します。 JavaScriptの実行には制限があり、一貫性がないため、動的コンテンツでは信頼性の低い結果が得られます。

IronPDFは最新のChromiumエンジンを使用しており、FlexboxやGridレイアウトを含むCSS3の完全なサポートと、設定可能な待ち時間による信頼性の高いJavaScriptの実行により、現代のブラウザが表示するようにHTMLを正確にレンダリングします。

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

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

最も基本的な操作は、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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

DinkToPdfは、PdfToolsSynchronizedConverterを作成し、GlobalSettingsObjectSettingsHtmlToPdfDocumentを構成し、WebSettingsを設定し、byte[]に変換し、手動でファイルに書き込む必要があります。IronPDFはChromePdfRendererを作成し、RenderHtmlAsPdf()を呼び出し、15行に対して3行を保存します。

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

URLからPDFへの変換

ウェブページを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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

DinkToPdfは、ObjectSettings内のPageプロパティを使用してURLを指定するため、同じドキュメント・ラッパー構造を必要とします。 IronPdfは直接URLをレンダリングするための専用のRenderUrlAsPdf()メソッドを提供します。

URL レンダリングの詳細については、URL to PDF documentationを参照してください。

カスタム ページ設定と余白

ページの向きと余白の設定は、設定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.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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

DinkToPdfは、ネストされたMarginSettingsオブジェクトを含むGlobalSettings内にページ設定を埋め込みます。 IronPDFはRenderingOptionsプロパティをレンダラー上で直接使用し、個々のマージンプロパティ(MarginTop<//code>, MarginBottom<//code>, MarginLeft<//code>, MarginRight<//code>)でより明確な設定を行います。

メソッド マッピング リファレンス

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

コア クラス マッピング

DinkToPdfIronPDFノート
SynchronizedConverter(シンクロナイズド・コンバーター<コード>ChromePdfRenderer</コードデフォルトでスレッドセーフ
<コード>BasicConverter</コード<コード>ChromePdfRenderer</コード同じクラスでよりシンプルに
<コード>PdfTools</コード不要内部化
<コード>HtmlToPdfDocument</コード不要直接メソッド呼び出し
<コード>グローバル設定</コード<コード>レンダリングオプション</コードレンダラーの一部
<コード>オブジェクト設定</コード<コード>レンダリングオプション</コードレンダラーの一部
<コード>マージン設定</コード個々のマージン特性MarginTopMarginBottomなど。

設定マッピング

DinkToPdfIronPDF
<コード>GlobalSettings.PaperSize</コード<コード>RenderingOptions.PaperSize</コード
<コード>GlobalSettings.Orientation</コード<コード>RenderingOptions.PaperOrientation</コード
GlobalSettings.Margins.Top = 10.RenderingOptions.MarginTop = 10.
<コード>ObjectSettings.HtmlContent</コードRenderHtmlAsPdf(html)を使用してください。
<コード>オブジェクト設定.ページ</コードRenderUrlAsPdf(url)を使用してください。
converter.Convert(doc)byte[] を返します。pdf.BinaryDataまたはpdf.SaveAs()

ヘッダー/フッターのプレースホルダーの構文

DinkToPdfIronPDF
<コード>[ページ]</コード<コード>{ページ}</コード
<コード>[toPage]</コード<コード>{総ページ数}</コード
<コード>[日付]</コード{date}<//code>
<コード>[時間]</コード<コード>{時間}</コード
<コード>[タイトル]</コード{html-title}<//code>

機能比較の概要

フィーチャーDinkToPdfIronPDF
HTMLからPDFへ✅ (古いエンジン)✅ (Chromium)
URLからPDFへ
カスタムマージン
ヘッダー/フッター✅ (限定)✅ (完全なHTML)
CSS3❌ 制限付きフル
フレックスボックス/グリッド
JavaScript⚠️ 有限会社フル
PDF操作
フォーム入力
デジタル署名
暗号化
透かし
マージ/スプリット

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

開発チームがDinkToPdfからIronPdfへの移行を評価する理由はいくつかあります:

セキュリティコンプライアンスの要件:wkhtmltopdfのCVE-2022-35583 SSRF脆弱性は、信頼されていないHTMLコンテンツを処理するアプリケーションに許容できないリスクを生じさせます。 セキュリティ監査ではこの脆弱性が指摘されており、パッチが提供されていないため、チームはコンプライアンス要件に対応するために移行しなければなりません。

スレッド安全性の問題:DinkToPdf は、SynchronizedConverter を使用していても、同時実行環境でクラッシュします。 パラレル PDF 生成を必要とするプロダクション・アプリケーションでは、DinkToPdf のアーキテクチャでは解決できない信頼性の問題が発生します。

モダンCSSの要件:最新のCSSレイアウト(Flexbox、Grid)を使用するアプリケーションでは、DinkToPdfの古いWebKitエンジンではこれらのレイアウトを正しくレンダリングできません。 最新のウェブインターフェースを構築するチームは、正確なPDF表現を生成できません。

ネイティブのバイナリ管理: プラットフォーム固有の libwkhtmltox バイナリが必要なため、Windows、Linux、macOS 環境でのデプロイが複雑になります。 コンテナのデプロイメントとCI/CDパイプラインでは、ネイティブの依存関係のための追加設定が必要です。

メンテナンスの放棄:DinkToPdfの最後のアップデートは2018年で、wkhtmltopdfは2020年以降放置されているため、チームは最新の.NETバージョンのバグ修正、セキュリティパッチ、互換性アップデートに頼ることができません。

JavaScriptの信頼性:動的コンテンツからPDFを生成するアプリケーションは、DinkToPdfではJavaScriptの実行に一貫性がありません。 IronPDFのChromiumエンジンは、設定可能な待ち時間で信頼性の高いJavaScriptの実行を提供します。

長所と考慮点

DinkToPdfの強み

  • オープンソース:MITライセンスにより、自由な使用と変更が可能です。
  • シンプルさ:単純な使用例のための基本的なHTMLからPDFへの変換
  • コミュニティ:コミュニティリソースを持つ確立されたユーザーベース

DinkToPdfについての考察

  • セキュリティ脆弱性:CVE-2022-35583 SSRFの脆弱性、パッチ未適用
  • 放棄されたプロジェクト: 2018年以降更新なし、2020年以降放棄されたwkhtmltopdf
  • スレッドセーフ:SynchronizedConverter にもかかわらず同時使用でクラッシュする
  • ネイティブの依存関係:プラットフォーム固有のバイナリが必要
  • 時代遅れのレンダリング:Flexbox/Grid をサポートしない 2015 年の WebKit エンジン
  • 限られたJavaScript:一貫性のない実行

IronPDFの強み

  • モダンレンダリング:CSS3とJavaScriptをフルサポートしたChromiumエンジン
  • スレッドセーフ:並行処理のために設計されています。
  • ネイティブ依存なし:純粋なNuGetパッケージのデプロイメント
  • 積極的なメンテナンス:定期的なアップデートとセキュリティパッチ
  • プロフェッショナルサポート: エンタープライズグレードのサポートをご利用いただけます。
  • 拡張機能:PDF操作、フォーム、署名、暗号化、透かし
  • 豊富なリソース:包括的なチュートリアルドキュメント

IronPDFについての考察

  • 商用ライセンス:商用利用にはライセンスが必要です。

結論

DinkToPdfとIronPDFは、.NETアプリケーションでのPDF生成において根本的に異なるアプローチです。 DinkToPdfはオープンソースでアクセシビリティを提供していますが、重大なセキュリティの脆弱性、スレッドの安全性の問題、メンテナンスが放棄された状態であるため、生産上の重大なリスクがあります。

IronPdfはChromiumレンダリングエンジン、スレッドセーフアーキテクチャ、ネイティブ依存なし、積極的なメンテナンスで最新の選択肢を提供します。 セキュリティコンプライアンス、PDFの同時生成、モダンなCSSのサポート、信頼性の高いJavaScriptの実行を必要とするチームにとって、IronPdfはこれらの特定の要件に対応します。

組織が.NET 10、C# 14、および2026年までのアプリケーション開発を計画する際、既知の脆弱性を持つ放棄されたライブラリと積極的に保守されるソリューションのどちらを選択するかは、当面の機能と長期的なセキュリティ姿勢の両方に影響します。 各チームは、セキュリティコンプライアンス、並行処理の必要性、CSSの複雑さ、デプロイの制約など、各ライブラリの特徴と照らし合わせながら、固有の要件を評価する必要があります。

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