跳至页脚内容
迁移指南

如何用 C# 从 DynamicPDF 迁移到 IronPDF

为什么要从动态 PDF迁移到 IronPDF?

DynamicPDF 的产品碎片化是迁移的主要驱动力。 了解许可模式对于评估当前实施的真实成本至关重要。

产品碎片化问题

DynamicPDF 是作为具有单独许可证的独立产品出售的:

1.动态 PDF 生成器:从零开始创建 PDF

  1. DynamicPDF Merger:合并、拆分和操作现有 PDF 文件(需另行购买)
  2. DynamicPDF核心套件:组合生成器和合并器
  3. DynamicPDF ReportWriter:报表生成
  4. DynamicPDF HTML Converter: HTML 转 PDF 转换(独立插件)
  5. DynamicPDF 打印管理器:以编程方式打印 PDF

完整的 PDF 解决方案需要 3-5 个动态 PDF单独许可证。 IronPdf 一揽子包含所有内容。

架构比较

方面 动态 PDF IronPDF
产品模型 零散(5 个以上产品) 一体化库
许可 需要多个许可证 单一许可证
HTML 到 PDF 单独购买附加组件 基于 Chromium 的内置
CSS支持 有限(需要附加功能) 带有 Flexbox/Grid 的完整 CSS3
API 风格 基于坐标的定位 HTML/CSS + 操作 API
学习曲线 Steep(多个应用程序接口) 温和(网络技术)
现代.NET .NET Standard 2.0 .NET 6/7/8/9+ 原生语言

主要迁移优势

1.单个包:一个 NuGet 包即可替代 3-5 个动态 PDF包 2.现代渲染: Chromium 引擎与传统渲染

  1. Web 技术:使用 HTML/CSS 而非基于坐标的定位 4.更简洁的 API:代码更少,更易读,更易于维护 5.无需额外购买: HTML、合并、安全功能全部包含在内

迁移前准备

前提条件

确保您的环境符合这些要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或带有 C# 扩展的 VS Code
  • 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)

审计动态 PDF的使用情况

在解决方案目录中运行这些命令,以识别所有动态 PDF引用:

# Find all动态 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
# Find all动态 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
SHELL

需要查找的常见软件包:

  • ceTe.DynamicPDF.CoreSuite.NET
  • ceTe.DynamicPDF.Generator.NET
  • ceTe.DynamicPDF.Merger.NET
  • ceTe.DynamicPDF.HtmlConverter.NET

理解范式转变

从动态 PDF迁移到IronPDF时,最重要的变化是文档创建的基本方法。动态 PDF使用基于坐标的定位,您可以将元素放置在页面上特定的 X、Y 坐标上。 IronPdf 使用 HTML/CSS 渲染,您可以使用网络技术进行设计。

这种模式的转变意味着将标签</code>,文本区域表 2`元素转换为 HTML 对应元素--这种变化通常会带来更可读、更易维护的代码。

逐步迁移过程

步骤 1:更新 NuGet 软件包

删除所有动态 PDF软件包并安装 IronPdf:

# Remove动态 PDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
# Remove动态 PDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

步骤 2:更新命名空间引用

用IronPDF替换动态 PDF命名空间:

// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

步骤 3:配置许可证

// 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

完整的 API 迁移参考

核心类映射

DynamicPDF 类 IronPdf 同等产品 备注
文档 ChromePdfRenderer 用于生成新的 PDF
文档 PDF 文档 用于操作现有 PDF
页面 HTML <div> 带分页符 或多次渲染
合并文档 PdfDocument.Merge() 静态合并法
HtmlConverter ChromePdfRenderer 内置,无附加

页面元素到 HTML 的映射

DynamicPDF 页面元素 IronPdf/HTML 同等版本
标签 <p></code>, <code><span></code>, <code><div>
文本区域 使用 CSS 的 <div>, <p>
图片 <img> 标记
表 2 HTML <table>
页面编号标签 {page} / {total-pages} 占位符

关键 API 映射

动态 PDF IronPDF 备注
文档</code> + <code>页面 ChromePdfRenderer 基于 HTML 的生成
标签</code>, <code>文本区域 HTML <p>, <div> 使用 CSS 创建风格
表 2 HTML <table> 完整的 CSS 样式
合并文档 PdfDocument.Merge() 静态方法
HtmlConverter ChromePdfRenderer 内置,无附加
document.Draw() pdf.SaveAs()</code> / <code>pdf.BinaryData
页面编号标签</code> <code>%%CP%% {page} 占位符 不同的语法

代码迁移示例

HTML 到 PDF 转换

HTML 到 PDF 的转换演示了动态 PDF对单独的HtmlConverter`附加组件与 IronPdf 内置 Chromium 渲染的对比要求。

DynamicPDF 实现:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPdf 的ChromePdfRenderer提供基于 Chromium 的渲染,完全支持 CSS3 - 无需单独购买附加组件。 有关更多选项,请参阅 HTML 转 PDF 文档

合并多个 PDF 文件

PDF 合并演示了动态 PDF的合并文档类(需要 Merger 产品许可证)与IronPDF内置静态 Merge 方法之间的区别。

DynamicPDF 实现:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

// NuGet: Install-Package IronPdf
using IronPdf;

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");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

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

IronPDF 的静态 Merge 方法可直接接受多个PDF 文档对象。 更多选项请参阅PDF 合并文档

在 PDF 中添加文本

文本放置演示了从动态 PDF基于坐标的标签元素到IronPDF基于 HTML 的 TextStamper 的范式转变。

DynamicPDF 实现:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPdf 的 TextStamper 提供基于对齐方式的定位,而不是基于坐标的放置,从而使布局在不同页面尺寸中更具适应性。 有关更多选项,请参阅水印和盖章文档

完整文档生成示例

本综合示例展示了将包含多个元素的动态 PDF文档转换为IronPDF的 HTML 方法。

DynamicPDF 实现:

using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
$vbLabelText   $csharpLabel

关键迁移说明

基于坐标的 HTML/CSS 定位

基本模式的转变需要将 X、Y 坐标定位转换为基于 CSS 的布局:

//动态 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
//动态 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
$vbLabelText   $csharpLabel

页面编号语法

DynamicPDF 和IronPDF对页码使用不同的占位符语法:

//动态 PDFplaceholders
"Page %%CP%% of %%TP%%"

//IronPDFplaceholders
"Page {page} of {total-pages}"
//动态 PDFplaceholders
"Page %%CP%% of %%TP%%"

//IronPDFplaceholders
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

页眉和页脚

将动态 PDFTemplate 元素转换为IronPDFHtmlHeaderFooter 元素:

//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
$vbLabelText   $csharpLabel

有关更多页眉/页脚选项,请参阅页眉和页脚文档

安全设置

//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
$vbLabelText   $csharpLabel

有关全面的安全选项,请参阅加密文档

迁移后核对表

完成代码迁移后,请验证以下内容:

  • 生成PDF文件的可视化比较
  • 检查文本位置和布局
  • 测试表格渲染和溢出
  • 检查所有页面的页眉/页脚
  • 测试表单填写功能
  • 验证安全性/加密
  • 性能基准测试
  • 删除未使用的动态 PDF许可证文件
  • 更新文档

未来保护您的 PDF 基础架构

随着 .NET 10 即将推出,C# 14 也将引入新的语言特性,选择一个采用现代 .NET 模式的 PDF 库可以确保长期的兼容性。IronPDF对 .NET 6/7/8/9+ 的原生支持为项目延伸到 2025 年和 2026 年提供了一条清晰的前进道路--无需管理多个产品许可证或浏览零散的 API 的复杂性。

其他资源


从动态 PDF迁移到 IronPdf 可以消除管理多个产品许可证的复杂性,同时提供基于 Chromium 的现代渲染和完整的 CSS3 支持。 从基于坐标的定位过渡到 HTML/CSS 设计,通常会产生更易于维护的代码,并充分利用熟悉的网络技术。

Curtis Chau
技术作家

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

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