跳至页脚内容
迁移指南

如何用 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 IDCVE-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" />
HTML

这使得攻击者可以访问 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 indefinitely
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF与 TuesPechkin:功能对比

了解架构差异有助于技术决策者评估迁移投资:

特征TuesPechkinIronPDF
许可免费(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
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 命名空间替换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
$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 转 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.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 使用嵌套在<代码>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.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将所有内容整合到<代码>渲染选项</代码中,并提供清晰、可发现的属性名称。

TuesPechkinAPI 到IronPDF映射参考

这种映射通过显示直接的 API 对应关系来加速迁移:

TuesPechkinIronPDF备注
<代码>标准转换器</代码<代码>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
$vbLabelText   $csharpLabel

问题 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 crashes
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 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
$vbLabelText   $csharpLabel

问题 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
$vbLabelText   $csharpLabel

第 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 needed
SHELL

TuesPechkin迁移清单

迁移前任务

审核您的代码库,确定所有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" .
SHELL

记录当前的<代码>全局设置</代码配置(纸张大小、方向、页边距)。 记录 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 文档教程

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。