比較

DinkToPdf vs IronPdf:技術比較ガイド

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

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

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

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

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

コア クラス マッピング

DinkToPdfIronPDF
SynchronizedConverter(シンクロナイズド・コンバーター<コード>ChromePdfRenderer</コード
<コード>BasicConverter</コード<コード>ChromePdfRenderer</コード
<コード>PdfTools</コード不要
<コード>HtmlToPdfDocument</コード不要
<コード>グローバル設定</コード<コード>レンダリングオプション</コード
<コード>オブジェクト設定</コード<コード>レンダリングオプション</コード
<コード>マージン設定</コード個々のマージン特性

設定マッピング

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

スレッド セーフティの問題: SynchronizedConverterを使用している場合でも、同時実行環境ではDinkToPdfがクラッシュします。 パラレル 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年以降更新なし、wkhtmltopdfは2020年以降放棄されています -スレッドセーフ: SynchronizedConverter にもかかわらず同時使用時にクラッシュする -ネイティブ依存関係:プラットフォーム固有のバイナリが必要 -時代遅れのレンダリング:フレックスボックス/グリッドをサポートしていない 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の評価を開始し、包括的なドキュメントを参照して、特定の要件への適合性を評価してください。