如何用 C# 從 MigraDoc 轉移到 IronPDF
從MigraDoc轉移到 IronPDF:完整的 C# 遷移指南。
從MigraDoc轉換到IronPDF可將您的 .NET PDF 工作流程從需要手動逐個元素建構的冗長程式化文件模型轉換為基於HTML/CSS的現代方法,充分利用現有的 Web 開發技能。 本指南為專業的 .NET 開發人員提供了一個全面、循序漸進的轉換路徑,消除了MigraDoc專屬文件物件模型的陡峭學習曲線。
為什麼要從MigraDoc轉移到 IronPDF?
MigraDoc的挑戰
MigraDoc 雖然在程式化 PDF 產生方面功能強大,但卻有一些基本的限制,會影響現代的開發工作流程:
1.不支援 HTML:MigraDoc 不直接支援 HTML。 您必須使用 Document、Section、Paragraph 和表格物件,逐一手動建構文件元素 - 您無法利用現有的HTML/CSS設計。
2.專屬文件模型:MigraDoc 需要學習一個獨特的文件模型,其概念包括 AddSection(), AddParagraph(), AddTable(), AddRow(), 和 AddCell(). 這種陡峭的學習曲線對於具有 Web 開發背景的開發人員而言尤其具有挑戰性。
3.有限的樣式選項:雖然MigraDoc提供強大的文件結構管理功能,但與現代的網頁工具相比,它的樣式設計能力並不強大。 與完整的 CSS3 相比,類似 Format.Font.Size, Format.Font.Bold, 和 Format.Alignment 的屬性是有限的。
4.冗長的程式碼:即使是建立簡單的佈局也需要數十行的程式碼。 一個帶標頭的基本表格可能需要 15-20 行MigraDoc程式碼。
5.不支援 JavaScript:MigraDoc 無法呈現動態內容或執行 JavaScript,因此限制了現代圖表及互動元素的選項。
6.Charts Are Basic:與 Chart.js 或 D3 等現代JavaScript圖表程式庫相比,MigraDoc 的圖表功能相當有限。
MigraDoc與IronPDF的比較
| 特點 | MigraDoc | IronPDF |
|---|---|---|
| 內容定義 | 程式化 (文件/章節/段落) | HTML/CSS |
| 學習曲線 | Steep (專屬 DOM) | 簡易(網路技能) |
| 造型設計 | 屬性有限 | 完整的 CSS3 |
| JavaScript | 無 | 完整的 Chromium 執行 |
| 表格 | 手動定義列/行 | HTML<table>搭配 CSS |
| 圖表 | MigraDoc 基本圖表 | 任何JavaScript圖表庫 |
| 圖片 | 手冊尺寸/定位 | 標準 HTML <img> |
| 回應式佈局 | 不支援 | Flexbox、網格 |
| 許可證 | 開放原始碼 (MIT) | 商業的 |
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個面向未來的基礎,讓開發人員可以使用熟悉的HTML/CSS技能,而無需學習專屬的文件模型。
遷移複雜性評估
按功能估計的工作量
| 特點 | 遷移複雜性 | 筆記 |
|---|---|---|
| 簡單文字 | 非常低 | 段落 → HTML 元素 |
| 表格 | 低 | 表格/行/單元 → HTML <table> |
| 頁首/頁尾 | 低 | Section.Headers → RenderingOptions |
| 風格 | 語言 | 格式屬性 → CSS 類別 |
| 圖片 | 低 | AddImage → HTML <img> |
| 圖表 | 語言 | 需要JavaScript函式庫 |
範式轉移
這次MigraDoc移轉的根本轉變是從 程式化文件建構到 HTML-first渲染:
MigraDoc: Document → AddSection() → AddParagraph() → PdfDocumentRenderer → Save()
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()這種範式的轉變可大幅降低程式碼的複雜度,同時透過 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
dotnet remove package PdfSharp-MigraDoc
dotnet remove package PdfSharp-MigraDoc-GDI
dotnet remove package PDFsharp.MigraDoc.Standard
# Install IronPDF
dotnet add package IronPdf# RemoveMigraDocpackages
dotnet remove package PdfSharp-MigraDoc
dotnet remove package PdfSharp-MigraDoc-GDI
dotnet remove package PDFsharp.MigraDoc.Standard
# 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說明MigraDoc的用法
# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .完整的 API 參考資料
類別對應
| MigraDoc 類別 | IronPdf 同等級產品 | 筆記 |
|---|---|---|
文件 | <代碼>ChromePdfRenderer</代碼 | 使用呈現器,而非文件 |
| <編碼>部分</編碼 | HTML <body> 或 <div> | 結構容器 |
段落 | HTML <p>, <h1> 等。 | 文字元素 |
格式化文字 | HTML <span>, <strong> 等。 | 內嵌格式 |
表格 | HTML <table> | 使用 CSS 設計 |
行 | HTML <tr> | 表列 |
| <編碼>欄位</編碼 | HTML <col> 或 CSS | 欄位造型 |
Cell | HTML <td>, <th> | 表格單元 |
| <代碼>PdfDocumentRenderer</代碼 | <代碼>ChromePdfRenderer</代碼 | 主要呈現器 |
方法對應
| MigraDoc 方法 | IronPdf 同等級產品 | 筆記 |
|---|---|---|
| <編碼>document.AddSection()</編碼 | HTML 結構 | 使用 <div> 或 <section> |
section.AddParagraph(text)。 | <p>text</p> | HTML 段落 |
section.AddTable()。 | <table> | HTML 表格 |
table.AddColumn(width)。 | CSS width 屬性 | <th> 或 <td> 上的樣式 |
| <編碼>table.AddRow()</編碼 | <tr> | HTML 行 |
row.Cells[n].AddParagraph()。 | <td>內容</td>。 | HTML 單元 |
| <編碼>renderer.RenderDocument()</編碼 | RenderHtmlAsPdf(html) | 渲染為 PDF |
| <代碼>pdfDocument.Save(路徑)</代碼 | <代碼>pdf.SaveAs(路徑)</代碼 | 儲存檔案 |
占位符對應(頁首/頁腳)
| MigraDoc 方法 | IronPdf 占位符 | 筆記 |
|---|---|---|
新增頁面欄位()。 | {page} | 目前頁數 |
AddNumPagesField() | {總頁數} | 總頁數 |
新增日期欄位() | <編碼>{日期}</編碼 | 目前日期 |
程式碼遷移範例
範例 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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com本範例說明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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comMigraDoc 表格的建立需要了解 Table, Column, Row, 和Cell的層級結構。 您必須使用 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");
}
}// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page}");
pdf.SaveAs("header-footer.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page}");
pdf.SaveAs("header-footer.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comMigraDoc 的頁首和頁尾需要存取 section.Headers.Primary 和 section.Footers.Primary ,在其中建立段落,使用 AddText() 加入文字,並使用特殊方法如新增頁面欄位()。來處理動態內容。 對齊需要設定 Format.Alignment.
IronPDF 在 PdfDocument 物件上提供了簡單的 AddTextHeader() 和 AddTextFooter() 方法。{page}占位符會自動插入目前的頁碼。 對於更複雜的標題,您可以使用具有完整HTML/CSS支援的 HtmlHeaderFooter 。 有關進階選項,請參閱 headers and footers 文件。
關鍵遷移注意事項
頁碼占位符語法
頁首和頁尾最重要的改變是佔位符語法:
//MigraDocfield methods:
footerPara.AddPageField(); // Current page
footerPara.AddNumPagesField(); // Total pages
//IronPDFplaceholders:
"Page {page} of {total-pages}"//MigraDocfield methods:
footerPara.AddPageField(); // Current page
footerPara.AddNumPagesField(); // Total pages
//IronPDFplaceholders:
"Page {page} of {total-pages}"IRON VB CONVERTER ERROR developers@ironsoftware.com格式屬性轉換為 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:
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;">IRON VB CONVERTER ERROR developers@ironsoftware.com單位轉換
MigraDoc 使用各種單位; IronPdf 頁邊使用毫米:
- "1cm" = 10mm
- "1in" = 25.4mm
- "72pt" = 25.4mm
// MigraDoc:
table.AddColumn("3cm");
//IronPDF(CSS):
<th style="width: 3cm;">// MigraDoc:
table.AddColumn("3cm");
//IronPDF(CSS):
<th style="width: 3cm;">IRON VB CONVERTER ERROR developers@ironsoftware.com渲染模式變更
整個呈現模式會改變:
//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");//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");IRON VB CONVERTER ERROR developers@ironsoftware.com疑難排解
問題 1:找不到文件/章節
問題:Document 和<編碼>部分</編碼類別在IronPDF中並不存在。
解決方案:以 HTML 結構取代:
// MigraDoc
Document document = new Document();
Section section = document.AddSection();
// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);// MigraDoc
Document document = new Document();
Section section = document.AddSection();
// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com問題 2:未找到 AddParagraph。
問題:AddParagraph() 方法不存在。
解決方案:使用 HTML 元素:
// MigraDoc
section.AddParagraph("Hello World");
// IronPDF
"<p>Hello World</p>"// MigraDoc
section.AddParagraph("Hello World");
// IronPDF
"<p>Hello World</p>"IRON VB CONVERTER ERROR developers@ironsoftware.com問題 3:PdfDocumentRenderer 未找到
問題:PdfDocumentRenderer 類不存在。
解決方案:使用ChromePdfRenderer:
// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
// IronPDF
var renderer = new ChromePdfRenderer();// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
// IronPDF
var renderer = new ChromePdfRenderer();IRON VB CONVERTER ERROR developers@ironsoftware.com問題 4:AddPageField 無法運作
問題:AddPageField() 方法不存在。
解決方案:使用 IronPdf 占位符語法:
// MigraDoc
footerPara.AddPageField();
// IronPDF
pdf.AddTextFooter("Page {page}");// MigraDoc
footerPara.AddPageField();
// IronPDF
pdf.AddTextFooter("Page {page}");IRON VB CONVERTER ERROR developers@ironsoftware.com遷移清單
預遷移
- [ ] 識別所有MigraDoc
using語句 - [ ] 文件表格結構(列、行、樣式設定)
- [ ] 注意頁首/頁尾內容和頁面欄位的用法
- [ ] 列出使用
document.Styles定義的自訂樣式 - [ ] 獲得 IronPdf 授權金鑰
套件變更
- [移除
PdfSharp-MigraDoc套件 - [移除
PdfSharp-MigraDoc-GDI套件 - [ ] 安裝
IronPDFNuGet 套件:dotnet add package IronPdf。 - [ ] 更新命名空間匯入
程式碼變更
- [ ] 在啟動時加入授權金鑰組態
- [ ] 將
Document/Section替換為 HTML 結構 - [ ] 將
AddParagraph()轉換為 HTML<p>元件 - [ ] 將
Table/Row/Cell轉換為HTML<table>結構 - [ ] 將
新增頁面欄位()。替換為{page}占位符 - [ ] 將
AddNumPagesField()替換為{總頁數}占位符 - [ ] 將
Format屬性轉換為 CSS 樣式 - [ ] 將<代碼>PdfDocumentRenderer</代碼替換為
ChromePdfRenderer
測試
- [ ] 比較新舊 PDF 的視覺輸出
- [ ] 確認分頁符工作正常
- [ ] 檢查頁首/頁尾渲染和頁碼
- [驗證表格格式和邊界
- [ ] 以複雜的多頁文件進行測試
後遷移
- [ ] 移除MigraDoc相關文件
- [ ] 更新團隊訓練材料
- [ ] 文件新 HTML 模板位置
結論
從MigraDoc轉換到 IronPDF,可以消除MigraDoc專有文件物件模型的陡峭學習曲線,同時提供完整的 CSS3 造型功能。 從程式化的文件建構模式轉變為 HTML 為先的渲染模式,大幅降低了程式碼的複雜度,對於複雜的佈局而言,複雜度通常可降低 80% 或更多。
本次轉換的主要變更如下 1.內容模型:Document/Section/Paragraph → HTML 元素 2.樣式:Format 屬性 → CSS 3.表格:AddTable()/AddRow()/AddColumn() → HTML <table> 4.Placeholders:AddPageField() → {page} 5.渲染器:PdfDocumentRenderer →<代碼>ChromePdfRenderer</代碼。






