比較

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.DinkToPdfIronPDF
關鍵 CVECVE-2022-35583 (CVSS 9.8, 不可修復)積極修補
基礎引擎wkhtmltopdf (Qt WebKit ~2015)Chromium (定期更新)
專案狀態廢棄專案的分叉積極開發
安全性更新無預期定期發佈
<強>支援</強僅限社群專業支援

架構與引擎比較

基本的架構差異會影響渲染品質、現代網路標準支援以及部署複雜度。

範疇Haukcode.DinkToPdfIronPDF
渲染引擎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.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Haukcode.DinkToPdf需要使用PdfTools建立一個SynchronizedConverter,用嵌套的GlobalSettingsObjectSettings物件建構一個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.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

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

Haukcode.DinkToPdf 透過嵌套 MarginSettings 物件的全局設定來設定頁面設定。 屬性使用諸如 Orientation.LandscapePaperKind.Letter 之類的枚數。

IronPdf 直接在渲染器上使用渲染選項屬性。 屬性可個別設定 (PaperSizePaperOrientationMarginTop 等) 與類型化的枚舉 (PdfPaperSize.LetterPdfPaperOrientation.Landscape)。 兩者都使用毫米作為邊界單位。

IronPDF教學中了解更多關於渲染配置的資訊。

API 對應參考。

對於評估 Haukcode.DinkToPdf 遷移或比較功能的開發人員而言,此對應圖顯示等效的操作:

轉換器類別對應

Haukcode.DinkToPdfIronPDF筆記
同步轉換器<代碼>ChromePdfRenderer</代碼線程安全,無需單元
基本轉換器<代碼>ChromePdfRenderer</代碼相同的類別處理兩者
<編碼>PdfTools</編碼不適用不需要
IConverter不適用直接使用渲染器

文件配置映射

Haukcode.DinkToPdfIronPDF筆記
<編碼>HtmlToPdfDocument</編碼方法調用直接使用 RenderHtmlAsPdf()
全局設定渲染選項渲染前設定
物件設定渲染選項合併為一個
converter.Convert(doc)renderer.RenderHtmlAsPdf(html)返回 PdfDocument

GlobalSettings 屬性對應

GlobalSettings 屬性IronPdf 特性筆記
<編碼>ColorMode</編碼RenderingOptions.GrayScale布林,設定 true 為灰階
<編碼>方向</編碼<編碼>RenderingOptions.PaperOrientation</編碼肖像風景
紙張大小RenderingOptions.PaperSize使用 PdfPaperSize 枚舉
Margins.TopRenderingOptions.MarginTop以毫米為單位
邊界.底部RenderingOptions.MarginBottom以毫米為單位
Margins.LeftRenderingOptions.MarginLeft以毫米為單位
Margins.Right<編碼>RenderingOptions.MarginRight</編碼以毫米為單位

物件設定屬性對應

物件設定屬性IronPdf 同等級產品筆記
<編碼>Html內容</編碼RenderHtmlAsPdf() 的第一個參數直接參數
頁面 (URL)renderer.RenderUrlAsPdf(url)獨立方法
HeaderSettings.Right = "[page]"TextHeader.RightText="{page}"不同的占位符語法

占位符語法差異

Header/footer 占位符在不同的程式庫中使用不同的語法:

Haukcode.DinkToPdfIronPDF
[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.com
$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!
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 在設計上是線程安全的,允許靈活的依賴注入模式,而不需要單例。

功能比較摘要

特點Haukcode.DinkToPdfIronPDF
來源廢棄專案的分叉獨立開發
安全性從上游繼承的 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.dlllibwkhtmltox.solibwkhtmltox.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的優勢

  • 主動安全修補程式:定期更新處理漏洞
  • 現代 Chromium 引擎:目前的網頁標準支援
  • 自包含:無本機二進制相依性
  • 線程安全設計:靈活的部署模式
  • 完整的 HTML5/CSS3/JavaScript:現代化的呈現能力
  • 專業支援:專屬工程支援
  • 全面的資源:廣泛的教學文件

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能有效滿足這些需求。

免費試用開始評估 IronPDF,並探索全面的文件,以評估是否適合您的特定需求。