如何用 C# 從 TuesPechkin 轉移到 IronPDF
Migrating from星期二to IronPdf:完整的 C# 開發人員指南。
TuesPechkin 是 wkhtmltopdf 函式庫的線程安全封裝程式,多年來一直協助 .NET 開發人員將 HTML 轉換為 PDF。 然而,wkhtmltopdf 的底層技術最後一次更新是在 2015 年,並於 2022 年 12 月正式廢棄。這造成了重要的安全性、穩定性和渲染限制,開發團隊再也不能忽視。
本指南提供了從星期二到IronPDF的完整轉換路徑,並提供分步說明、程式碼比較以及實用範例,可供評估此轉換的 .NET 專業開發人員使用。
為何立即從星期二遷移?
對於具有安全意識的開發團隊而言,從星期二轉移的決定不再是可有可无的。 底層的 wkhtmltopdf 函式庫存在永遠無法修復的嚴重未修補漏洞。
關鍵安全漏洞:CVE-2022-35583
| 屬性 | 價值 |
|---|---|
| CVE ID | CVE-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" />這可讓攻擊者存取 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 indefinitelyIRON VB CONVERTER ERROR developers@ironsoftware.comIronPDFvs 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安裝 IronPDF:
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdf步驟 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步驟 4:初始化授權
在應用程式啟動時加入授權初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"程式碼遷移範例
將 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.comIronPDF 方法:
// 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.comTuesPechkin 版本需要建立一個具有複雜初始化鏈的標準轉換器: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.comIronPDF 方法:
// 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.comTuesPechkin 使用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.comIronPDF 方法:
// 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.comTuesPechkin 將設定分為適用於整個文件選項的全局設定和適用於內容的 ObjectSettings 兩種。IronPDF將所有內容整合到渲染選項中,並提供清楚、可被發現的屬性名稱。
星期二API 到IronPDF的映射參考。
此對應可透過顯示直接的 API 對應關係來加速遷移:
| 星期二 | IronPDF | 筆記 |
|---|---|---|
標準轉換器 | <代碼>ChromePdfRenderer</代碼 | 沒有複雜的初始化 |
線程安全轉換器 | <代碼>ChromePdfRenderer</代碼 | 原生線程安全 |
| <編碼>HtmlToPdfDocument</編碼 | 方法參數 | 不需要文件物件 |
全局設定 | 渲染選項 | 組態選項 |
| <編碼>ObjectSettings.HtmlText</編碼 | RenderHtmlAsPdf(html) | 直接渲染 |
ObjectSettings.PageUrl 物件設定。 | <代碼>RenderUrlAsPdf(url)</代碼 | URL 呈現 |
GlobalSettings.PaperSize | RenderingOptions.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問題 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 crashesIRON VB CONVERTER ERROR developers@ironsoftware.com問題 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問題 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第 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星期二移轉清單
遷移前的任務
審核您的程式碼庫,找出所有星期二的用法:
grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .grep -r "using TuesPechkin" --include="*.cs" .
grep -r "ThreadSafeConverter\|RemotingToolset" --include="*.cs" .記錄目前的全局設定設定 (紙張大小、方向、頁邊距)。 文件 ObjectSettings 配置(HTML 內容、URL)。 確定轉換的 header/footer 實作。 找出所有 wkhtmltopdf 二進位檔以便移除。
程式碼更新任務
1.移除星期二NuGet 套件 2.移除原生 wkhtmltopdf 二進位檔 3.安裝 IronPdf NuGet 套件 4.更新使用語句從 TuesPechkin 到 IronPdf 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 文件和 教學。






