Haukcode.DinkToPdf vs IronPDF:技術比較指南
Haukcode.DinkToPdf vs IronPDF:安全性、架構和現代 .NET PDF 生成。
當 .NET 開發人員評估 PDF 產生解決方案時,Haukcode.DinkToPdf 就會出現,它是被拋棄的 DinkToPdf 專案的分叉,包覆了 wkhtmltopdf 二進位檔案。 雖然 Haukcode.DinkToPdf 提供了基本的 HTML-to-PDF 功能,但它繼承了 wkhtmltopdf 的重要安全漏洞,這些漏洞永遠不會修補,因為底層專案已經廢棄。 IronPdf 提供了一種與眾不同的方法:一個使用現代 Chromium 引擎並定期進行安全更新的主動維護函式庫。
本比較針對技術上相關的層面檢視這兩個函式庫,以協助專業開發人員和架構人員針對他們的 .NET PDF 需求做出明智的決定。
瞭解 Haukcode.DinkToPdf
Haukcode.DinkToPdf 是先前大受歡迎的 DinkToPdf 函式庫的分叉,而 DinkToPdf 函式庫是建構在現已停用的 wkhtmltopdf 二進位檔上。 該函式庫旨在保持與 .NET Core 的相容性,同時提供 HTML 至 PDF 的轉換功能。 由於 Haukcode.DinkToPdf 是一個廢棄專案的分叉,因此有很大的限制。
Haukcode.DinkToPdf 使用同步轉換器與<編碼>PdfTools</編碼作為其主要的轉換機制。 配置是透過<編碼>HtmlToPdfDocument</編碼物件來處理,這些物件包含頁面層級選項的全局設定(ColorMode、Orientation、PaperSize、Margins) 和內容的物件設定(HTML 字串的 HtmlContent、URL 的 Page)。converter.Convert(doc)方法返回原始 byte[] 資料。
該函式庫需要特定平台的本機二進位檔:libwkhtmltox.dll (Windows), libwkhtmltox.so (Linux), 和 libwkhtmltox.dylib (macOS). 由於底層 wkhtmltopdf 的限制,線程安全需要以單一模式使用同步轉換器。
了解 IronPDF
IronPDF 是一個獨立開發的 .NET 函式庫,使用現代的 Chromium 演算引擎。該函式庫透過定期更新、專業支援和持續的安全修補程式進行積極的維護。
IronPDF 使用<代碼>ChromePdfRenderer</代碼作為其主要的渲染類別,並透過渲染選項屬性進行設定。 像 RenderHtmlAsPdf() 和 RenderUrlAsPdf() 之類的方法會返回 PdfDocument 物件,這些物件可以用 SaveAs() 儲存或以 BinaryData 存取。 這個函式庫是獨立的,不需要外部的原生二進位檔,而且在設計上是線程安全的,不需要單件模式。
關鍵的安全性考量
這些函式庫最顯著的差異在於安全性。 Haukcode.DinkToPdf 繼承了 CVE-2022-35583,這是一個重要的伺服器端請求偽造 (SSRF) 漏洞,CVSS 得分為 9.8。
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 (定期更新) |
| 專案狀態 | 廢棄專案的分叉 | 積極開發 |
| 安全性更新 | 無預期 | 定期發佈 |
| <強>支援</強 | 僅限社群 | 專業支援 |
架構與引擎比較
基本的架構差異會影響渲染品質、現代網路標準支援以及部署複雜度。
| 範疇 | Haukcode.DinkToPdf | IronPDF |
|---|---|---|
| 渲染引擎 | Qt WebKit (~2015) | Chromium (目前) |
| HTML5/CSS3。 | 限額 | 全面支援 |
| JavaScript。 | 有限、不安全 | 完整的 V8 引擎 |
| 原生二進位 | 必需(特定平台) | 自成一格 |
| 線程安全 | 需要單元模式 | 線程安全的設計 |
| 更新 | 無預期 | 定期發佈 |
Haukcode.DinkToPdf 依賴於過時的 Qt WebKit 引擎,這意味著會錯過多年的安全修補程式,且對現代網頁標準的支援有限。IronPDF的 Chromium 引擎可定期更新,提供當前的 Web 標準支援。
程式碼比較:常見的 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHaukcode.DinkToPdf需要使用PdfTools建立一個SynchronizedConverter,用嵌套的GlobalSettings和ObjectSettings物件建構一個HtmlToPdfDocument,呼叫Convert()取得原始位元組,然後用File.WriteAllBytes()手動寫入磁碟。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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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.comHaukcode.DinkToPdf 使用與 ObjectSettings.Page 屬性相同的<編碼>HtmlToPdfDocument</編碼結構來指定 URL。IronPDF提供了一個專用的 RenderUrlAsPdf() 方法,可直接接受 URL--對於此特定用例而言,這是一個更乾淨的 API。
請注意,使用 Haukcode.DinkToPdf 的 URL 渲染會帶有 CVE-2022-35583 SSRF 漏洞風險,因為惡意 URL 或重定向可能會利用伺服器。
自訂頁面設定
頁面配置展示了不同的配置模型。
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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHaukcode.DinkToPdf 透過嵌套 MarginSettings 物件的全局設定來設定頁面設定。 屬性使用諸如 Orientation.Landscape 和 PaperKind.Letter 之類的枚數。
IronPdf 直接在渲染器上使用渲染選項屬性。 屬性可個別設定 (PaperSize、PaperOrientation、MarginTop 等) 與類型化的枚舉 (PdfPaperSize.Letter、PdfPaperOrientation.Landscape)。 兩者都使用毫米作為邊界單位。
在IronPDF教學中了解更多關於渲染配置的資訊。
API 對應參考。
對於評估 Haukcode.DinkToPdf 遷移或比較功能的開發人員而言,此對應圖顯示等效的操作:
轉換器類別對應
| Haukcode.DinkToPdf | IronPDF | 筆記 |
|---|---|---|
同步轉換器 | <代碼>ChromePdfRenderer</代碼 | 線程安全,無需單元 |
基本轉換器 | <代碼>ChromePdfRenderer</代碼 | 相同的類別處理兩者 |
| <編碼>PdfTools</編碼 | 不適用 | 不需要 |
IConverter | 不適用 | 直接使用渲染器 |
文件配置映射
| Haukcode.DinkToPdf | IronPDF | 筆記 |
|---|---|---|
| <編碼>HtmlToPdfDocument</編碼 | 方法調用 | 直接使用 RenderHtmlAsPdf() |
全局設定 | 渲染選項 | 渲染前設定 |
物件設定 | 渲染選項 | 合併為一個 |
converter.Convert(doc) | renderer.RenderHtmlAsPdf(html)。 | 返回 PdfDocument |
GlobalSettings 屬性對應
| GlobalSettings 屬性 | IronPdf 特性 | 筆記 |
|---|---|---|
| <編碼>ColorMode</編碼 | RenderingOptions.GrayScale | 布林,設定 true 為灰階 |
| <編碼>方向</編碼 | <編碼>RenderingOptions.PaperOrientation</編碼 | 肖像或風景 |
紙張大小 | RenderingOptions.PaperSize | 使用 PdfPaperSize 枚舉 |
Margins.Top | RenderingOptions.MarginTop | 以毫米為單位 |
邊界.底部 | RenderingOptions.MarginBottom | 以毫米為單位 |
Margins.Left | RenderingOptions.MarginLeft | 以毫米為單位 |
Margins.Right | <編碼>RenderingOptions.MarginRight</編碼 | 以毫米為單位 |
物件設定屬性對應
| 物件設定屬性 | IronPdf 同等級產品 | 筆記 |
|---|---|---|
| <編碼>Html內容</編碼 | RenderHtmlAsPdf() 的第一個參數 | 直接參數 |
頁面 (URL) | renderer.RenderUrlAsPdf(url)。 | 獨立方法 |
HeaderSettings.Right = "[page]" | TextHeader.RightText="{page}"。 | 不同的占位符語法 |
占位符語法差異
Header/footer 占位符在不同的程式庫中使用不同的語法:
| Haukcode.DinkToPdf | IronPDF |
|---|---|
[page] | {page} |
[toPage] | {總頁數} |
[日期] | <編碼>{日期}</編碼 |
線程安全與依賴注入
由於從 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()));
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF(靈活):
// 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!
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 在設計上是線程安全的,允許靈活的依賴注入模式,而不需要單例。
功能比較摘要
| 特點 | 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 是獨立的,沒有外部二進位檔案。
線程安全限制:所需的同步轉換器單件模式限制了架構的靈活性,並可能在負載下產生瓶頸。IronPDF在設計上是線程安全的,允許按要求實體。
現代網路標準:有限的 HTML5/CSS3 支援和不安全的 JavaScript 執行限制了現代網頁內容的呈現能力。IronPDF的 Chromium 引擎提供當前的 Web 標準支援。
長期可行性:對廢棄技術的依賴會造成技術債務,並隨時間累積。隨著專案逐漸朝著 .NET 10 與 C# 14 發展至 2026 年,維持對未維護的 wkhtmltopdf wrappers 的依賴會變得越來越成问题。
優勢和考慮因素
Haukcode.DinkToPdf 的優勢
- 免費且開放原始碼:MIT 授權,無授權費用
- 基本功能:支援基本的 HTML 至 PDF 轉換。
- 現有的程式碼庫:已經使用 DinkToPdf 的團隊所熟悉的程式碼庫
Haukcode.DinkToPdf 注意事項
- 關鍵安全漏洞:CVE-2022-35583 無法修復
- 廢棄的技術:建基於停產的 wkhtmltopdf
- 原生二進位依賴:需要特定平台的 DLL
- 線程安全問題:需要單件模式
- 有限的 Web 標準:過時的 Qt WebKit 引擎
- 無專業支援:僅提供社群協助
- 技術債務:對被遺棄專案的依賴使風險更加複雜
IronPDF的優勢
IronPDF注意事項
- 商業授權:必須用於生產用途
結論
Haukcode.DinkToPdf 和IronPDF代表了在 .NET 應用程式中生成 PDF 的基本不同方法。 Haukcode.DinkToPdf 作為已廢棄的 DinkToPdf 專案的分叉,包覆已停產的 wkhtmltopdf 二進位檔,存在永遠無法修補的重大安全漏洞 (CVE-2022-35583)。 該函式庫需要本機二進位發行、單機模式以確保線程安全,並提供有限的現代網路標準支援。
IronPDF 提供積極維護的替代方案,具有現代化的 Chromium 引擎、定期的安全更新以及線程安全的架構。 這個自足的函式庫省去原生二進位管理,同時提供完整的 HTML5/CSS3/JavaScript 支援。
由於組織要規劃 .NET 10、C# 14,以及到 2026 年的應用程式開發,因此在維持對有嚴重無法修復漏洞的廢棄技術的依賴,與採用具有現代功能的積極維護解決方案之間,兩者的選擇都會對安全勢態與開發速度造成重大影響。 需要安全生成 PDF、現代化渲染或簡化部署的團隊會發現IronPDF能有效滿足這些需求。