跳至页脚内容
迁移指南

如何用 C# 从 DinkToPdf 迁移到 IronPDF

从DinkToPdf迁移到 IronPDF:完整的 C# 迁移指南

DinkToPdf 是 wkhtmltopdf 的一个流行开源 .NET 封装器,可实现 HTML 到 PDF 的转换。 然而,底层的 wkhtmltopdf 项目在 2020 年被放弃,留下了关键的安全漏洞未修补,包括 CVE-2022-35583(服务器端请求伪造)。DinkToPdf的线程安全问题会导致生产崩溃,而过时的 WebKit 渲染引擎不支持现代 CSS,这些因素结合在一起,给生产应用程序带来了巨大的风险。 本综合指南提供了从DinkToPdf逐步迁移到IronPDF的路径--IronPDF 是一个线程安全的 .NET PDF 库,具有现代 Chromium 渲染功能,不依赖本地二进制文件。

为什么要从DinkToPdf迁移到 IronPDF? DinkToPdf 封装了 wkhtmltopdf,继承了其所有的安全漏洞和技术限制。 了解这些问题对于评估迁移的紧迫性至关重要。 ### 关键安全问题 DinkToPdf 继承了 wkhtmltopdf 中未修补的重要安全漏洞: 1.**CVE-2022-35583(SSRF)**:服务器端请求伪造允许攻击者访问内部网络资源 2.**废弃项目**: wkhtmltopdf 自 2020 年以来一直未得到维护。 3.**无安全补丁**:已知漏洞永远无法修复 ### 技术问题 | 问题 |影响| |-------|--------| |**线程安全**|在生产中,SynchronizedConverter 在并发负载下仍会崩溃| |**本地二进制文件**|使用特定平台的 libwkhtmltox 二进制文件进行复杂部署| |**CSS限制**|不支持 Flexbox、网格或现代 CSS| |**JavaScript**语言|执行不一致、超时| |**渲染**|过时的 WebKit 引擎(约 2015 年)| |**维护**|最后更新时间:2018 年| ### 架构比较 |方面|DinkToPdf|IronPDF| |--------|-----------|---------| |**安全性**|CVE-2022-35583 (SSRF),未打补丁|无已知漏洞| |**渲染引擎**|过时的 WebKit(2015 年)|现代 Chromium| |**线程安全**|并发使用中的崩溃|完全线程安全| |**本地依赖关系**|特定平台的二进制文件|纯 NuGet 软件包| |**CSS支持**|无 Flexbox/网格|完整的 CSS3| |**JavaScript**语言|有限、不一致|全面支持| |**维护**|遗弃(2018)|积极维护| ### 功能对比 | 特征 |DinkToPdf|IronPDF| |---------|-----------|---------| |HTML 至 PDF|✅(过时的引擎)|✅(Chromium)| |URL 至 PDF|✅|✅| |自定义页边距|✅|✅| | 页眉/页脚 |✅(有限)|✅ (完整 HTML)| |CSS3|❌ 有限公司|✅ 全文| |Flexbox/Grid|❌|✅| |JavaScript|⚠️ 有限公司|✅ 全文| |PDF 操作|❌|✅| |表格填写|❌|✅| |数字签名|❌|✅| |加密|❌|✅| | 水印 |❌|✅| |合并/拆分|❌|✅| ## 迁移前准备 ### 前提条件 确保您的环境符合这些要求: - .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9 - Visual Studio 2019+ 或带有 C# 扩展的 VS Code - 访问 NuGet 包管理器 -IronPDF许可证密钥(可在[ironpdf.com](https://ironpdf.com/licensing/)免费试用) ### 审核DinkToPdf的使用情况 在您的解决方案目录中运行这些命令,以识别所有DinkToPdf引用: ```bash # Find allDinkToPdfusages in your codebase grep -r "using DinkToPdf" --include="*.cs" . grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" . # Find NuGet package references grep -r "DinkToPdf" --include="*.csproj" . # Find wkhtmltopdf binaries find . -name "libwkhtmltox*" ``` ### 值得期待的重大变化 |变更|DinkToPdf|IronPDF|影响| |--------|-----------|---------|--------| |**转换器**|<代码>SynchronizedConverter(new PdfTools())ChromePdfRendererHtmlToPdfDocument全局设置+<代码>对象设置渲染选项字节[]PDF 文档libwkhtmltox.dll/solibwkhtmltox.dll(Windows) - `libwkhtmltox.so` (Linux) -<代码>libwkhtmltox.dylib(macOS) IronPDF 没有本地依赖性--一切都是托管代码。 ### 步骤 3:更新命名空间引用 用IronPDF替换DinkToPdf命名空间: ```csharp // Remove these using DinkToPdf; using DinkToPdf.Contracts; // Add this using IronPdf; ``` ### 步骤 4:配置许可证 ```csharp // Add at application startup (Program.cs or Global.asax) IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; ``` ## 完整的 API 迁移参考 ### 核心类映射 |DinkToPdf|IronPDF|备注| |-----------|---------|-------| |<代码>同步转换器ChromePdfRendererBasicConverterChromePdfRendererPdfToolsHtmlToPdfDocument全局设置渲染选项对象设置渲染选项边距设置ColorMode = ColorMode.ColorOrientation = Orientation.PortraitPaperOrientation = PdfPaperOrientation.PortraitOrientation = Orientation.LandscapePdfPaperOrientation = PdfPaperOrientation.LandscapePaperSize = PaperKind.A4PaperSize = PdfPaperSize.A4Margins = new MarginSettings()Margins.Top = 10MarginTop = 10Margins.Bottom = 10边距下限 = 10Margins.Left = 15边距左 = 15Margins.Right = 15MarginRight = 15Hello World

This is a PDF from HTML.

", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); } } ``` **IronPDF 实现:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; using System; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Hello World

This is a PDF from HTML.

"); pdf.SaveAs("output.pdf"); } } ``` IronPDF 可将 20 行的DinkToPdf配置缩减为 4 行。 没有 `SynchronizedConverter`, 没有 `PdfTools`, 没有 `HtmlToPdfDocument`, 没有<代码>对象设置Custom PDF

Landscape orientation with custom margins.

", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("custom.pdf", pdf); } } ``` **IronPDF 实现:** ```csharp // 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 = 15; renderer.RenderingOptions.MarginRight = 15; var pdf = renderer.RenderHtmlAsPdf("

Custom PDF

Landscape orientation with custom margins.

"); pdf.SaveAs("custom.pdf"); } } ``` IronPDF 的<代码>渲染选项全局设置边距设置/dev/null ``` ### 无需单例 DinkToPdf 的<代码>同步转换器ChromePdfRenderer(); // Or just create inline: var renderer = new ChromePdfRenderer(); ``` ### Richer 返回类型 DinkToPdf 返回 `byte[]`.IronPDF返回<代码>PDF 文档...
"; // Broken! //IronPDF- full support (modern Chromium) var html = @"
Left
Right
"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! ``` ## 迁移后核对表 完成代码迁移后,请验证以下内容: - [ ] 运行所有单元测试以验证 PDF 生成工作正常 - [ ] 测试多线程场景(这些场景与DinkToPdf一起崩溃) - [ ] 比较 PDF 输出质量(IronPDF 的 Chromium 渲染效果更好) - [ ] 验证 CSS 呈现(Flexbox/Grid 现已正常运行) - [ ] 测试JavaScript的执行(使用 IronPdf 时可靠) - [ ] 更新 CI/CD 管道以移除 wkhtmltopdf 安装 - [ ] 验证安全扫描通过(不再有 CVE-2022-35583 标记) - [ ] 从 Docker/部署脚本中移除本地二进制部署 ## 未来保护您的 PDF 基础架构 随着 .NET 10 即将推出,C# 14 也将引入新的语言特性,选择一个积极维护的 PDF 库可以确保长期的兼容性。 IronPdf 的现代 Chromium 引擎会定期更新,而DinkToPdf废弃的 wkhtmltopdf 功能仍停留在 2015 年--随着网络标准在 2025 年和 2026 年的发展,这种差距只会越来越大。 ## 其他资源 - [IronPDF文档](https://ironpdf.com/docs/) - [HTML转PDF教程](https://ironpdf.com/tutorials/) - [API Reference](https://ironpdf.com/object-reference/api/) - [NuGet软件包](https://www.nuget.org/packages/IronPdf/) - [许可选项](https://ironpdf.com/licensing/) --- 从DinkToPdf迁移到IronPDF可消除关键安全漏洞(CVE-2022-35583)、线程安全崩溃、本地二进制部署复杂性和过时的 CSS 渲染。 向现代 Chromium 引擎的过渡提供了全面的CSS3支持、可靠的JavaScript执行,以及积极维护库带来的安心感。
Curtis Chau
技术作家

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

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