跳至页脚内容
迁移指南

如何用 C# 从 wkhtmltopdf 迁移到 IronPDF

从wkhtmltopdf迁移到 IronPDF:完整的 C# 开发人员指南。

wkhtmltopdf 一直是使用 Qt WebKit 将 HTML 文档转换为 PDF 的广泛工具。 尽管该项目因其命令行功能和免费许可而深受开发人员的欢迎,但它现在存在的严重安全风险已不容忽视。 该库已于 2016-2017 年正式废弃,一个 CRITICAL 严重性漏洞(CVE-2022-35583)仍永久未打补丁。

本指南提供了从wkhtmltopdf到IronPDF的完整迁移路径,为需要从应用程序中消除这种安全风险的专业 .NET 开发人员提供了分步指导、代码比较和实用示例。

关键安全警告:CVE-2022-35583。

wkhtmltopdf 包含一个永远无法修复的重要安全漏洞:

问题严重性现状
CVE-2022-35583关键 (9.8/10)UNPATCHED 未完成
SSRF 漏洞基础设施接管风险UNPATCHED 未完成
最近更新2016-2017已放弃
WebKit 版本2015 年(Qt WebKit)已关闭
CSS 网格支持破译
Flexbox 支持部分翻译破译
ES6+JavaScript破译

SSRF 攻击如何工作

服务器端请求伪造漏洞允许攻击者访问内部服务、窃取凭证、扫描您的内部网络并通过伪造的 HTML 外泄敏感数据:

<!-- Malicious HTML submitted to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
<!-- Malicious HTML submitted to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
HTML

当wkhtmltopdf渲染 HTML 时,它会绕过防火墙和安全控制,从服务器的网络上下文中获取这些 URL。

受影响的封装库

wkhtmltopdf 的所有 .NET 封装程序都会继承这些漏洞:

封装库现状安全风险
DinkToPdf放弃⚠️ CRITICAL
Rotativa放弃⚠️ CRITICAL
TuesPechkin放弃⚠️ CRITICAL
WkHtmlToPdf-DotNet放弃⚠️ CRITICAL
NReco.PdfGenerator使用 wkhtmltopdf⚠️ CRITICAL

如果您使用这些库中的任何一个,您就有可能受到 CVE-2022-35583 的攻击。

IronPDF与 wkhtmltopdf:功能对比

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

特征wkhtmltopdfIronPDF
许可LGPLv3 (免费)商业翻译
渲染引擎Qt WebKit (2015)当前的 Chromium 引擎
安全漏洞CVE-2022-35583,主要未修补问题无已知 CVE
主动维护已放弃,自 2017 年以来未进行有意义的更新定期发布,积极维护
支持现代网络标准有限(flexbox 已损坏,无 CSS 网格)全面支持
集成与支持仅限于社区论坛广泛的文档和专门的支持
CSS 网格❌ 不支持✅ 全面支持
Flexbox⚠️ Broken✅ 全面支持
ES6+JavaScript❌ 不支持✅ 全面支持
同步/等待❌ 不支持✅ 全面支持
PDF 操作❌ 不支持✅ 全面支持
数字签名❌ 不支持✅ 全面支持
PDF/A合规性❌ 不支持✅ 全面支持

快速入门:wkhtmltopdf 到IronPDF的迁移

迁移工作可以通过以下基本步骤立即开始。

步骤 1:删除wkhtmltopdf软件包和二进制文件

删除所有wkhtmltopdf封装包:

# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
SHELL

步骤2:安装IronPDF

# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
SHELL

步骤 3:更新命名空间

用 IronPdf 命名空间替换wkhtmltopdf命名空间:

// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;

// 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 方法之间的复杂性差异。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
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.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf 要求使用 PdfTools 创建一个<代码>同步转换器</代码,使用 GlobalSettingsObjects 构建一个<代码>HtmlToPdfDocument</代码,设置诸如 ColorMode, OrientationPaperSize 等属性,调用 converter.Convert() 来转换 PDF 文件。Convert()以获取原始字节,并使用 File.WriteAllBytes() 手动写入文件。

IronPDF 完全消除了这一仪式--创建一个 ChromePdfRenderer, 调用 RenderHtmlAsPdf(), 并使用内置的 SaveAs() 方法。

有关 HTML 转 PDF 的高级应用场景,请参阅 HTML 转 PDF 指南

将 URL 转换为 PDF

URL 到 PDF 的转换显示出类似的复杂性模式。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
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

wkhtmltopdf 使用 ObjectSettings 中的 Page 属性指定 URL,需要相同的文档构建模式。IronPDF提供了专门的 RenderUrlAsPdf() 方法,可以清晰地表达意图。

请浏览 URL to PDF 文档,了解身份验证和自定义页眉选项。

自定义设置:带有页面配置的 HTML 文件

配置方向、页边距和纸张大小需要采用不同的方法。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               定位= Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 方法:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf 将设置嵌套在 GlobalSettingsObjects 中,其中 MarginSettings 是一个单独的对象。IronPDF提供直接的<代码>渲染选项</代码属性,其名称清晰明了,如 PaperOrientation, MarginTopPaperSize.

wkhtmltopdfAPI 到IronPDF映射参考

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

CLI 到 IronPdf 的映射

wkhtmltopdf CLI 选项IronPdf 同等产品备注
<代码>wkhtmltopdf input.html output.pdf</ 代码<代码>renderer.RenderHtmlFileAsPdf()</代码文件到 PDF
<代码>wkhtmltopdf URL output.pdf</ 代码<代码>renderer.RenderUrlAsPdf()</代码URL 至 PDF
<代码>--页面大小 A4</代码<代码>RenderingOptions.PaperSize = PdfPaperSize.A4</ 代码纸张大小
<代码>--页面大小 Letter<代码>RenderingOptions.PaperSize = PdfPaperSize.Letter</ 代码美国信函
<代码>--面向景观</代码<代码>RenderingOptions.PaperOrientation = Landscape</代码定位
--margin-top 10mm</ 代码<代码>RenderingOptions.MarginTop = 10</ 代码边距(毫米
--margin-bottom 10mm<代码>RenderingOptions.MarginBottom = 10</ 代码
<代码>--边距左 10 毫米</代码<代码>RenderingOptions.MarginLeft = 10</ 代码
<代码>--右边距 10 毫米</代码<代码>RenderingOptions.MarginRight = 10</ 代码
<代码>--header-html header.html</ 代码<代码>RenderingOptions.HtmlHeader</代码HTML 标题
--footer-center "[page]"{page} 占位符页码
<代码>--footer-center"[toPage]"</代码{total-pages} 占位符总页数
<代码>--enable-javascript</代码默认已启用JavaScript
<代码>--javascript--延迟 500</代码<代码>RenderingOptions.WaitFor.RenderDelay = 500</代码JS 延误
<代码>--dpi 300</代码<代码>RenderingOptions.Dpi=300</代码DPI 设置
<代码>--grayscale</代码RenderingOptions.GrayScale = true<br灰度

C# Wrapper API 映射

wkhtmltopdf 封装程序IronPDF备注
<代码>同步转换器</代码<代码>ChromePdfRenderer</代码主呈现器
<代码>HtmlToPdfDocument</代码<代码>渲染选项</代码配置
<代码>GlobalSettings.Out</代码<代码>pdf.SaveAs()</代码输出文件
<代码>GlobalSettings.PaperSize</代码<代码>RenderingOptions.PaperSize</代码纸张大小
<代码>GlobalSettings.Orientation</代码<代码>RenderingOptions.PaperOrientation</代码定位
<代码>GlobalSettings.Margins</代码<代码>RenderingOptions.Margin*</代码个别页边距
<代码>对象设置.页面</代码<代码>RenderHtmlFileAsPdf()</代码文件输入
<代码>ObjectSettings.HtmlContent</代码<代码>RenderHtmlAsPdf()</代码HTML 字符串
<代码>converter.Convert(doc)</代码<代码>renderer.RenderHtmlAsPdf()</代码生成 PDF

占位符语法迁移

wkhtmltopdf 占位符IronPdf 占位符
<代码>[页面]</代码{page}
<代码>[toPage]</代码<代码>{总页数}</代码
<代码>[日期]</代码<代码>{日期}</代码
<代码>[时间]</代码<代码>{时间}</代码
<代码>[标题]</代码<代码>{html-title}</代码
<代码>[url]</代码<代码>{url}</代码

常见迁移问题和解决方案

问题 1:页眉/页脚占位符语法

wkhtmltopdf: 使用方括号语法,如<代码>[页面]</代码和<代码>[toPage]</代码。

解决方案:更新IronPDF的大括号占位符:

// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 2:JavaScript 延迟配置

wkhtmltopdf:使用 JavascriptDelay 属性,可靠性有限。

解决方案: IronPdf 提供多种选择:

renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait forJavaScriptcondition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait forJavaScriptcondition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

问题 3:现代 CSS 无法渲染

症状: CSS 网格和 Flexbox 布局在wkhtmltopdf中呈现不正确。

解决方案:IronPDF的 Chromium 引擎可正确处理现代 CSS:

// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 4 期:同步与异步渲染

wkhtmltopdf:封装器是同步和阻塞线程。

解决方案:IronPDF支持异步渲染:

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf迁移清单

迁移前任务

审核您的代码库,确定所有wkhtmltopdf的使用情况:

# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
SHELL

查找并记录wkhtmltopdf二进制文件,以便删除。 文档当前设置(纸张大小、页边距、页眉/页脚)。

代码更新任务

1.删除所有wkhtmltopdf封装 NuGet 软件包 2.删除wkhtmltopdf二进制文件(wkhtmltopdf.exe、wkhtmltox.dll) 3.安装 IronPdf NuGet 软件包 4.将名称空间导入从 WkHtmlToPdfDotNet 更新为 IronPdf 5.将<代码>同步转换器</代码替换为 ChromePdfRenderer 6.将<代码>HtmlToPdfDocument</代码模式转换为直接呈现方法 7.更新 GlobalSettings 配置为 RenderingOptions 8.将边距配置从 MarginSettings 转换为单个属性 9.更新占位符语法([page]{page},<代码>[toPage]</代码→ {total-pages}) 10.在启动时添加 IronPdf 许可证初始化功能

迁移后测试

迁移后,验证这些方面:

  • PDF 输出的可视化比较(应通过现代 CSS 支持加以改进)
  • 验证现代 CSS 渲染(CSS 栅格和 Flexbox 现在可以使用)
  • 测试JavaScript较多的页面
  • 安全扫描以确认没有wkhtmltopdf二进制文件残留
  • 性能比较负载测试

安全验证

# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
SHELL

迁移到IronPDF的主要优势

从wkhtmltopdf迁移到IronPDF有几个关键优势:

安全性:消除了 CVE-2022-35583 和所有wkhtmltopdf漏洞。IronPDF没有已知的 CVE,并定期接受安全更新。

现代渲染引擎:IronPDF 使用当前的 Chromium 引擎,确保完全支持 CSS3、CSS Grid、Flexbox 和 ES6+ JavaScript。 正确呈现现代框架。

简化的 API:直接呈现方法取代了文档构建模式。 内置的 SaveAs() 方法无需手动处理字节。

扩展功能:PDF 操作、数字签名、PDF/A 合规性、水印和合并/拆分操作是wkhtmltopdf无法提供的内置功能。

主动开发:随着 .NET 10 和 C# 14 在 2026 年之前的采用率不断提高,IronPDF 的定期更新可确保与当前和未来的 .NET 版本兼容。

支持同步:利用本地 async/await 支持,防止高负载网络应用程序中的线程阻塞。

结论

wkhtmltopdf 作为免费的 HTML 到 PDF 转换器服务于 .NET 社区。 然而,由于该项目自 2016-2017 年以来已被正式放弃,而且一个 CRITICAL severity SSRF 漏洞(CVE-2022-35583)永远不会被修补,继续使用会给生产应用程序带来不可接受的安全风险。

IronPDF 提供了一个现代、安全的替代方案,其 Chromium 渲染引擎可处理当代网络标准。 迁移路径简单明了:移除wkhtmltopdf软件包和二进制文件,安装 IronPDF,用直接渲染方法替换文档构建模式,更新占位符语法。

立即开始迁移,免费试用 IronPDF,消除基于wkhtmltopdf的解决方案固有的安全漏洞。

有关全面的实施指导,请浏览 IronPdf文档教程API参考

Curtis Chau
技术作家

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

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