IRONSOFTWAREHOME
视频

如何在C#中保存和编辑PDF修订历史

Curtis Chau
Curtis Chau
Updated: 2026年5月18日

从MigraDoc迁移到IronPDF可将您的 .NET PDF 工作流程从需要手动逐个元素构建的冗长程序化文档模型转变为基于HTML/CSS的现代方法,从而充分利用现有的网络开发技能。 本指南为专业 .NET 开发人员提供了一个全面的、循序渐进的迁移路径,消除了MigraDoc专有文档对象模型的陡峭学习曲线。

为什么要从MigraDoc迁移到 IronPDF.

###MigraDoc面临的挑战

MigraDoc 是一个布局引擎,基于 PDFsharp 之上—它依赖于 PDFsharp 包并渲染到一个 PDFsharp PdfDocument。 由empira / PDFsharp-Team在MIT许可证下维护,它在程序化生成方面功能强大,但有一些基本限制影响现代开发工作流:

1.**不支持 HTML:**MigraDoc不直接支持 HTML。 您必须使用 ParagraphTable 对象手动逐个元素构建文档—无法利用现有的HTML/CSS设计。

  1. **专有文档模型:**MigraDoc需要学习一个独特的文档模型,其中包含 AddRow()AddCell() 等概念。 对于具有网络开发背景的开发人员来说,这种陡峭的学习曲线尤其具有挑战性。

3.**样式选项有限:**虽然MigraDoc提供了强大的文档结构管理功能,但与现代网络工具相比,其样式功能较为有限。 与完整的 CSS3 相比,Format.Font.BoldFormat.Alignment 等属性有所限制。

4.**冗长的代码:**即使是创建简单的布局也需要几十行代码。 一个带标题的基本表格可能需要 15-20 行MigraDoc代码。

5.**不支持 JavaScript:**MigraDoc无法渲染动态内容或执行 JavaScript,限制了现代图表和交互元素的选择。

6.**图表功能较为基础:**与 Chart.js 或 D3 等现代JavaScript图表库相比,MigraDoc 的图表功能较为有限。

###MigraDoc与IronPDF对比

特征MigraDocIronPDF
内容定义程序性(文件/章节/段落)HTML/CSS
学习曲线Steep(专有 DOM)简单(网络技能)
风格设计有限属性完整的 CSS3
JavaScriptNone全面执行 Chromium
表格手动定义列/行HTML <table> with CSS
图表基本MigraDoc图表任何JavaScript图表库
图片手册尺寸/定位Standard HTML <img>
响应式布局不支持Flexbox、网格
许可证开源(MIT)商业翻译

对于锁定现代.NET的团队,IronPDF让开发者无需学习专有文档模型即可使用熟悉的HTML/CSS技能。


迁移复杂性评估

按功能估算的工作量

特征迁移复杂性
简单文本极低
表格low
页眉/页脚low
风格语言
图片low
图表语言

范式转换

此次MigraDoc迁移的根本转变是从程序化文档构建转向HTML 优先渲染:

MigraDoc:文档 → AddSection() → AddParagraph() → PdfDocumentRenderer → 保存()
IronPDF:   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Text

这种模式的转变大大降低了代码的复杂性,同时通过 CSS 提供了无限的样式功能。


开始之前

前提条件

  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 软件包变更

# RemoveMigraDocpackages (package IDs are case-sensitive on nuget.org)
dotnet remove package PDFsharp-MigraDoc
dotnet remove package PDFsharp-MigraDoc-GDI
dotnet remove package PDFsharp-MigraDoc-WPF

# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

确定MigraDoc的用途

# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .
SHELL

完整的 API 参考

类映射

MigraDoc 类IronPDF 同等产品
DocumentChromePdfRenderer
SectionHTML <body> or <div>
ParagraphHTML <p>, <h1>, etc.
FormattedTextHTML <span>, <strong>, etc.
TableHTML <table>
RowHTML <tr>
ColumnHTML <col> or CSS
CellHTML <td>, <th>
PdfDocumentRendererChromePdfRenderer

方法映射

MigraDoc 方法IronPDF 同等产品
document.AddSection()HTML 结构
section.AddParagraph(text)<p>text</p>
section.AddTable()<table>
table.AddColumn(width)CSS width property
table.AddRow()<tr>
row.Cells[n].AddParagraph()<td>content</td>
renderer.RenderDocument()RenderHtmlAsPdf(html)
pdfDocument.Save(path)pdf.SaveAs(path)

占位符映射(页眉/页脚)

MigraDoc 方法IronPDF 占位符
AddPageField(){page}
AddNumPagesField(){total-pages}
AddDateField(){date}

代码迁移示例

示例 1:基本 HTML 到 PDF(根本区别)

之前 (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        //MigraDocdoesn't support HTML directly
        // Must manually create document structure
        Document document = new Document();
        Section section = document.AddSection();
        
        Paragraph paragraph = section.AddParagraph();
        paragraph.AddFormattedText("Hello World", TextFormat.Bold);
        paragraph.Format.Font.Size = 16;
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("output.pdf");
    }
}
C#

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

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

这个例子说明了MigraDoc和IronPDF的根本区别。MigraDoc需要创建一个 Document,添加一个 Section,添加一个 Paragraph,使用 AddFormattedText()TextFormat.Bold,设置 Format.Font.Size,创建一个 PdfDocumentRenderer,分配文档,调用 RenderDocument(),最后保存。 这是 10 多行包含多个对象的代码。

IronPDF 只需 3 行即可实现相同的效果:创建呈现器、呈现 HTML 并保存。 HTML <h1> 标签自然提供粗体、大标题样式。 有关其他渲染选项,请参阅 HTML to PDF 文档

示例 2:创建表格

之前 (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();
        
        Table table = section.AddTable();
        table.Borders.Width = 0.75;
        
        Column column1 = table.AddColumn("3cm");
        Column column2 = table.AddColumn("3cm");
        
        Row row1 = table.AddRow();
        row1.Cells[0].AddParagraph("Name");
        row1.Cells[1].AddParagraph("Age");
        
        Row row2 = table.AddRow();
        row2.Cells[0].AddParagraph("John");
        row2.Cells[1].AddParagraph("30");
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("table.pdf");
    }
}
C#

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlTable = @"
            <table border='1'>
                <tr><th>Name</th><th>Age</th></tr>
                <tr><td>John</td><td>30</td></tr>
            </table>";
        
        var pdf = renderer.RenderHtmlAsPdf(htmlTable);
        pdf.SaveAs("table.pdf");
    }
}

MigraDoc 表格创建需要理解 RowCell 的层次结构。 您必须使用 AddColumn() 明确添加列,用 AddRow() 创建行,使用索引访问单元格 Cells[n],并用 AddParagraph() 添加内容。 边框通过 table.Borders.Width 设置。

IronPDF 使用任何网络开发人员都知道的标准 HTML 表格语法。 border='1' 属性提供边框,<th> 元素创建头部单元格,<td> 元素创建数据单元格。 可以添加 CSS 以实现斑马线、悬停效果或响应式布局等高级样式。 了解有关在 PDF 中创建表格的更多信息。

示例 3:带页码的页眉和页脚

之前 (MigraDoc):

// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();
        
        // Add header
        Paragraph headerPara = section.Headers.Primary.AddParagraph();
        headerPara.AddText("Document Header");
        headerPara.Format.Font.Size = 12;
        headerPara.Format.Alignment = ParagraphAlignment.Center;
        
        // Add footer
        Paragraph footerPara = section.Footers.Primary.AddParagraph();
        footerPara.AddText("Page ");
        footerPara.AddPageField();
        footerPara.Format.Alignment = ParagraphAlignment.Center;
        
        // Add content
        section.AddParagraph("Main content of the document");
        
        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("header-footer.pdf");
    }
}
C#

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter
        {
            CenterText = "Document Header"
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter
        {
            CenterText = "Page {page}"
        };

        var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");
        pdf.SaveAs("header-footer.pdf");
    }
}

MigraDoc 页眉和页脚需要访问 section.Headers.Primarysection.Footers.Primary,在其中创建段落,使用 AddText() 添加文字,并使用诸如 AddPageField() 的特殊方法处理动态内容。 对齐需要设置 Format.Alignment

IronPDF 在 RenderingOptions.TextHeader / RenderingOptions.TextFooter 上使用 TextHeaderFooter 配置页眉和页脚,并使用 CenterTextRightText 区域。 {page} 占位符自动插入当前页码。 对于更丰富的布局,使用 HtmlHeader / HtmlFooter 配合 HtmlHeaderFooter 以获得完整的HTML/CSS支持。 有关高级选项,请参见页眉和页脚文档


关键迁移说明

页码占位符语法

页眉和页脚最重要的变化是占位符语法:

//MigraDocfield methods:
footerPara.AddPageField();       // Current page
footerPara.AddNumPagesField();   // Total pages

//IronPDFplaceholders:
"Page {page} of {total-pages}"

将属性格式化为 CSS.

MigraDoc 的 Format 属性对应到 CSS:

// MigraDoc:
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;

//IronPDF(CSS):
<p style="font-size: 16pt; font-weight: bold; text-align: center;">

单位转换

MigraDoc 使用多种单位;IronPDF页边距使用毫米:

  • "1 厘米" = 10 毫米
  • "1in" = 25.4毫米
  • "72pt" = 25.4毫米
// MigraDoc:
table.AddColumn("3cm");

//IronPDF(CSS):
<th style="width: 3cm;">

渲染模式更改

整个渲染模式会发生变化:

//MigraDocpattern (DELETE):
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

故障排除

问题 1:未找到文档/章节

问题: DocumentSection 类在IronPDF中不存在。

**解决方案:**替换为 HTML 结构:

// MigraDoc
Document document = new Document();
Section section = document.AddSection();

// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);

问题 2:未找到添加段落

问题: AddParagraph() 方法不存在。

**解决方案:**使用 HTML 元素:

// MigraDoc
section.AddParagraph("Hello World");

// IronPDF
"<p>Hello World</p>"

问题 3:未找到 PdfDocumentRenderer

问题: PdfDocumentRenderer 类不存在。

解决方案: 使用 ChromePdfRenderer

// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();

// IronPDF
var renderer = new ChromePdfRenderer();

问题 4:AddPageField 无法工作

问题: AddPageField() 方法不存在。

**解决方法:**使用IronPDF占位符语法:

// MigraDoc
footerPara.AddPageField();

// IronPDF
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    CenterText = "Page {page}"
};

迁移清单

迁移前

  • 找出所有MigraDocusing 语句
  • 文档表格结构(列、行、样式)
  • 注意页眉/页脚内容和页面字段的使用
  • 列出使用 document.Styles 定义的自定义样式
  • 获取IronPDF许可证密钥

软件包变更

  • 移除 PDFsharp-MigraDoc-GDIPDFsharp-MigraDoc-WPF
  • 安装 IronPdf NuGet 包:dotnet add package IronPdf
  • 更新命名空间导入

代码更改

  • 在启动时添加许可证密钥配置
  • 使用 HTML 结构替换 Section
  • AddParagraph() 转换为 HTML <p> 元素
  • Cell 转换为 HTML <table> 结构
  • 使用 {page} 占位符替换 AddPageField()
  • 使用 {total-pages} 占位符替换 AddNumPagesField()
  • Format 属性转换为 CSS 样式
  • 使用 ChromePdfRenderer 替换 PdfDocumentRenderer

测试

  • 对比新旧PDF文件的视觉效果
  • 验证分页符是否正常工作 检查页眉/页脚渲染和页码
  • 检查表格格式和边框
  • 使用复杂的多页文档进行测试

后迁移

  • 删除与MigraDoc相关的文档
  • 更新团队培训材料
  • 记录新的 HTML 模板位置

请注意: MigraDoc 和 PDFSharp 是其各自所有者的注册商标。 本网站与empira Software GmbH无关联,未被其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户