跳至页脚内容
迁移指南

如何用 C# 从 PDF Duo 迁移到 IronPDF

从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
SHELL

许可配置

// 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";
$vbLabelText   $csharpLabel

确定 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" .
SHELL

完整的 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</code>,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!");
    }
}
$vbLabelText   $csharpLabel

After (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!");
    }
}
$vbLabelText   $csharpLabel

这里的根本区别在于 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!");
    }
}
$vbLabelText   $csharpLabel

After (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!");
    }
}
$vbLabelText   $csharpLabel

PDF 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!");
    }
}
$vbLabelText   $csharpLabel

After (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!");
    }
}
$vbLabelText   $csharpLabel

这个例子显示了一个基本的架构差异。 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");
$vbLabelText   $csharpLabel

了解有关 合并和拆分 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");
$vbLabelText   $csharpLabel

PDF 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");
$vbLabelText   $csharpLabel

PDF 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");
$vbLabelText   $csharpLabel

PDF Duo 不支持密码保护或安全设置。

文本提取

var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
$vbLabelText   $csharpLabel

PDF 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;
$vbLabelText   $csharpLabel

保存方法命名

不同的保存方法名称:

// PDF Duo:
document.Save("output.pdf");

// IronPDF:
pdf.SaveAs("output.pdf");
// PDF Duo:
document.Save("output.pdf");

// IronPDF:
pdf.SaveAs("output.pdf");
$vbLabelText   $csharpLabel

加载 PDF 文件

不同的加载方法名称:

// PDF Duo:
PDFDocument.Load("document.pdf")

// IronPDF:
PdfDocument.FromFile("document.pdf")
// PDF Duo:
PDFDocument.Load("document.pdf")

// IronPDF:
PdfDocument.FromFile("document.pdf")
$vbLabelText   $csharpLabel

从设置对象到属性

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;
$vbLabelText   $csharpLabel

功能对比

特征 PDF Duo .NET IronPDF
HTML 至 PDF 基本的 完整的 CSS3、JavaScript
URL 至 PDF 基本的 完全支持授权
PDF 合并
页眉/页脚 完全支持 HTML
页码 内置占位符
水印 基于 HTML
密码保护 全面的安全选项
表格填写
数字签名
文本提取
将 PDF 转换为图像
异步支持 未知 完整的异步/等待
.NET Core/5+ 未知 全面支持

迁移清单

迁移前

  • 在代码库中查找所有 PDF Duo 引用
  • 记录当前设置(页面大小、页边距等) 列出所有已使用的 PDF 操作
  • 寻找新功能(标题、水印、安全)的机会
  • 获取IronPDF许可证密钥

软件包变更

  • 删除PDFDuo.NET NuGet 包 安装IronPdf NuGet 包: dotnet add package IronPdf
  • 将命名空间导入从using 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 的现代引擎应该能更好地处理这种情况)
  • 添加新功能(页眉、页脚、水印、安全功能)
  • 更新文档

Curtis Chau
技术作家

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

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