如何用 C# 从 TuesPechkin 迁移到 IronPDF
从TuesPechkin迁移到 IronPdf:完整的 C# 开发人员指南。
TuesPechkin 是 wkhtmltopdf 库的线程安全封装程序,多年来一直帮助 .NET 开发人员将 HTML 转换为 PDF。 然而,wkhtmltopdf 的底层技术最后一次更新是在 2015 年,并于 2022 年 12 月正式废弃。这就造成了开发团队无法再忽视的关键安全性、稳定性和渲染限制。
本指南提供了从TuesPechkin到IronPDF的完整迁移路径,为评估这一过渡的专业 .NET 开发人员提供了分步说明、代码比较和实用示例。
为什么现在就从TuesPechkin迁移
对于具有安全意识的开发团队来说,从TuesPechkin迁移的决定不再是可有可无的。 wkhtmltopdf 库的底层存在严重的未修补漏洞,这些漏洞将永远无法修复。
关键安全漏洞:CVE-2022-35583.
| 属性 | 价值 |
|---|---|
| CVE ID | CVE-2022-35583 |
| 严重性 | CRITICAL (9.8/10) |
| 攻击向量 | 网络 |
| 状态 | 永不打补丁 |
| 受影响 | 所有TuesPechkin版本 |
wkhtmltopdf 维护者明确表示他们不会修复安全漏洞。 每个使用TuesPechkin的应用程序都会长期受到服务器端请求伪造 (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,TuesPechkin仍会在高负载情况下崩溃:
// ❌TuesPechkin- "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// ❌TuesPechkin- "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.comIronPDF与 TuesPechkin:功能对比
了解架构差异有助于技术决策者评估迁移投资:
| 特征 | TuesPechkin | IronPDF |
|---|---|---|
| 许可 | 免费(MIT 许可) | 商业翻译 |
| 线程安全 | 需要人工管理 | 本地支持 |
| 货币 | 有局限性,在负载情况下可能会崩溃 | 稳健,可处理高并发 |
| 开发 | 不活跃,最后更新时间为 2015 年 | 积极、持续的改进 |
| 易用性 | 复杂的设置 | 方便用户使用的指南 |
| 文档 | 基本的 | 包含大量示例 |
| 安全性 | ❌ 关键 CVE | ✅ 无已知漏洞 |
| HTML 到 PDF | ⚠️ 过时的 WebKit | ✅ 现代 Chromium |
| CSS3代码 | ❌ 部分 | ✅ 全面支持 |
| Flexbox/网格 | ❌ 不支持 | ✅ 全面支持 |
| JavaScript语言 | ⚠️ 不可靠 | ✅ 完全 ES6+ |
| PDF 操作 | ❌ 不可用 | ✅ 全文 |
| 数字签名 | ❌ 不可用 | ✅ 全文 |
| PDF/A合规性 | ❌ 不可用 | ✅ 全文 |
| 表格填写 | ❌ 不可用 | ✅ 全文 |
| 水印。 | ❌ 不可用 | ✅ 全文 |
| 合并/拆分 | ❌ 不可用 | ✅ 全文 |
快速入门:将IronPDF移植到 TuesPechkin.
迁移工作可以通过以下基本步骤立即开始。
步骤 1:替换 NuGet 软件包
删除所有TuesPechkin软件包:
# RemoveTuesPechkinand all related packages
dotnet remove package TuesPechkin
dotnet remove package TuesPechkin.Wkhtmltox.Win64
dotnet remove package TuesPechkin.Wkhtmltox.Win32# RemoveTuesPechkinand 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 命名空间替换TuesPechkin命名空间:
// 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 转 PDF 的高级应用场景,请参阅 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 使用嵌套在<代码>HtmlToPdfDocument</代码内的 ObjectSettings.PageUrl。IronPDF提供了一个专门的 RenderUrlAsPdf 方法,可以清晰地表达意图。
请浏览 URL to 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将所有内容整合到<代码>渲染选项</代码中,并提供清晰、可发现的属性名称。
TuesPechkinAPI 到IronPDF映射参考
这种映射通过显示直接的 API 对应关系来加速迁移:
| TuesPechkin | IronPDF | 备注 |
|---|---|---|
| <代码>标准转换器</代码 | <代码>ChromePdfRenderer</代码 | 没有复杂的初始化 |
| <代码>线程安全转换器</代码 | <代码>ChromePdfRenderer</代码 | 本地线程安全 |
| <代码>HtmlToPdfDocument</代码 | 方法参数 | 无需文档对象 |
| <代码>全局设置</代码 | <代码>渲染选项</代码 | 配置选项 |
| <代码>ObjectSettings.HtmlText</代码 | <代码>RenderHtmlAsPdf(html)</代码 | 直接渲染 |
| <代码>ObjectSettings.PageUrl</代码 | <代码>RenderUrlAsPdf(url)</代码 | URL 呈现 |
| <代码>GlobalSettings.PaperSize</代码 | <代码>RenderingOptions.PaperSize</代码 | 纸张大小 |
| <代码>GlobalSettings.Orientation</代码 | <代码>RenderingOptions.PaperOrientation</代码 | 定位 |
| <代码>边距设置</代码 | MarginTop, MarginBottom 等。 | 个别边距属性 |
| <代码>[页面]</代码>占位符 | {page} 占位符 | 页码语法 |
| <代码>[toPage]</代码>占位符 | {total-pages} 占位符 | 总页数语法 |
| <代码>远程工具集</代码 | 不需要 | 无部署管理 |
| <代码>Win64EmbeddedDeployment</代码 | 不需要 | 无平台二进制文件 |
| <代码>TempFolderDeployment</代码 | 不需要 | 无临时文件夹管理 |
常见迁移问题和解决方案
问题 1:复杂的初始化代码
问题:TuesPechkin需要复杂的转换器设置和部署工具集。
解决方案: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:线程安全崩溃
问题:TuesPechkin的<代码>线程安全转换器</代码在高负载情况下仍会因 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:页码占位符语法
问题:TuesPechkin使用 [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 和网格布局无法在TuesPechkin中使用。
解决方案:使用 IronPdf 适当的现代 CSS:
// 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 期:本地二进制管理
问题:TuesPechkin需要特定平台的 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 neededTuesPechkin迁移清单
迁移前任务
审核您的代码库,确定所有TuesPechkin的使用情况:
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)。 确定转换的页眉/页脚实现。 查找所有 wkhtmltopdf 二进制文件以进行删除。
代码更新任务
1.删除TuesPechkinNuGet 软件包 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的主要优势
从TuesPechkin迁移到 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 版本兼容。
扩展功能:TuesPechkin只能将 HTML 转换为 PDF。IronPDF增加了 PDF 操作、数字签名、PDF/A 合规性、表格填充、水印和合并/拆分操作。
结论
TuesPechkin 作为 wkhtmltopdf 的线程安全包装器,为 .NET 社区提供了良好的服务。 然而,由于底层技术自 2022 年 12 月起就被废弃了,而且关键的安全漏洞永远不会得到修补,继续使用会给生产应用程序带来不可接受的风险。
IronPdf 提供了一个现代、安全的替代方案,它具有更简单的 API、本地线程安全和可处理当代网络标准的 Chromium 渲染引擎。 迁移路径简单明了:替换 NuGet 软件包,取消本地二进制文件,简化转换器代码。
立即开始迁移,免费试用 IronPDF,消除基于 wkhtmltopdf 的解决方案固有的安全漏洞。
有关全面的实施指导,请浏览 IronPDF 文档和 教程。






