跳過到頁腳內容
遷移指南

如何用 C# 從 TuesPechkin 轉移到 IronPDF

Migrating from星期二to IronPdf:完整的 C# 開發人員指南。

TuesPechkin 是 wkhtmltopdf 函式庫的線程安全封裝程式,多年來一直協助 .NET 開發人員將 HTML 轉換為 PDF。 然而,wkhtmltopdf 的底層技術最後一次更新是在 2015 年,並於 2022 年 12 月正式廢棄。這造成了重要的安全性、穩定性和渲染限制,開發團隊再也不能忽視。

本指南提供了從星期二到IronPDF的完整轉換路徑,並提供分步說明、程式碼比較以及實用範例,可供評估此轉換的 .NET 專業開發人員使用。

為何立即從星期二遷移?

對於具有安全意識的開發團隊而言,從星期二轉移的決定不再是可有可无的。 底層的 wkhtmltopdf 函式庫存在永遠無法修復的嚴重未修補漏洞。

關鍵安全漏洞:CVE-2022-35583

屬性價值
CVE IDCVE-2022-35583
嚴重性CRITICAL (9.8/10)
攻擊向量網路
狀態永遠不會被修補
受影響所有星期二版本

wkhtmltopdf 維護者明確表示他們不會修復安全漏洞。 每個使用星期二的應用程式都會長期受到伺服器端請求偽造 (SSRF) 攻擊。

攻擊如何運作

在處理使用者提供的 HTML 時,攻擊者可以注入惡意內容:

<!-- Attacker submits this HTML to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-admin-panel:8080/api/users?export=all" />
<!-- Attacker submits this HTML to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-admin-panel:8080/api/users?export=all" />
HTML

這可讓攻擊者存取 AWS/Azure/GCP 元資料端點、竊取內部 API 資料、埠掃描內部網路,以及外洩敏感組態。

技術危機

TuesPechkin 包裝了 wkhtmltopdf,它使用 Qt WebKit 4.8 - 古老的 Chrome 前世紀技術。 這意味著

  • 不支援 Flexbox
  • 不支援 CSS 網格
  • 破碎的 JavaScript 執行
  • 不支援 ES6+

穩定危機

即使使用廣告中宣傳的線程安全轉換器,星期二仍會在高負載下當機:

// ❌星期二- "ThreadSafeConverter" still crashes
var converter = new TuesPechkin.ThreadSafeConverter(
    new TuesPechkin.RemotingToolset<PechkinBindings>());

// Under high load, you'll see:
// System.AccessViolationException: Attempted to read or write protected memory
// Process terminated unexpectedly
// Converter hangs indefinitely
// ❌星期二- "ThreadSafeConverter" still crashes
var converter = new TuesPechkin.ThreadSafeConverter(
    new TuesPechkin.RemotingToolset<PechkinBindings>());

// Under high load, you'll see:
// System.AccessViolationException: Attempted to read or write protected memory
// Process terminated unexpectedly
// Converter hangs indefinitely
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDFvs TuesPechkin:功能比較

了解架構上的差異有助於技術決策者評估遷移投資:

特點星期二IronPDF
執照免費 (MIT 授權)商業的
線程安全需要手動管理本地支援
貨幣功能有限,可能會在負載下當機穩健、可處理高並發性
開發未激活,最近更新日期為 2015 年積極、持續的改進
易用性複雜的設定使用指南方便使用者
說明文件基本的包含大量範例
安全性❌ 關鍵 CVE✅ 無已知漏洞
HTML至PDF⚠️ 過時的 WebKit✅ 現代 Chromium
CSS3❌ 部分✅ 全面支援
Flexbox/網格❌ 不支援✅ 全面支援
JavaScript⚠️ 不可靠✅ 完全 ES6+
PDF 操作❌ 不可用✅ 全文
數位簽名❌ 不可用✅ 全文
PDF/A合規性❌ 不可用✅ 全文
表格填寫❌ 不可用✅ 全文
水印❌ 不可用✅ 全文
合併/分割❌ 不可用✅ 全文

快速入門:從 IronPdf 遷移到 I TuesPechkin。

只要完成這些基本步驟,就可以立即開始遷移。

步驟 1:取代 NuGet 套件

移除所有星期二套件:

# Remove星期二and all related packages
dotnet remove package TuesPechkin
dotnet remove package TuesPechkin.Wkhtmltox.Win64
dotnet remove package TuesPechkin.Wkhtmltox.Win32
# Remove星期二and all related packages
dotnet remove package TuesPechkin
dotnet remove package TuesPechkin.Wkhtmltox.Win64
dotnet remove package TuesPechkin.Wkhtmltox.Win32
SHELL

安裝 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

步驟 2:移除原生二進位檔案

從您的專案中刪除這些檔案和資料夾:

  • <編碼>wkhtmltox.dll</編碼
  • <編碼>wkhtmltopdf.exe</編碼
  • 任何 wkhtmlto* 檔案
  • TuesPechkin.Wkhtmltox資料夾

步驟 3:更新命名空間

用 IronPdf 命名空間取代星期二命名空間:

// Before (TuesPechkin)
using TuesPechkin;
using TuesPechkin.Wkhtmltox.Win64;

// After (IronPDF)
using IronPdf;
// Before (TuesPechkin)
using TuesPechkin;
using TuesPechkin.Wkhtmltox.Win64;

// After (IronPDF)
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

步驟 4:初始化授權

在應用程式啟動時加入授權初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

程式碼遷移範例

將 HTML 轉換為 PDF

最常見的使用案例展示了這些 .NET PDF 函式庫的複雜性差異。

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);
    }
}
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();

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

TuesPechkin 版本需要建立一個具有複雜初始化鏈的標準轉換器RemotingToolset, Win64EmbeddedDeployment, 和 TempFolderDeployment. 您也必須手動將位元組寫入檔案。

IronPdf 完全消除了這一儀式。 建立一個 ChromePdfRenderer, 渲染 HTML, 並儲存。 程式碼是自我說明的,不需要瞭解部署工具集或特定平台的二進位管理。

如需進階的 HTML 至IronPDF情境,請參閱 HTML 至 PDF 轉換指南

將 URL 轉換為 PDF

URL 到 PDF 的轉換也顯示出類似的複雜性差異。

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())));

        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);
    }
}
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

TuesPechkin 使用ObjectSettings.PageUrl 物件設定。嵌套在<編碼>HtmlToPdfDocument</編碼內。IronPDF提供了一個專用的 RenderUrlAsPdf 方法,可以清楚地表達出意圖。

探索URL至PDF文件的認證和自訂標頭選項。

自訂渲染設定

頁面方向、紙張大小和頁邊需要不同的配置方法。

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>Custom PDF</h1></body></html>";

        var document = new HtmlToPdfDocument
        {
            GlobalSettings = {
               導向= 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 = {
               導向= 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);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF 方法:

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

TuesPechkin 將設定分為適用於整個文件選項的全局設定和適用於內容的 ObjectSettings 兩種。IronPDF將所有內容整合到渲染選項中,並提供清楚、可被發現的屬性名稱。

星期二API 到IronPDF的映射參考。

此對應可透過顯示直接的 API 對應關係來加速遷移:

星期二IronPDF筆記
標準轉換器<代碼>ChromePdfRenderer</代碼沒有複雜的初始化
線程安全轉換器<代碼>ChromePdfRenderer</代碼原生線程安全
<編碼>HtmlToPdfDocument</編碼方法參數不需要文件物件
全局設定渲染選項組態選項
<編碼>ObjectSettings.HtmlText</編碼RenderHtmlAsPdf(html)直接渲染
ObjectSettings.PageUrl 物件設定。<代碼>RenderUrlAsPdf(url)</代碼URL 呈現
GlobalSettings.PaperSizeRenderingOptions.PaperSize紙張大小
GlobalSettings.Orientation<編碼>RenderingOptions.PaperOrientation</編碼導向
邊界設定MarginTop, MarginBottom 等。個別邊界屬性
[page]占位符{page} 占位符頁碼語法
[toPage]占位符{total-pages} 占位符總頁數 語法
<編碼>RemotingToolset</編碼不需要無部署管理
<編碼>Win64EmbeddedDeployment</編碼不需要無平台二進位
TempFolderDeployment不需要無暫存資料夾管理

常見的遷移問題與解決方案

問題 1:複雜的初始化程式碼

問題:星期二需要使用部署工具集進行複雜的轉換器設定。

解決方案: IronPdf 很簡單:

// Before (TuesPechkin)
var converter = new StandardConverter(
    new RemotingToolset<PdfToolset>(
        new Win64EmbeddedDeployment(
            new TempFolderDeployment())));

// After (IronPDF)
var renderer = new ChromePdfRenderer();
// That's it!
// Before (TuesPechkin)
var converter = new StandardConverter(
    new RemotingToolset<PdfToolset>(
        new Win64EmbeddedDeployment(
            new TempFolderDeployment())));

// After (IronPDF)
var renderer = new ChromePdfRenderer();
// That's it!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 2:線程安全崩潰

問題:星期二的線程安全轉換器在高負載下仍會因 AccessViolationException 而當機。

解決方案:IronPDF具有原生線程安全功能 - 無需特殊設定:

//IronPDFis inherently thread-safe
var renderer = new ChromePdfRenderer();
// Use from any thread without crashes
//IronPDFis inherently thread-safe
var renderer = new ChromePdfRenderer();
// Use from any thread without crashes
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 3:頁碼占位符語法

問題:星期二使用 [page][toPage] 占位符。

解決方案:更新IronPDF的占位符語法:

// Before (TuesPechkin)
"Page [page] of [toPage]"

// After (IronPDF)
"Page {page} of {total-pages}"
// Before (TuesPechkin)
"Page [page] of [toPage]"

// After (IronPDF)
"Page {page} of {total-pages}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 4:CSS 佈局破損

問題:因為 wkhtmltopdf 使用 Qt WebKit 4.8,所以 Flexbox 和 Grid 佈局在星期二中無法運作。

解決方案:使用適當的現代 CSS 與 IronPDF:

// Remove table-based workarounds, use modern CSS
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// Works correctly with Chromium!
// Remove table-based workarounds, use modern CSS
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// Works correctly with Chromium!
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 5 期:原生二進位管理

問題:星期二需要特定平台的 wkhtmltopdf 二進位檔和路徑設定。

解決方案:IronPDF透過 NuGet 處理所有的相依性 - 無需管理原生二進位檔:

# Just install the package
dotnet add package IronPdf
# No wkhtmltopdf binaries needed
# Just install the package
dotnet add package IronPdf
# No wkhtmltopdf binaries needed
SHELL

星期二移轉清單

遷移前的任務

審核您的程式碼庫,找出所有星期二的用法:

grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .
grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .
SHELL

記錄目前的全局設定設定 (紙張大小、方向、頁邊距)。 文件 ObjectSettings 配置(HTML 內容、URL)。 確定轉換的 header/footer 實作。 找出所有 wkhtmltopdf 二進位檔以便移除。

程式碼更新任務

1.移除星期二NuGet 套件 2.移除原生 wkhtmltopdf 二進位檔 3.安裝 IronPdf NuGet 套件 4.更新使用語句從 TuesPechkinIronPdf 5.在啟動時加入授權金鑰初始化 6.以<代碼>ChromePdfRenderer</代碼取代轉換器 7.將全局設定轉換為 RenderingOptions 8.將 ObjectSettings 轉換為方法參數 9.更新頁邊配置至個別屬性 10.更新頁首/頁尾語法為基於 HTML 的 HtmlHeaderFooter 11.修正頁面佔位符語法 ([page]{page}) 12.移除所有部署/工具集程式碼

後遷移測試

轉移後,驗證這些方面:

  • 執行所有單元測試
  • 測試線程安全情境 (IronPDF 可處理多執行緒而不會當機)
  • 比較 PDF 輸出品質 (Chromium 的渲染更精確)
  • 驗證 CSS 呈現 (Flexbox 和 Grid 現在可以運作)
  • 測試 JavaScript 執行 (現在支援 ES6+)
  • 測試頁首/頁尾的呈現
  • 效能測試批次作業
  • 安全掃描以確認沒有 wkhtmltopdf 的二進位檔存在

遷移到IronPDF的主要優點。

從星期二轉移到IronPDF提供了幾個關鍵優勢:

安全性:消除了CVE-2022-35583和其他 wkhtmltopdf 漏洞。IronPDF的 Chromium 引擎會定期接受安全更新。

原生線程安全:不再需要複雜的線程安全轉換器設定。 不再有 AccessViolationException 在負載下當機的情況。 IronPdf 自動處理並發。

現代化的渲染引擎:完整的 CSS3、Flexbox、Grid 與 ES6+ JavaScript 支援。 您的 PDF 將完全呈現在現代瀏覽器中的內容。

簡化部署:無需管理特定平台的二進位檔案。 沒有 RemotingToolset, Win64EmbeddedDeployment, 或TempFolderDeployment的儀式。 只需安裝 NuGet 套件即可。

主動開發:隨著 .NET 10 和 C# 14 的採用增加至 2026 年,IronPDF 的定期更新可確保與目前和未來的 .NET 版本相容。

延伸功能:星期二只能將 HTML 轉換為 PDF。IronPDF增加了 PDF 操作、數位簽署、PDF/A 合規性、表格填寫、水印以及合併/分割操作。

結論

TuesPechkin 作為 wkhtmltopdf 的線程安全包裝程式,為 .NET 社群提供了良好的服務。 然而,由於底層技術自 2022 年 12 月起已被棄用,且重要的安全漏洞永遠無法修補,繼續使用會為生產應用程式帶來無法接受的風險。

IronPdf 提供了一個現代化、安全的替代方案,具有更簡單的 API、原生線程安全以及可處理當代網路標準的 Chromium 渲染引擎。 遷移路徑很直接:取代 NuGet 套件、消除原生二進位檔,並簡化您的轉換器程式碼。

立即使用 免費試用 IronPDF 開始您的遷移,並消除基於 wkhtmltopdf 解決方案的固有安全漏洞。

如需全面的實施指導,請探索 IronPDF 文件教學

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。