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 は、変換にPdfToolsとSynchronizedConverterを使用します。 構成は、ページ オプションの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.DinkToPdf | IronPDF |
|---|---|---|
| クリティカルなCVE | CVE-2022-35583 (CVSS 9.8、未修正) | 積極的にパッチを適用 |
| 基盤エンジン | wkhtmltopdf(Qt WebKit ~2015) | Chromium (定期的に更新) |
| プロジェクトステータス | 放棄されたプロジェクトのフォーク | 積極的に開発 |
| セキュリティ・アップデート | 特になし | 定期リリース |
| サポート | コミュニティ限定 | プロフェッショナルサポート |
アーキテクチャとエンジンの比較
基本的なアーキテクチャの違いは、レンダリングの品質、最新のWeb標準のサポート、デプロイの複雑さに影響します。
| アスペクト | Haukcode.DinkToPdf | IronPDF |
|---|---|---|
| レンダリングエンジン | 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);
}
}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");
}
}Haukcode.DinkToPdfは、PdfToolsでSynchronizedConverterを作成し、入れ子になったGlobalSettingsとObjectSettingsオブジェクトで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);
}
}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");
}
}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);
}
}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");
}
}Haukcode.DinkToPdfは、ネストされたMarginSettingsオブジェクトを持つGlobalSettingsを通してページ設定を構成します。 プロパティは、Orientation.LandscapeやPaperKind.Letterのような列挙型を使用します。
IronPDFはRenderingOptionsプロパティをレンダラー上で直接使用します。 プロパティは、型付き列挙型(PdfPaperSize.Letter、PaperOrientation、MarginTopなど)で個別に設定されます(PdfPaperSize.Letter、PdfPaperOrientation.Landscape)。 どちらもマージンの単位にミリメートルを使用しています。
レンダリングの設定については、IronPDFチュートリアルをご覧ください。
APIマッピングリファレンス
Haukcode.DinkToPdfの移行を評価したり、機能を比較したりする開発者のために、このマッピングは同等の操作を示しています:
コンバーター・クラスのマッピング
| Haukcode.DinkToPdf | IronPDF |
|---|---|
SynchronizedConverter(シンクロナイズド・コンバーター | <コード>ChromePdfRenderer</コード |
| <コード>BasicConverter</コード | <コード>ChromePdfRenderer</コード |
| <コード>PdfTools</コード | 該当なし |
| <コード>IConverter</コード | 該当なし |
ドキュメント構成マッピング
| Haukcode.DinkToPdf | IronPDF |
|---|---|
| <コード>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.DinkToPdf | IronPDF |
|---|---|
| <コード>[ページ]</コード | <コード>{ページ}</コード |
| <コード>[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()));
}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!
}IronPDFは設計上スレッドセーフであり、シングルトン要件なしで柔軟な依存性注入パターンを可能にします。
機能比較の概要
| フィーチャー | Haukcode.DinkToPdf | IronPDF |
|---|---|---|
| ソースオリジン | 放棄されたプロジェクトのフォーク | 独自開発 |
| セキュリティ。 | アップストリームから継承された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.dll 、 libwkhtmltox.so 、 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が必要 -スレッドセーフティの問題:シングルトンパターンが必要 -制限された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の評価を開始し、包括的なドキュメントを参照して、特定の要件への適合性を評価してください。