如何用 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 PDFLandscape 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 文档...代码>代码>代码>





