比較

DinkToPdf vs IronPDF:技術比較指南

當.NET開發人員評估PDF生成程式庫時,DinkToPdf是一個使用wkhtmltopdf二進位檔的知名開源選擇。 然而,重大安全漏洞、執行緒安全性問題和缺乏持續維護使得許多團隊考慮替代方案。 IronPDF提供了一個現代的、積極維護的解決方案,具有Chromium渲染引擎,且不依賴本機二進位檔。

此比較在相關技術方面審視這兩個程式庫,以協助專業開發人員和建築師在.NET PDF需求中做出明智決策。

了解DinkToPdf

DinkToPdf是C#生態系統中的一個開源程式庫,通過wkhtmltopdf的包裝器實現HTML到PDF的轉換。 該程式庫使用MIT許可證,使其可在各種專案中進行整合和修改。

DinkToPdf封裝了wkhtmltopdf的功能,允許開發人員將HTML內容與CSS和JavaScript一起轉換為PDF文件。 然而,這個程式庫繼承了與wkhtmltopdf二進位檔相關的所有安全漏洞和限制,包括關鍵的CVE-2022-35583 SSRF(伺服器端請求偽造)問題。 自2020年起wkhtmltopdf專案被放棄,並且DinkToPdf自身最後一次獲得更新是在2018年。

該程式庫需要部署特定平臺的本機二進位檔(Windows使用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年被棄用)現代Chromium
安全更新無(專案被棄用)定期更新

DinkToPdf繼承了wkhtmltopdf的CVE-2022-35583伺服器端請求偽造漏洞。 這個漏洞允許攻擊者存取內部網路資源,為處理不可信HTML內容的應用程式創造了重大的安全風險。 考量到wkhtmltopdf的棄用狀態,這些漏洞將永遠不會接受修補。

架構和渲染引擎比較

方面DinkToPdfIronPDF
渲染引擎過時的WebKit(約2015年)現代Chromium
執行緒安全性並發使用時崩潰完全執行緒安全
本機相依性特定平臺的二進位檔純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);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())
        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = {
                New ObjectSettings() With {
                    .HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
                    .WebSettings = New WebSettings() With {
                        .DefaultEncoding = "utf-8"
                    }
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Module
$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");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

DinkToPdf需要建立RenderHtmlAsPdf(),並保存——三行對十五行。

想了解進階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);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())
        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Portrait,
                .PaperSize = PaperKind.A4
            },
            .Objects = New List(Of ObjectSettings) From {
                New ObjectSettings() With {
                    .Page = "https://www.example.com"
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Module
$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");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

DinkToPdf使用ObjectSettings指定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);
    }
}
Imports DinkToPdf
Imports DinkToPdf.Contracts
Imports System.IO

Module Program
    Sub Main()
        Dim converter = New SynchronizedConverter(New PdfTools())
        Dim doc = New HtmlToPdfDocument() With {
            .GlobalSettings = New GlobalSettings() With {
                .ColorMode = ColorMode.Color,
                .Orientation = Orientation.Landscape,
                .PaperSize = PaperKind.A4,
                .Margins = New MarginSettings() With {
                    .Top = 10,
                    .Bottom = 10,
                    .Left = 15,
                    .Right = 15
                }
            },
            .Objects = {
                New ObjectSettings() With {
                    .HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
                    .WebSettings = New WebSettings() With {
                        .DefaultEncoding = "utf-8"
                    }
                }
            }
        }
        Dim pdf As Byte() = converter.Convert(doc)
        File.WriteAllBytes("custom.pdf", pdf)
    End Sub
End Module
$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");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Module Program
    Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 15
        renderer.RenderingOptions.MarginRight = 15

        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>")
        pdf.SaveAs("custom.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

DinkToPdf在MarginSettings物件。 IronPDF在渲染器上直接使用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)
byte[]pdf.SaveAs()

頁眉/頁腳佔位符語法

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

功能比較總結

功能DinkToPdfIronPDF
HTML到PDF是(過時的引擎)是(Chromium)
URL到PDF
自定義邊距
頁眉/頁腳是(有限)是(完整HTML)
CSS3無限支援是 全支援
Flexbox/Grid
JavaScript有限是 全支援
PDF操作
表單填充
數位簽名
加密
水印
合併/分割

當團隊考慮從DinkToPdf轉移到IronPDF

開發團隊因若干原因評估從DinkToPdf遷移到IronPDF:

安全合規要求:wkhtmltopdf中的CVE-2022-35583 SSRF漏洞為處理不可信HTML內容的應用程式帶來不可接受的風險。 安全審查指出了此漏洞,因無修補程式可用,團隊必須遷移以滿足合規要求。

執行緒安全問題:DinkToPdf在並發執行環境中即便使用SynchronizedConverter也會崩潰。 需要並行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引擎,無法支持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,並探索全面的文件以評估特定需求的適用性。

請注意DinkToPdf和wkhtmltopdf是其各自擁有者的註冊商標。) 本站與DinkToPdf或wkhtmltopdf並無關聯、未被其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}