迁移指南 如何用 C# 从 DinkToPdf 迁移到 IronPDF Curtis Chau 已发布:2026年1月11日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 DinkToPdf 封装了 wkhtmltopdf,继承了其所有的安全漏洞和技术限制。 了解这些问题对于评估迁移的紧迫性至关重要。 关键安全问题 DinkToPdf 继承了 wkhtmltopdf 中未修补的重要安全漏洞: 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免费试用) 审核DinkToPdf的使用情况 在您的解决方案目录中运行这些命令,以识别所有DinkToPdf引用: # 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*" # 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*" SHELL 值得期待的重大变化 变更 DinkToPdf IronPDF 影响 转换器 SynchronizedConverter(new PdfTools()) ChromePdfRenderer 更简单的实例化 文档 HtmlToPdfDocument 直接方法调用 无文档对象 设置 全局设置</code> +对象设置|渲染选项` 单一选项对象 返回类型 字节[] PDF 文档 更强大的对象 二进制 libwkhtmltox.dll/so 无(托管) 删除本地文件 线程安全 SynchronizedConverter 必填 默认为线程安全 简化代码 DI 需要单例 终生 灵活 逐步迁移过程 步骤 1:更新 NuGet 软件包 移除DinkToPdf并安装 IronPDF: # Remove DinkToPdf dotnet remove package DinkToPdf # Install IronPDF dotnet add package IronPdf # Remove DinkToPdf dotnet remove package DinkToPdf # Install IronPDF dotnet add package IronPdf SHELL 步骤 2:删除本地二进制文件 从您的项目中删除这些特定于平台的文件: `libwkhtmltox.dll(Windows) libwkhtmltox.so (Linux) libwkhtmltox.dylib(macOS) IronPDF 没有本地依赖性--一切都是托管代码。 步骤 3:更新命名空间引用 用IronPDF替换DinkToPdf命名空间: // Remove these using DinkToPdf; using DinkToPdf.Contracts; // Add this using IronPdf; // Remove these using DinkToPdf; using DinkToPdf.Contracts; // Add this using IronPdf; $vbLabelText $csharpLabel 步骤 4:配置许可证 // Add at application startup (Program.cs or Global.asax) IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; // Add at application startup (Program.cs or Global.asax) IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; $vbLabelText $csharpLabel 完整的 API 迁移参考 核心类映射 DinkToPdf IronPDF 备注 同步转换器|ChromePdfRenderer` 默认为线程安全 BasicConverter ChromePdfRenderer 同类,更简单 PdfTools 不需要 内化 HtmlToPdfDocument 不需要 直接方法调用 全局设置 渲染选项 呈现器的一部分 对象设置 渲染选项 呈现器的一部分 边距设置 个别边距属性 MarginTop, MarginBottom 等。 全局设置映射 DinkToPdf 全局设置 IronPdf 同等产品 ColorMode = ColorMode.Color 默认(始终为彩色) Orientation = Orientation.Portrait PaperOrientation = PdfPaperOrientation.Portrait Orientation = Orientation.Landscape PdfPaperOrientation = PdfPaperOrientation.Landscape PaperSize = PaperKind.A4 PaperSize = PdfPaperSize.A4 Margins = new MarginSettings() 个别边距属性 边距设置映射 DinkToPdf 边界 IronPdf 同等产品 Margins.Top = 10 MarginTop = 10 Margins.Bottom = 10 边距下限 = 10 Margins.Left = 15 边距左 = 15 Margins.Right = 15 MarginRight = 15 代码迁移示例 将基本 HTML 转换为 PDF. 基本转换演示了从DinkToPdf的冗长配置到IronPDF的精简 API 的巨大简化。 DinkToPdf实现: // NuGet: Install-Package DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = Orientation.Portrait, PaperSize = PaperKind.A4, }, Objects = { new ObjectSettings() { HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); } } // NuGet: Install-Package DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = Orientation.Portrait, PaperSize = PaperKind.A4, }, Objects = { new ObjectSettings() { HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); } } $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"); } } $vbLabelText $csharpLabel IronPDF 可将 20 行的DinkToPdf配置缩减为 4 行。 没有 SynchronizedConverter, 没有 PdfTools, 没有 HtmlToPdfDocument, 没有对象设置`- 只需渲染和保存。 有关更多选项,请参阅 HTML 转 PDF 文档。 URL到PDF转换 DinkToPdf实现: // NuGet: Install-Package DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = 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 DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = Orientation.Portrait, PaperSize = PaperKind.A4, }, Objects = { new ObjectSettings() { Page = "https://www.example.com", } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("webpage.pdf", pdf); } } $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"); } } $vbLabelText $csharpLabel IronPDF 的 RenderUrlAsPdf 以直接方法调用取代嵌套的 ObjectSettings.Page 配置。 有关更多选项,请参阅 URL to PDF 文档。 横向和页边距自定义设置 DinkToPdf实现: // NuGet: Install-Package DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = Orientation.Landscape, PaperSize = PaperKind.A4, Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 } }, Objects = { new ObjectSettings() { HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("custom.pdf", pdf); } } // NuGet: Install-Package DinkToPdf using DinkToPdf; using DinkToPdf.Contracts; using System.IO; class Program { static void Main() { var converter = new SynchronizedConverter(new PdfTools()); var doc = new HtmlToPdfDocument() { GlobalSettings = { ColorMode = ColorMode.Color, Orientation = Orientation.Landscape, PaperSize = PaperKind.A4, Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 } }, Objects = { new ObjectSettings() { HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("custom.pdf", pdf); } } $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 = 15; renderer.RenderingOptions.MarginRight = 15; var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>"); pdf.SaveAs("custom.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 = 15; renderer.RenderingOptions.MarginRight = 15; var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>"); pdf.SaveAs("custom.pdf"); } } $vbLabelText $csharpLabel IronPDF 的渲染选项以统一、流畅的 API 取代了全局设置和边距设置。 有关更多配置选项,请参阅渲染选项文档。 关键迁移说明 删除本地二进制文件 最重要的清理步骤是删除 wkhtmltopdf 本机二进制文件。 IronPdf 没有本地依赖性: # Delete native binaries rm libwkhtmltox.* 2>/dev/null # Delete native binaries rm libwkhtmltox.* 2>/dev/null SHELL 无需单例 DinkToPdf 的同步转换器必须注册为单例,以避免崩溃。IronPDF的ChromePdfRenderer是线程安全的,具有任何 DI 生命周期: //DinkToPdf- MUST be singleton services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools())); //IronPDF- any lifetime works services.AddScoped<ChromePdfRenderer>(); // Or just create inline: var renderer = new ChromePdfRenderer(); //DinkToPdf- MUST be singleton services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools())); //IronPDF- any lifetime works services.AddScoped<ChromePdfRenderer>(); // Or just create inline: var renderer = new ChromePdfRenderer(); $vbLabelText $csharpLabel Richer 返回类型 DinkToPdf 返回 byte[].IronPDF返回PDF 文档并具有操作功能: //DinkToPdfreturns byte[] byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); return File(pdf, "application/pdf"); //IronPDFreturns PdfDocument var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); return File(pdf.BinaryData, "application/pdf"); //DinkToPdfreturns byte[] byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); return File(pdf, "application/pdf"); //IronPDFreturns PdfDocument var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); return File(pdf.BinaryData, "application/pdf"); $vbLabelText $csharpLabel 完全支持 CSS3. 在DinkToPdf中失效的现代布局在IronPDF中可以完美运行: //DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit) var html = "<div style='display: flex;'>...</div>"; // Broken! //IronPDF- full support (modern Chromium) var html = @" <div style='display: flex; justify-content: space-between;'> <div>Left</div> <div>Right</div> </div>"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! //DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit) var html = "<div style='display: flex;'>...</div>"; // Broken! //IronPDF- full support (modern Chromium) var html = @" <div style='display: flex; justify-content: space-between;'> <div>Left</div> <div>Right</div> </div>"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! $vbLabelText $csharpLabel 迁移后核对表 完成代码迁移后,请验证以下内容: 运行所有单元测试以验证 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文档 HTML转PDF教程 API 参考 NuGet软件包 许可选项 从DinkToPdf迁移到IronPDF可消除关键安全漏洞(CVE-2022-35583)、线程安全崩溃、本地二进制部署复杂性和过时的 CSS 渲染。 向现代 Chromium 引擎的过渡提供了全面的CSS3支持、可靠的JavaScript执行,以及积极维护库带来的安心感。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 如何用 C# 从 DynamicPDF 迁移到 IronPDF如何用 C# 从 CraftMyPDF 迁移...
已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多