比較

DinkToPdf vs IronPDF:技術比較指南

當.NET開發人員評估 PDF 生成庫時,DinkToPdf 是一個眾所周知的開源選擇,它使用 wkhtmltopdf 二進位。 然而,嚴重的安全漏洞、執行緒安全性問題以及缺乏持續維護,促使許多團隊考慮其他方案。 IronPDF提供了一個現代化的、積極維護的解決方案,採用 Chromium 渲染引擎,並且沒有原生二元依賴項。

本次比較從相關技術方面考察了這兩個庫,以幫助專業開發人員和架構師根據其.NET PDF 需求做出明智的決策。

了解 DinkToPdf

DinkToPdf 是 C# 生態系統中的一個開源程式庫,它透過 wkhtmltopdf 的封裝來實現 HTML 到 PDF 的轉換。 該庫採用 MIT 許可證,因此可以輕鬆整合到各種專案中進行修改。

DinkToPdf 封裝了 wkhtmltopdf 的功能,讓開發人員可以使用 CSS 和JavaScript將 HTML 內容轉換為 PDF 文件。 但是,該程式庫繼承了與 wkhtmltopdf 二進位檔案相關的所有安全漏洞和限制,包括嚴重的 CVE-2022-35583 SSRF(伺服器端請求偽造)問題。 wkhtmltopdf 專案自 2020 年以來已停止開發,而 DinkToPdf 本身上次更新是在 2018 年。

該程式庫需要部署特定於平台的本機二進位(Windows 版 libwkhtmltox.dll,Linux 版 libwkhtmltox.so,macOS 版 libwkhtmltox.dylib),這增加了部署的複雜性和維護成本。 此外,DinkToPdf 顯然不是線程安全的,即使使用 SynchronizedConverter 包裝器,在並發執行環境中也會導致記錄在案的失敗。

了解IronPDF

IronPDF是一個商業的.NET PDF 函式庫,它使用現代 Chromium 渲染引擎進行 HTML 到 PDF 的轉換。 該庫提供完整的 PDF 生成和操作功能,無需依賴外部本機二進位。

IronPDF支援.NET Framework 4.6.2+、. .NET Core 3.1+ 和.NET 5/6/7/8/9,採用純NuGet套件部署模型,無需進行原生依賴項管理。 該程式庫專為線程安全的並發操作而設計,能夠可靠地並行生成 PDF,而不會出現與 DinkToPdf 相關的崩潰問題。

安全比較

安全性方面的差異是這些.NET PDF 函式庫之間最顯著的差異。

安全方面DinkToPdfIronPDF
已知漏洞CVE-2022-35583 (SSRF)沒有已知漏洞
漏洞狀態未打補丁透過設計緩解
核心依賴wkhtmltopdf(已於 2020 年棄用)現代鉻
安全性更新無(項目已放棄)定期更新

DinkToPdf 繼承了 wkhtmltopdf 的 CVE-2022-35583 伺服器端請求偽造漏洞。 此漏洞允許攻擊者存取內部網路資源,為處理不受信任的 HTML 內容的應用程式帶來重大安全風險。 鑑於 wkhtmltopdf 已被棄用,這些漏洞永遠不會得到修補程式。

架構和渲染引擎比較

方面DinkToPdfIronPDF
渲染引擎過時的 WebKit(約 2015 年)現代鉻
螺紋安全並發使用中崩潰完全螺紋安全
本地依賴項平台特定二進位文件純NuGet包
CSS 支援不使用 Flexbox/Grid完整的 CSS3
JavaScript有限、不一致支援
維護棄置 (2018)積極維護
支援僅限社區專業支援

DinkToPdf 的 wkhtmltopdf 依賴項使用了約 2015 年的過時 WebKit 引擎。這造成了渲染限制,導致現代 CSS 功能(如 Flexbox 和 Grid 佈局)無法正確渲染。 JavaScript執行能力有限且不穩定,導致動態內容的處理結果不可靠。

IronPDF使用現代 Chromium 引擎,能夠以現代瀏覽器顯示的方式精確渲染 HTML,並完全支援 CSS3,包括 Flexbox 和 Grid 佈局,以及可靠的JavaScript執行和可配置的等待時間。

程式碼比較:常見 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 需要建立一個 SynchronizedConverter 對象,並使用 PdfTools 物件建立一個 HtmlToPdfDocument 對象,並使用 PdfTools 物件建構一個 HtmlToPdfDocument 對象,使用 GlobalSettingsObjectSettings 物件使用 GlobalSettingsObjectSettings GlobalSettingsDE 和 ObjectSettings 物件建構一個物件@6@DECO@ 物件@對象,轉換為 byte[] 對象,然後手動寫入檔案。 IronPDFIronPDF建立 ChromePdfRenderer 對象,呼叫 RenderHtmlAsPdf() 對象,然後儲存-只需三行程式碼,而 DinkToPdf 需要十五行程式碼。

如需了解進階 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提供了一個專門的 RenderUrlAsPdf() 方法用於直接 URL 渲染。

有關 URL 渲染的更多信息,請參閱URL 轉 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.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 將頁面設定嵌入到 GlobalSettings 中,包括嵌套的 MarginSettings 物件。 IronPDF直接在渲染器上使用 RenderingOptions 屬性,並帶有單獨的邊距屬性(MarginRight),以便進行更清晰的配置。

方法映射參考

對於正在評估 DinkToPdf 遷移或比較功能的開發人員來說,此映射顯示了等效操作:

核心類別映射

DinkToPdfIronPDF
SynchronizedConverterChromePdfRenderer
BasicConverterChromePdfRenderer
PdfTools不需要
HtmlToPdfDocument不需要
GlobalSettingsRenderingOptions
ObjectSettingsRenderingOptions
MarginSettings個體邊際屬性

設定映射

DinkToPdfIronPDF
GlobalSettings.PaperSizeRenderingOptions.PaperSize
GlobalSettings.OrientationRenderingOptions.PaperOrientation
GlobalSettings.Margins.Top = 10RenderingOptions.MarginTop = 10
ObjectSettings.HtmlContentRenderHtmlAsPdf(html)
ObjectSettings.PageRenderUrlAsPdf(url)
converter.Convert(doc) 返回 byte[]pdf.BinaryDatapdf.SaveAs()

頁首/頁尾佔位符語法

DinkToPdfIronPDF
[page]{page}
[toPage]{total-pages}
[date]{date}
[time]{time}
[title]{html-title}

功能對比總結

特徵DinkToPdfIronPDF
HTML 轉 PDF✅(過時的引擎)✅(鉻)
PDF檔案的URL
自訂邊距
頁首/頁尾✅(限量)✅(完整 HTML 程式碼)
CSS3❌ 有限✅ 已完成
Flexbox/Grid
JavaScript⚠️ 有限✅ 已完成
PDF 處理
表格填寫
數位簽名
加密
水印
合併/拆分

當團隊考慮從 DinkToPdf 遷移到IronPDF時

開發團隊基於以下幾個原因評估從 DinkToPdf 過渡到IronPDF :

安全合規性要求: wkhtmltopdf 中的 CVE-2022-35583 SSRF 漏洞會為處理不受信任的 HTML 內容的應用程式帶來不可接受的風險。 安全審計發現了這個漏洞,由於沒有可用的補丁,團隊必須進行遷移以滿足合規性要求。

線程安全性問題:即使使用 SynchronizedConverter,DinkToPdf 在並發執行環境中也會崩潰。 需要並行產生 PDF 的生產應用程式會遇到可靠性問題,而這些問題無法在 DinkToPdf 的架構中解決。

現代 CSS 需求:使用現代 CSS 佈局(Flexbox、Grid)的應用程式發現 DinkToPdf 的過時 WebKit 引擎無法正確渲染這些佈局。 建立現代 Web 介面的團隊無法產生準確的 PDF 表示。

原生二進位檔案管理:對特定於平台的 libwkhtmltox 二進位檔案的要求,使得在 Windows、Linux 和 macOS 環境中部署變得複雜。 容器部署和 CI/CD 管線需要對原生相依性進行額外配置。

已停止維護: DinkToPdf 的最後一次更新是在 2018 年,而 wkhtmltopdf 自 2020 年以來就已停止維護,因此團隊無法依賴其錯誤修復、安全性修補程式或與現代.NET版本相容的更新。

JavaScript可靠性:使用 DinkToPdf 從動態內容產生 PDF 的應用程式會遇到JavaScript執行不一致的問題。 IronPDF 的 Chromium 引擎提供可靠的JavaScript執行,並可設定等待時間。

優勢與考量

DinkToPdf 的優勢

-開源: MIT 許可證允許免費使用和修改 -簡單易用:適用於簡單用例的基本 HTML 轉 PDF 轉換 -社群:擁有成熟的使用者群體和社群資源

DinkToPdf 注意事項

-安全漏洞: CVE-2022-35583 SSRF 漏洞,未修正 -已棄用項目:自 2018 年以來未更新,wkhtmltopdf 自 2020 年起已棄用。 -線程安全:儘管使用了 SynchronizedConverter,但在並發使用時仍然崩潰 -原生依賴項:需要特定平台的二進位文件 -渲染方式過時:使用 2015 年的 WebKit 引擎,不支援 Flexbox/Grid。

  • JavaScript受限:執行不穩定

IronPDF 的優勢

-現代渲染:採用 Chromium 引擎,完全支援 CSS3 和JavaScript -線程安全:專為並發操作而設計 -無原生依賴:純NuGet套件部署 -主動維護:定期更新和安全性補丁 -專業支援:提供企業級支持 -擴充功能: PDF 編輯、表單、簽名、加密、浮水印 -豐富的資源:全面的教學文檔

IronPDF注意事項

-商業許可:生產用途需要獲得許可

結論

DinkToPdf 和IronPDF代表了.NET應用程式中產生 PDF 的兩種截然不同的方法。 DinkToPdf 提供開源訪問,但存在嚴重的安全漏洞、線程安全問題以及已停止維護的狀態,這會造成重大的生產風險。

IronPDF提供了一種現代化的替代方案,它採用 Chromium 渲染引擎、線程安全架構,沒有原生依賴項,並且正在積極維護。 對於需要安全性合規性、並發 PDF 產生、現代 CSS 支援或可靠的JavaScript執行的團隊, IronPDF可以滿足這些特定要求。

隨著各組織規劃.NET 10、C# 14 以及到 2026 年的應用程式開發,在存在已知漏洞的廢棄庫和積極維護的解決方案之間進行選擇,既會影響當前的功能,也會影響長期的安全狀況。 團隊應根據每個函式庫的特性,評估其特定需求(安全合規性、並發需求、CSS 複雜性和部署限制)。

立即開始免費試用IronPDF ,並瀏覽其全面的文檔,以評估其是否符合您的特定需求。