比較

TuesPechkin vs IronPDF:技術比較指南

當.NET開發人員需要將 HTML 轉換為 PDF 時,一些圍繞傳統渲染引擎構建的包裝庫便成為可行的選擇。 週二佩奇金 就是這樣一種解決方案,它封裝了 wkhtmltopdf 庫,提供了 PDF 生成功能。 本次技術比較將 週二佩奇金 與IronPDF進行比較,以幫助架構師和開發人員了解傳統封裝庫和現代 PDF 庫之間的權衡。

理解圖斯·佩奇金

TuesPechkin 是 wkhtmltopdf 庫的一個線程安全封裝,旨在幫助開發人員從 HTML 內容生成 PDF 文件。 該庫試圖透過提供 ThreadSafeConverter 實作來解決 wkhtmltopdf 固有的並發挑戰。

然而,TuesPechkin 從其底層技術中繼承了一些根本性的限制:

-已棄用的基金會: 週二佩奇金 為 wkhtmltopdf 提供轉載服務,該計畫上次更新於 2015 年,並​​於 2022 年 12 月正式棄用。 -渲染引擎過時:使用 Qt WebKit 4.8,這是 Chrome 時代之前的渲染引擎。 -複雜的執行緒管理:需要開發人員透過 RemotingToolset 和部署模式手動設定執行緒安全 -負載穩定性:即使配置了執行緒安全,該程式庫在高並發情況下仍可能崩潰(錯誤代碼:3303)或進程掛起。

  • CSS 支援有限:不支援 Flexbox 或 CSS Grid 等現代 CSS 特性。
  • JavaScript 的限制: JavaScript執行不穩定,不支援 ES6+。

安全考量

TuesPechkin 繼承了 wkhtmltopdf 的所有安全漏洞。 CVE-2022-35583,評級為嚴重(9.8/10),代表伺服器端請求偽造漏洞,影響所有 週二佩奇金 版本。 由於 wkhtmltopdf 已被棄用,此漏洞將永遠不會得到修補,這意味著使用 週二佩奇金 的應用程式將永久暴露於風險之中。

了解IronPDF

IronPDF採用了一種截然不同的方法,它提供了一個現代化的商業 PDF 庫,具有原生線程安全性和基於 Chromium 的渲染引擎。 IronPDF 並非封裝傳統工具,而是將 PDF 生成作為其核心功能。

IronPDF的主要特點包括:

-現代 Chromium 引擎:支援 HTML5、CSS3、Flexbox、CSS Grid 和 ES6+ JavaScript -原生執行緒安全:無需手動執行緒管理-並發操作自動執行 -積極開發:每週更新和持續改進 -全面的 PDF 功能:除了產生 PDF 之外,還包括編輯、數位簽章、PDF/A 合規性和表單填寫。 -整合簡單:無需原生二進位部署,即可透過NuGet直接安裝

功能對比

下表突顯了TuesPechkin和IronPDF之間的技術差異:

特徵週二佩奇金IronPDF
執照免費(MIT許可證)商業的
螺紋安全需要人工管理原生支援
並發性功能有限,負載過高時可能會崩潰健壯,可處理高並發
發展狀況已失效,上次更新時間為 2015 年積極、持續的改進
易用性複雜的設定使用者友好,附帶指南
文件基本的包含大量範例
渲染引擎Qt WebKit 4.8(已過時)現代鉻
CSS3 支持部分的支援
Flexbox/Grid不支援支援
JavaScript不可靠完整的 ES6+
PDF 處理無法使用支援
數位簽名無法使用支援
PDF/A 合規性無法使用支援
表格填寫無法使用支援
水印無法使用支援
合併/拆分無法使用支援
頁首/頁尾僅限基本文本完全支援 HTML
安全補丁從未(被遺棄)定期更新

API架構差異

透過檢查初始化模式和基本用法,可以立即看出 週二佩奇金 和IronPDF之間的架構差異。

星期二Pechkin初始化複雜度

TuesPechkin 需要複雜的初始化流程,涉及轉換器、工具集和部署配置:

// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        string html = "<html><body><h1>Hello World</h1></body></html>";
        byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
        {
            Objects = { new ObjectSettings { HtmlText = html } }
        });

        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        string html = "<html><body><h1>Hello World</h1></body></html>";
        byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
        {
            Objects = { new ObjectSettings { HtmlText = html } }
        });

        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

此模式需要理解多個嵌套類別:Win64EmbeddedDeploymentTempFolderDeployment。 部署配置也必須與目標平台架構(x86/x64)相符。

IronPDF簡化方法

IronPDF透過簡單易用的 API 完全消除了部署的複雜性:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

ChromePdfRenderer類別無需特定於平台的配置即可立即產生 PDF 檔案。 有關 HTML 轉換的全面指南,請參閱HTML 轉 PDF 教學

URL 轉 PDF

將網頁轉換為 PDF 文件可以反映這兩個庫在 API 可用性方面的差異。

週二Pechkin實施

TuesPechkin 使用 PageUrl 屬性(位於 ObjectSettings 中)來指定 URL:

// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
        {
            Objects = {
                new ObjectSettings {
                    PageUrl = "https://www.example.com"
                }
            }
        });

        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        byte[] pdfBytes = converter.Convert(new HtmlToPdfDocument
        {
            Objects = {
                new ObjectSettings {
                    PageUrl = "https://www.example.com"
                }
            }
        });

        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

同樣存在初始化複雜性,而且由於缺少 CSS3 和JavaScript支持,過時的 WebKit 引擎可能無法正確渲染現代網站。

IronPDF實現

IronPDF為其現代化的 Chromium 引擎提供了一種專門的 URL 渲染方法:

// 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

RenderUrlAsPdf 方法在無頭 Chromium 瀏覽器中載入頁面,執行JavaScript並準確地套用所有現代 CSS 樣式。 對於使用 React、Angular 或 Vue.js 等框架建立的 Web 應用程式而言,這一點至關重要,因為 週二佩奇金 無法正確渲染這些應用程式。

自訂渲染設定

配置頁面尺寸、邊距和方向,可以發現不同的文件設定方法。

週二佩奇金配置

TuesPechkin 使用 GlobalSettingsObjectSettings 類,並附有巢狀配置:

// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        string html = "<html><body><h1>Custom PDF</h1></body></html>";

        var document = new HtmlToPdfDocument
        {
            GlobalSettings = {
                Orientation = GlobalSettings.PdfOrientation.Landscape,
                PaperSize = GlobalSettings.PdfPaperSize.A4,
                Margins = new MarginSettings { Unit = Unit.Millimeters, Top = 10, Bottom = 10 }
            },
            Objects = {
                new ObjectSettings { HtmlText = html }
            }
        };

        byte[] pdfBytes = converter.Convert(document);
        File.WriteAllBytes("custom.pdf", pdfBytes);
    }
}
// NuGet: Install-Package TuesPechkin
using TuesPechkin;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new StandardConverter(
            new RemotingToolset<PdfToolset>(
                new Win64EmbeddedDeployment(
                    new TempFolderDeployment())));

        string html = "<html><body><h1>Custom PDF</h1></body></html>";

        var document = new HtmlToPdfDocument
        {
            GlobalSettings = {
                Orientation = GlobalSettings.PdfOrientation.Landscape,
                PaperSize = GlobalSettings.PdfPaperSize.A4,
                Margins = new MarginSettings { Unit = Unit.Millimeters, Top = 10, Bottom = 10 }
            },
            Objects = {
                new ObjectSettings { HtmlText = html }
            }
        };

        byte[] pdfBytes = converter.Convert(document);
        File.WriteAllBytes("custom.pdf", pdfBytes);
    }
}
$vbLabelText   $csharpLabel

IronPDF配置

IronPDF將設定集中在 RenderingOptions 屬性中,並使用直覺的屬性名稱:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;

        string html = "<html><body><h1>Custom PDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;

        string html = "<html><body><h1>Custom PDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("custom.pdf");
    }
}
$vbLabelText   $csharpLabel

RenderingOptions 類別提供了一種統一的配置方法,其中邊距值直接以毫米為單位指定,無需包裝物件。

線程安全和並發性

線程安全性是伺服器端 PDF 產生的關鍵考慮因素,而這兩個庫採用了截然不同的方法。

週二佩奇金線程管理

TuesPechkin 透過其 ThreadSafeConverter 宣稱其操作是線程安全的,但其實現存在一些已知的局限性:

// 週二佩奇金 - Even with ThreadSafeConverter, crashes under load
var converter = new TuesPechkin.ThreadSafeConverter(
    new TuesPechkin.RemotingToolset<PechkinBindings>());

// Under high load, applications may experience:
// - System.AccessViolationException
// - StackOverflowException
// - Process hangs indefinitely
// - Memory corruption
// 週二佩奇金 - Even with ThreadSafeConverter, crashes under load
var converter = new TuesPechkin.ThreadSafeConverter(
    new TuesPechkin.RemotingToolset<PechkinBindings>());

// Under high load, applications may experience:
// - System.AccessViolationException
// - StackOverflowException
// - Process hangs indefinitely
// - Memory corruption
$vbLabelText   $csharpLabel

底層 wkhtmltopdf 函式庫並非為高並發場景而設計,即使採用封裝級執行緒管理,在高負載下仍存在穩定性問題。

IronPDF原生並發

IronPDF提供原生執行緒安全功能,無需任何設定:

// IronPDF - Native thread safety
var renderer = new ChromePdfRenderer();

// Safe for concurrent use across multiple threads
// No AccessViolationException
// No process hangs
// Stable under high load
// IronPDF - Native thread safety
var renderer = new ChromePdfRenderer();

// Safe for concurrent use across multiple threads
// No AccessViolationException
// No process hangs
// Stable under high load
$vbLabelText   $csharpLabel

ChromePdfRenderer在內部處理並發,使開發人員能夠專注於應用程式邏輯而不是線程同步。

現代 CSS 和JavaScript支持

使用現代網路技術時,TuesPechkin 和IronPDF的渲染引擎差異最為明顯。

週二佩奇金渲染限制

TuesPechkin 的 Qt WebKit 4.8 引擎早於現代 CSS 佈局系統:


<div style="display: flex; justify-content: space-between; gap: 20px;">
    <div style="flex: 1;">Column 1</div>
    <div style="flex: 1;">Column 2</div>
</div>

<div style="display: grid; grid-template-columns: repeat(3, 1fr);">
    <div>Grid Item 1</div>
    <div>Grid Item 2</div>
    <div>Grid Item 3</div>
</div>

<div style="display: flex; justify-content: space-between; gap: 20px;">
    <div style="flex: 1;">Column 1</div>
    <div style="flex: 1;">Column 2</div>
</div>

<div style="display: grid; grid-template-columns: repeat(3, 1fr);">
    <div>Grid Item 1</div>
    <div>Grid Item 2</div>
    <div>Grid Item 3</div>
</div>
HTML

使用 週二佩奇金 的應用程式必須依賴基於表格的佈局或其他 CSS2.1 變通方法來實現多列設計。

IronPDF現代渲染

IronPDF 的 Chromium 引擎支援所有現代 CSS 和JavaScript:

// Modern CSS works correctly with IronPDF
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Renders correctly with full Flexbox support
// Modern CSS works correctly with IronPDF
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Renders correctly with full Flexbox support
$vbLabelText   $csharpLabel

這樣一來,開發人員就可以使用相同的 HTML/CSS 進行網頁顯示和 PDF 生成,而無需維護單獨的模板。

當球隊考慮TuesPechkin的替代方案時

以下幾種情況通常會促使開發團隊評估 週二佩奇金 的替代方案:

安全要求

由於 CVE-2022-35583 被評為嚴重 (9.8/10),且底層 wkhtmltopdf 庫已被正式棄用,因此有安全合規性要求的組織無法繼續使用 TuesPechkin。 SSRF 漏洞允許攻擊者存取內部網路、竊取憑證,並透過惡意 HTML 內容外洩資料。

現代網路科技應用

採用現代前端框架(React、Angular、Vue.js)或 CSS 佈局系統(Flexbox、Grid)的團隊發現,TuesPechkin 無法精確渲染其內容。 過時的 WebKit 4.8 引擎缺乏對近十年來已成為標準的技術的支撐。

負載下的穩定性

伺服器端應用程式在並發 PDF 產生負載下出現崩潰、掛起或 AccessViolationException 錯誤時,這些問題通常可以追溯到 週二佩奇金 的執行緒限制。 即使採用 ThreadSafeConverter 配置,底層 wkhtmltopdf 庫也不是為高並發環境設計的。

PDF 功能要求

TuesPechkin 僅提供 HTML 轉 PDF 功能。 需要進行 PDF 操作(合併、分割)、數位簽章、PDF/A 合規性、表單填寫或浮水印的團隊必須新增額外的庫,或考慮使用IronPDF等原生提供這些功能的替代方案。

簡化部署

使用 Win64EmbeddedDeploymentTempFolderDeployment 的 週二佩奇金 初始化模式增加了部署的複雜性。 必須針對每個目標環境正確配置平台特定的原生二進位。 IronPDF透過標準的NuGet安裝方式消除了這種複雜性。

API對應參考

評估從 週二佩奇金 過渡到IronPDF 的團隊會發現此映射有助於理解概念等效性:

週二佩奇金IronPDF
StandardConverter / ThreadSafeConverterChromePdfRenderer
HtmlToPdfDocument方法參數
GlobalSettings.PaperSizeRenderingOptions.PaperSize
GlobalSettings.OrientationRenderingOptions.PaperOrientation
GlobalSettings.MarginsRenderingOptions.MarginTop/Bottom/Left/Right
ObjectSettings.HtmlTextRenderHtmlAsPdf(html)
ObjectSettings.PageUrlRenderUrlAsPdf(url)
RemotingToolset + Deployment不需要
[page]佔位符{page}佔位符
[toPage]佔位符{total-pages}佔位符

附加 PDF 功能

除了HTML轉PDF功能外, IronPDF也提供TuesPechkin無法提供的文件操作功能:

-合併 PDF將多個文件合併成單一文件 -拆分文檔將頁面範圍提取到單獨的 PDF 文件中 -數位簽章套用加密簽章來驗證文件的真實性 -浮水印透過 HTML/CSS 新增文字或圖像浮水印

.NET相容性和未來適應性

TuesPechkin 的開發已停止,這意味著它不會更新到較新的.NET版本。 IronPDF持續進行積極開發和定期更新,確保與.NET 8、 .NET 9 以及包括預計於 2026 年推出的.NET 10 在內的未來版本相容。該程式庫在其 API 中全面支援 async/await,符合現代 C# 開發實踐,包括 C# 13 中的功能以及預期的 C# 14 功能。

結論

TuesPechkin 和IronPDF代表了.NET PDF 生成技術的不同時代。 週二佩奇金 提供了一個免費的、MIT 許可的 wkhtmltopdf 封裝器,但它繼承了嚴重的安全漏洞、過時的渲染引擎、複雜的線程管理要求以及負載下的穩定性問題。 底層技術已於 2022 年停止維護,且不會發布任何安全性修補程式。

IronPDF提供了一個現代化的、積極維護的替代方案,它採用基於 Chromium 的渲染引擎,支援目前的 Web 技術。 它原生的線程安全性、全面的 PDF 功能和直接的 API 設計解決了 wkhtmltopdf 包裝器的固有限制。

對於目前使用 週二佩奇金 的團隊來說,遷移的決定通常源自於安全性要求、渲染品質需求、穩定性問題,或對基本 HTML 轉換以外的 PDF 功能的需求。 這兩個函式庫之間的 API 映射非常簡單, IronPDF由於其簡化的初始化和配置模式,通常需要的程式碼更少。

如需更多實施指導,請查閱IronPDF文件教程,其中涵蓋具體用例和高級功能。