如何用 C# 从 PDF Duo 迁移到 IronPDF
从 PDF Duo 迁移到 IronPDF:完整的 C# 迁移指南
从PDF Duo .NET迁移到IronPDF将您的 .NET PDF 工作流程从一个模糊、文档不全、维护状态不明确的库迁移到一个稳定、文档齐全、维护积极的解决方案。 本指南提供了一个全面、循序渐进的迁移路径,可消除与废弃库相关的风险,同时获得 PDF Duo 无法提供的高级功能。
为什么要从 PDF Duo 迁移到 IronPDF.
PDF 双风险问题
PDF Duo .NET 是 .NET 生态系统中一个难以捉摸、鲜为人知的库。 虽然它可能对追求简单的开发人员很有吸引力,但该库的模糊性给生产应用带来了巨大挑战:
1.来源不明:未知开发人员,无可验证的公司支持。 没有可见的 GitHub 仓库或源代码,NuGet 下载统计有限,许可条款不确定。
2.缺少文档:几乎不可能找到可靠的信息。 目前没有官方的 API 参考资料,社区示例稀少,也没有官方教程或指南。 由于缺乏可靠的文档,任何使用 PDF Duo 的尝试都会受到阻碍。
3.废弃或不活跃状态:零星更新或无更新,有明显被忽视的迹象。 支持论坛显示 2019 年以来的帖子,但没有回复。 对于重大项目来说,被弃用的现实风险影响了其可行性。
4.有限功能:只有基本功能--简单的 HTML 转 PDF 和基本的 PDF 合并,没有表单、安全或水印等高级功能。
5.未知渲染引擎:引擎盖下的内容不透明。 CSS/JavaScript 支持未知,渲染质量不可预测,现代网络功能支持也不确定。
6.支持风险:出现故障时无法求助。 没有专业支持,没有社区帮助,完全有被放弃的风险。
PDF Duo 与IronPDF对比
| 方面 | PDF Duo .NET | IronPDF |
|---|---|---|
| 维护 | 未知/无活动 | 积极、定期更新 |
| 文档 | 稀疏/遗漏 | 综合性 |
| 支持 | 无 | 专业的支持团队 |
| 社区 | ~0 用户 | 41M+ NuGet 下载次数 |
| 渲染 | 未知引擎 | 现代 Chromium |
| 译文特点 | 基本的 | 全功能 |
| 稳定性 | 未知 | 经过生产验证 |
| 许可 | 不明确 | 透明 |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个稳定的基础,拥有活跃的开发和全面的文档,消除了依赖废弃库的不确定性。
开始之前
前提条件
1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥
NuGet 软件包变更
# RemovePDF Duo .NET(if you can find the correct package name)
dotnet remove package PDFDuo.NET
dotnet remove package PDFDuo
dotnet remove package PDF-Duo
# Install IronPDF
dotnet add package IronPdf# RemovePDF Duo .NET(if you can find the correct package name)
dotnet remove package PDFDuo.NET
dotnet remove package PDFDuo
dotnet remove package PDF-Duo
# Install IronPDF
dotnet add package IronPdf许可配置
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com确定 PDF Duo 的用途
# Find all PDF Duo references
grep -r "PDFDuo\|HtmlToPdfConverter\|PdfMerger" --include="*.cs" .# Find all PDF Duo references
grep -r "PDFDuo\|HtmlToPdfConverter\|PdfMerger" --include="*.cs" .完整的 API 参考
命名空间变更
| PDF Duo .NET | IronPDF |
|---|---|
| <代码>使用 PDFDuo;</代码 | <代码>使用 IronPdf;</ 代码 |
| <代码>使用 PDFDuo.Document;</ 代码 | <代码>使用 IronPdf;</ 代码 |
| <代码>使用 PDFDuo.Rendering;</ 代码 | <代码>使用 IronPdf.Rendering;</ 代码 |
| <代码>使用 PDFDuo.Settings;</代码 | <代码>使用 IronPdf;</ 代码 |
HTML 到 PDF 转换映射
| PDF Duo .NET | IronPDF | 备注 |
|---|---|---|
| <代码>new HtmlToPdfConverter()</ 代码 | <代码>new ChromePdfRenderer()</ 代码 | 主呈现器 |
| <代码>converter.ConvertHtmlString(html,路径)</代码 | <代码>renderer.RenderHtmlAsPdf(html).SaveAs(path)</代码 | HTML 字符串 |
| <代码>converter.ConvertUrl(url, path)</ 代码 | <代码>renderer.RenderUrlAsPdf(url).SaveAs(path)</代码 | URL 转换 |
| <代码>converter.ConvertFile(htmlPath, pdfPath)</ 代码 | <代码>renderer.RenderHtmlFileAsPdf(htmlPath).SaveAs(pdfPath)</代码 | HTML 文件 |
页面配置映射
| PDF Duo .NET | IronPDF | 备注 |
|---|---|---|
| <代码>settings.PageSize = PageSize.A4</ 代码 | <代码>RenderingOptions.PaperSize = PdfPaperSize.A4</ 代码 | 纸张大小 |
| <代码>settings.PageSize = PageSize.Letter</ 代码 | <代码>RenderingOptions.PaperSize = PdfPaperSize.Letter</ 代码 | 美国信函 |
| <代码>settings.Orientation(设置)= Landscape(横向)</代码 | <代码>RenderingOptions.PaperOrientation = Landscape</代码 | 定位 |
new Margins(top, right, bottom, left)(页边距) | 个别边距属性 | 参见以下内容 |
边距映射
| PDF Duo .NET | IronPDF | 备注 |
|---|---|---|
new Margins(top, right, bottom, left)(页边距) | 个别属性 | 无保证金对象 |
| <代码>margins.Top</代码 | <代码>RenderingOptions.MarginTop</代码 | 顶边距(毫米) |
| <代码>margins.Right</代码 | <代码>RenderingOptions.MarginRight</代码 | 右边距(毫米) |
| <代码>margins.Bottom</代码 | <代码>RenderingOptions.MarginBottom</代码 | 底边距(毫米) |
| <代码>margins.Left</代码 | <代码>RenderingOptions.MarginLeft</代码 | 左页边距(毫米) |
文档操作映射
| PDF Duo .NET | IronPDF | 备注 |
|---|---|---|
| <代码>PDFDocument.Load(path)</代码 | <代码>PdfDocument.FromFile(路径)</代码 | 加载 PDF |
| <代码>document.Save(路径)</代码 | <代码>pdf.SaveAs(路径)</代码 | 保存 PDF |
| <代码>document.ToBytes()</代码 | <代码>pdf.BinaryData</代码 | 获取字节数组 |
| <代码>new PdfMerger()</ 代码 | <代码>PdfDocument.Merge()</代码 | 静态方法 |
| <代码>merger.AddFile(path)</代码 | <代码>PdfDocument.FromFile(路径)</代码 | 加载然后合并 |
| <代码>merger.Merge(output)</代码 | <代码>merged.SaveAs(输出)</代码 | 合并后 |
PDF Duo 中不提供的新功能
| 特征 | IronPDF |
|---|---|
| 页眉/页脚 | <代码>RenderingOptions.HtmlHeader</代码>, <代码>HtmlFooter</代码 |
| 页码 | {page}, {total-pages} 占位符 |
| 水印 | <代码>pdf.ApplyWatermark(html)</代码 |
| 密码保护 | <代码>pdf.SecuritySettings</代码 |
| 表格填写 | <代码>pdf.Form.Fields</代码 |
| 数字签名 | <代码>pdf.SignWithFile()</代码 |
| 文本提取 | <代码>pdf.ExtractAllText()</代码 |
| 将 PDF 转换为图像 | <代码>pdf.RasterizeToImageFiles()</代码 |
代码迁移示例
示例 1:HTML 到 PDF 的转换
之前(PDF Duo):
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
converter.ConvertHtmlString(htmlContent, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
converter.ConvertHtmlString(htmlContent, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这里的根本区别在于 API 模式。 PDF Duo 的HtmlToPdfConverter.ConvertHtmlString()只需一次调用即可获取 HTML 和输出路径,同时处理转换和保存。IronPDF的 ChromePdfRenderer.RenderHtmlAsPdf() 首先返回一个 PdfDocument 对象,然后您可以使用 SaveAs() 保存该对象。
这种面向对象的方法具有显著的优势:您可以在保存之前对 PDF 进行操作(添加水印、合并文档、添加安全性、提取文本),而 PDF Duo 的直接到文件方法无法实现这些操作。 有关其他渲染选项,请参阅 HTML to PDF 文档。
示例 2:URL 到 PDF 的转换
之前(PDF Duo):
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.ConvertUrl("https://www.example.com", "webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.ConvertUrl("https://www.example.com", "webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
Console.WriteLine("Webpage converted to 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");
Console.WriteLine("Webpage converted to PDF!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comPDF Duo 使用相同的 HtmlToPdfConverter 类与 ConvertUrl(url, outputPath) 进行 URL 转换。IronPDF使用 ChromePdfRenderer 和专用的 RenderUrlAsPdf(url) 方法,返回一个 PdfDocument 对象。
一个关键优势是IronPDF基于 Chromium 的渲染引擎提供了现代 CSS3 和 JavaScript 支持,而 PDF Duo 未知的渲染引擎使得 CSS/JavaScript 支持不确定,渲染质量不可预测。 了解有关 URL 至 PDF 转换的更多信息。
示例 3:PDF 合并
之前(PDF Duo):
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var merger = new PdfMerger();
merger.AddFile("document1.pdf");
merger.AddFile("document2.pdf");
merger.Merge("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;
class Program
{
static void Main()
{
var merger = new PdfMerger();
merger.AddFile("document1.pdf");
merger.AddFile("document2.pdf");
merger.Merge("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这个例子显示了一个基本的架构差异。 PDF Duo 使用一个专用的 PdfMerger 类,该类使用 AddFile() 方法对文件进行排队,然后使用 Merge() 一步完成合并和保存。
IronPDF 使用不同的模式:使用 PdfDocument.FromFile() 将每个 PDF 作为 PdfDocument 加载,然后使用静态<代码>PdfDocument.Merge()</代码方法将它们合并。 这会返回一个新的 PdfDocument 对象,您可以使用 SaveAs() 单独保存该对象。
IronPdf 方法提供了更大的灵活性--您可以在合并前对任何 PDF 进行操作,为合并后的结果添加水印,应用安全设置等。 要合并多个文件,可以使用 LINQ:
var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com了解有关 合并和拆分 PDF 的更多信息。
迁移后的新功能
迁移到IronPDF后,您将获得 PDF Duo 无法提供的功能:
带页码的页眉和页脚
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.comPDF Duo 不支持页眉或页脚--没有相应的功能。IronPDF提供全面的 HTML/CSS 支持,并为页码等动态内容提供内置占位符。 请参见页眉和页脚指南。
水印
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(
"<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(
"<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.comPDF Duo 不支持水印。IronPDF提供基于 HTML 的水印,并完全支持 CSS 样式。
密码保护
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.comPDF Duo 不支持密码保护或安全设置。
文本提取
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();IRON VB CONVERTER ERROR developers@ironsoftware.comPDF Duo 不支持文本提取。
关键迁移说明
单个属性的边距对象
PDF Duo 使用单个 Margins 对象; IronPdf 使用个别属性:
// PDF Duo:
new Margins(top: 20, right: 15, bottom: 20, left: 15)
// IronPDF:
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;// PDF Duo:
new Margins(top: 20, right: 15, bottom: 20, left: 15)
// IronPDF:
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;IRON VB CONVERTER ERROR developers@ironsoftware.com保存方法命名
不同的保存方法名称:
// PDF Duo:
document.Save("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");// PDF Duo:
document.Save("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com加载 PDF 文件
不同的加载方法名称:
// PDF Duo:
PDFDocument.Load("document.pdf")
// IronPDF:
PdfDocument.FromFile("document.pdf")// PDF Duo:
PDFDocument.Load("document.pdf")
// IronPDF:
PdfDocument.FromFile("document.pdf")IRON VB CONVERTER ERROR developers@ironsoftware.com从设置对象到属性
PDF Duo 使用传递给构造函数的设置对象; IronPdf 使用属性:
// PDF Duo:
var settings = new PDFSettings { PageSize = PageSize.A4 };
var converter = new HtmlToPdfConverter(settings);
// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;// PDF Duo:
var settings = new PDFSettings { PageSize = PageSize.A4 };
var converter = new HtmlToPdfConverter(settings);
// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;IRON VB CONVERTER ERROR developers@ironsoftware.com功能对比
| 特征 | PDF Duo .NET | IronPDF |
|---|---|---|
| HTML 至 PDF | 基本的 | 完整的 CSS3、JavaScript |
| URL 至 PDF | 基本的 | 完全支持授权 |
| PDF 合并 | 是 | 是 |
| 页眉/页脚 | 否 | 完全支持 HTML |
| 页码 | 否 | 内置占位符 |
| 水印 | 否 | 基于 HTML |
| 密码保护 | 否 | 全面的安全选项 |
| 表格填写 | 否 | 是 |
| 数字签名 | 否 | 是 |
| 文本提取 | 否 | 是 |
| 将 PDF 转换为图像 | 否 | 是 |
| 异步支持 | 未知 | 完整的异步/等待 |
| .NET Core/5+ | 未知 | 全面支持 |
迁移清单
迁移前
- [ ] 在代码库中查找所有 PDF Duo 参考资料
- [文档当前设置(页面大小、页边距等)
- [ ] 列出使用的所有 PDF 操作
- [ ] 确定新功能(页眉、水印、安全性)的机会
- [ ] 获取 IronPdf 许可证密钥
软件包变更
- [ ] 删除
PDFDuo.NETNuGet 软件包 - [ ] 安装
IronPDFNuGet 软件包:<代码>dotnet 添加软件包 IronPdf - [ ] 将名称空间导入从<代码>使用 PDFDuo;</代码更新为
using IronPdf;
代码更改
- [ ] 在启动时添加许可证密钥配置
- [ ] 将
HtmlToPdfConverter替换为ChromePdfRenderer - [ ] 将
ConvertHtmlString(html, path)替换为RenderHtmlAsPdf(html).SaveAs(path) - [ ] 将
ConvertUrl(url, path)替换为RenderUrlAsPdf(url).SaveAs(path) - [ ] 将
PdfMerger模式替换为<代码>PdfDocument.Merge()</代码模式 - [ ] 将
Margins对象转换为单个边距属性 - [ ] 将
Save()替换为SaveAs() - [ ] 将
Load()替换为FromFile()
后迁移
- [运行比较 PDF 输出的回归测试
- [ ] 核实页面大小和页边距是否匹配
- [ ] 使用复杂的 HTML/CSS 进行测试(IronPdf 的现代引擎应能更好地处理它)
- [ ] 添加新功能(页眉、页脚、水印、安全性)
- [ ] 更新文档
结论
从 PDF Duo 迁移到 IronPDF,可以消除依赖一个晦涩难懂、文档不全、维护状态不明确的库所带来的巨大风险。 迁移提供了一个稳定的、经过生产验证的基础,具有全面的文档、专业的支持和积极的开发。
本次迁移的主要变化有 1.稳定性:未知/废弃 → 正在开发中,下载次数超过 4100 万次 2.文档:稀少/遗漏 → 综合指南和 API 参考 3.渲染:未知引擎 → 基于 Chromium 的现代 4.类:<代码>HtmlToPdfConverter</代码> → <代码>ChromePdfRenderer</代码 5.方法:ConvertHtmlString()/ConvertUrl()→RenderHtmlAsPdf()/RenderUrlAsPdf()。 6.合并:PdfMerger 类 →<代码>PdfDocument.Merge()</代码静态方法 7.边距:Margins 对象 → 单个 RenderingOptions 属性 8.新功能:页眉/页脚、水印、安全性、文本提取等






