MigraDoc vs IronPDF:技術比較指南
當 .NET 開發人員需要產生 PDF 文件時,他們面臨兩種主要方法:使用MigraDoc等函式庫以程式設計方式建立文檔,或使用IronPDF等工具進行基於 HTML 的渲染。 本次比較從關鍵技術方面考察了這兩個庫,以幫助開發人員、架構師和技術決策者為其 PDF 生成工作流程選擇合適的方法。
什麼是 MigraDoc?
MigraDoc 是建構在 PDFSharp 之上的開放原始碼文件物件模型,以 MIT 授權釋出。 該函式庫提供了一個高階抽象層,使用文字處理概念如 Document, Section, Paragraph, Table, 和 Chart 來程式化地建立結構化文件。
MigraDoc 的方法要求開發人員透過程式碼逐個元素建構文件。 每一項內容 - 標題、段落、表格、圖片 - 都必須使用MigraDoc專屬的 API 明確地建立與設定。 然後,函式庫會使用PdfDocumentRenderer類將此文件結構渲染為 PDF 格式。
這種程式化的模式讓MigraDoc特別適合產生結構化的報告、發票或需要在多頁中保持格式一致的文件。 然而,這種方法需要學習MigraDoc的特定文件模型,而不是使用現有的 Web 開發技能。
什麼是 IronPDF?
IronPDF 是一個商用的 .NET 函式庫,可使用內嵌的 Chromium 渲染引擎將 HTML、CSS 和 JavaScript 轉換成 PDF 文件。開發人員不需要以程式化的方式建構文件,而是使用熟悉的網頁技術建立內容,並讓IronPDF處理轉換。
ChromePdfRenderer 類用作轉換的主要介面。 開發人員將 HTML 字串、檔案或 URL 傳送至渲染方法,IronPDF 即會產生完全忠於原始網頁內容的 PDF 文件 - 包括 CSS 定義、網頁字型和 JavaScript 產生的內容。
這種基於 HTML 的方法允許團隊使用現有的 Web 開發技能和設計工具,並有可能在 Web 應用程式和 PDF 輸出之間共用範本。
文件建立範例比較
MigraDoc 和IronPDF的主要區別在於開發者如何定義文件內容。 這種架構上的區別會影響程式碼的複雜性、學習曲線以及造型的靈活性。
| 特點 | MigraDoc | IronPDF |
|---|---|---|
| 內容定義 | 程式化 (文件/章節/段落) | HTML/CSS |
| 學習曲線 | Steep (專屬 DOM) | 簡易(網路技能) |
| 風格 | 屬性有限 | 完整的 CSS3 |
| JavaScript 支援 | 無 | 完整的 Chromium 執行 |
| 表格 | 手動定義列/行 | HTML <table> 搭配 CSS |
| 圖表 | MigraDoc 基本圖表 | 任何 JavaScript 圖表庫 |
| 圖片 | 手冊尺寸/定位 | 標準 HTML <img> |
| 反應式佈局 | 不支援 | Flexbox、網格 |
| 執照 | 開放原始碼 (MIT) | 商業的 |
MigraDoc 要求開發人員掌握其專屬的文件模型。 每種元素類型都有特定的 API 用於建立和設定。IronPDF開發人員使用的 HTML 元素和 CSS 屬性,他們很可能已經在網頁開發中有所了解。
HTML 至 PDF:基本差異
這些函式庫最顯著的區別之一就是 HTML 支援。MigraDoc不直接支援 HTML - 開發人員必須使用 API 手動建立文件結構。
MigraDoc 方法(不支援 HTML):
// 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");
}
}Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.Rendering
Imports System.Diagnostics
Class Program
Shared Sub Main()
' MigraDoc doesn't support HTML directly
' Must manually create document structure
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim paragraph As Paragraph = section.AddParagraph()
paragraph.AddFormattedText("Hello World", TextFormat.Bold)
paragraph.Format.Font.Size = 16
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("output.pdf")
End Sub
End ClassIronPDF 方法(本機 HTML 支援):
// 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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
End Sub
End Class代碼比較揭示了基本範式的差異。MigraDoc要求創建一個 Document, 加入一個 Section, 加入一個 Paragraph, 然後使用 AddFormattedText() 與明確的格式化參數。IronPDF直接接受 HTML,並透過單一方法呼叫進行渲染。
對於擁有現有 HTML 模板、電子郵件設計或需要轉換 PDF 的網頁內容的團隊而言,MigraDoc 需要以程式化的方式重建這些設計。 IronPdf 的 HTML 至 PDF 轉換可直接重複使用現有的網頁內容。
在 PDF 中建立表格
表格是發票、報告和資料匯出等商業文件的常見需求。 兩個函式庫的實作複雜度差異很大。
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");
}
}Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.DocumentObjectModel.Tables
Imports MigraDoc.Rendering
Class Program
Shared Sub Main()
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim table As Table = section.AddTable()
table.Borders.Width = 0.75
Dim column1 As Column = table.AddColumn("3cm")
Dim column2 As Column = table.AddColumn("3cm")
Dim row1 As Row = table.AddRow()
row1.Cells(0).AddParagraph("Name")
row1.Cells(1).AddParagraph("Age")
Dim row2 As Row = table.AddRow()
row2.Cells(0).AddParagraph("John")
row2.Cells(1).AddParagraph("30")
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("table.pdf")
End Sub
End ClassIronPDF 表格創建:
// 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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlTable As String = "
<table border='1'>
<tr><th>Name</th><th>Age</th></tr>
<tr><td>John</td><td>30</td></tr>
</table>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlTable)
pdf.SaveAs("table.pdf")
End Sub
End ClassMigraDoc 要求明確建立表格結構:新增具特定寬度的列、建立行、依索引存取儲存格,以及為每個儲存格新增段落。 對於一個簡單的兩列兩行表格,此方法的行數超過 20 行。
IronPDF 使用網頁開發人員已經熟悉的標準 HTML 表格語法。 CSS 可應用於進階造型,包括邊框、背景、單元格襯墊和反應式佈局。 表格格式化功能可延伸至現代瀏覽器支援的任何 CSS 造型。
頁首與頁尾。
專業文件通常需要在頁首和頁尾加上頁碼、日期或公司品牌。 兩個函式庫都以不同的方式支援此功能。
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");
}
}Imports MigraDoc.DocumentObjectModel
Imports MigraDoc.Rendering
Class Program
Shared Sub Main()
Dim document As New Document()
Dim section As Section = document.AddSection()
' Add header
Dim headerPara As Paragraph = section.Headers.Primary.AddParagraph()
headerPara.AddText("Document Header")
headerPara.Format.Font.Size = 12
headerPara.Format.Alignment = ParagraphAlignment.Center
' Add footer
Dim footerPara As Paragraph = section.Footers.Primary.AddParagraph()
footerPara.AddText("Page ")
footerPara.AddPageField()
footerPara.Format.Alignment = ParagraphAlignment.Center
' Add content
section.AddParagraph("Main content of the document")
Dim pdfRenderer As New PdfDocumentRenderer()
pdfRenderer.Document = document
pdfRenderer.RenderDocument()
pdfRenderer.PdfDocument.Save("header-footer.pdf")
End Sub
End ClassIronPDF 標頭和頁腳:
// 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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>")
pdf.AddTextHeader("Document Header")
pdf.AddTextFooter("Page {page}")
pdf.SaveAs("header-footer.pdf")
End Sub
End ClassMigraDoc 需要存取章節上的 Headers.Primary 和 Footers.Primary 集合,在其中建立段落,並使用新增頁面欄位()。等特殊方法插入頁碼。
IronPDF 提供了一些方便的方法,如 AddTextHeader() 和 AddTextFooter() 等,這些方法可以在 PDF 文件渲染後調用。{page}占位符會自動插入目前的頁碼。IronPDF也透過RenderingOptions.HtmlHeader和RenderingOptions.HtmlFooter屬性支援基於 HTML 的頁首和頁腳,以實現複雜的設計。
占位符語法比較
在頁首和頁尾使用動態內容時,語法有所不同:
| MigraDoc 方法 | IronPdf 占位符 | 目的 |
|---|---|---|
新增頁面欄位()。 | {page} | 目前頁數 |
AddNumPagesField() | {總頁數} | 總頁數 |
新增日期欄位() | {日期} | 目前日期 |
API 設計比較
API 的設計哲學反映了基本的文件製作範例。
類別對應
| MigraDoc 類別 | IronPdf 同等級產品 |
|---|---|
文件 | ChromePdfRenderer |
部分 | HTML <body> 或 <div> |
段落 | HTML <p>, <h1> 等。 |
格式化文字 | HTML <span>, <strong> 等。 |
表格 | HTML <table> |
行 | HTML <tr> |
欄位 | HTML <col> 或 CSS |
Cell | HTML <td>, <th> |
圖片 | HTML <img> |
風格 | CSS 類別或內嵌式樣式 |
頁首頁腳 | RenderingOptions.HtmlHeader/Footer |
頁面設定 | RenderingOptions.* |
PdfDocumentRenderer | ChromePdfRenderer |
樣式比較
MigraDoc 在文件元素上使用基於屬性的樣式:
//MigraDocstyling
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Font.Color = Colors.DarkRed;
paragraph.Format.SpaceBefore = 10;//MigraDocstyling
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Font.Color = Colors.DarkRed;
paragraph.Format.SpaceBefore = 10;' MigraDoc styling
paragraph.Format.Font.Size = 16
paragraph.Format.Font.Bold = True
paragraph.Format.Font.Color = Colors.DarkRed
paragraph.Format.SpaceBefore = 10IronPdf 使用 CSS,提供完整的 CSS3 規格:
/*IronPDFCSS styling */
.heading {
font-size: 16pt;
font-weight: bold;
color: darkred;
margin-top: 10pt;
}CSS 提供的功能是MigraDoc的樣式系統無法比擬的:Flexbox 排版、CSS Grid、透過 @font-face 自訂字型、漸層、陰影、變形和媒體查詢。 對於建立視覺複雜文件的團隊而言,IronPDF 的 CSS 支援可大幅提高設計靈活性。
當團隊考慮從MigraDoc轉移到IronPDF時。
有幾個因素促使團隊評估IronPDF作為MigraDoc的替代方案:
現有HTML/CSS資源:對於擁有現有網頁範本、電子郵件設計或需要轉換為 PDF 格式的樣式內容的組織而言,MigraDoc 需要以程式設計方式重建這些設計。 IronPdf 允許直接轉換現有的 HTML。
Web 開發技能:擁有強大 Web 開發技能但MigraDoc文件模型經驗有限的團隊可以更快地使用IronPDF提高生產力。 學習曲線利用熟悉的HTML/CSS知識,而非要求掌握新的 API。
設計需求:需要複雜視覺設計(現代排版、複雜佈局、漸層、陰影)的項目可能會發現MigraDoc的樣式選項不足。IronPDF完全支援 CSS3,可讓設計符合現代網路美學。
動態內容:使用 JavaScript 產生內容(互動式圖表、計算值、條件渲染元素)的應用程式無法使用MigraDoc的靜態文件模型。IronPDF在渲染之前會透過其 Chromium 引擎執行 JavaScript。
程式碼維護:MigraDoc冗長的 API 可能會導致大量的文檔建構程式碼。 一張複雜的發票可能需要數百行的MigraDoc程式碼,而這些程式碼可以用 HTML 模板和最少的渲染程式碼來取代。
圖表需求:MigraDoc包含基本的圖表功能,但需要現代互動式圖表的團隊可以使用 Chart.js 或 D3 等 JavaScript 函式庫與IronPDF搭配使用。
安裝與設定
兩個函式庫都透過 NuGet 以不同的套件結構安裝:
MigraDoc 安裝:
Install-Package PdfSharp-MigraDoc-GDIInstall-Package PdfSharp-MigraDoc-GDI安裝 IronPdf:
Install-Package IronPdfInstall-Package IronPdfIronPDF 需要在應用程式啟動時設定授權金鑰:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"這兩個函式庫都支援 .NET Framework 4.6.2+ 和 .NET Core 3.1+ / .NET 5+,使其相容於以 .NET 10 和 C# 14 為目標的現代 .NET 開發。
效能考量
IronPdf 會在首次使用時初始化 Chromium 演算引擎,因此會產生啟動延遲 (通常為 1-3 秒)。 對於有延遲啟動需求的應用程式,在應用程式初始化時預熱渲染器可避免此延遲影響面向使用者的作業:
// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html></html>")隨後的渲染會以全速執行。MigraDoc的渲染沒有這種初始化開銷,但對於 Chromium 能有效處理的複雜 CSS 佈局可能會慢一些。
做出決定。
在MigraDoc和IronPDF之間的選擇取決於您的特定需求:
如果您符合以下條件,請考慮使用 MigraDoc:您需要一個無需支付許可費用的開源解決方案,您的團隊已經熟悉MigraDoc的文檔模型,您的文檔樣式要求簡單,並且您正在生成沒有現有 HTML 模板的結構化報告。
如果您有以下情況,請考慮使用 IronPDF:您需要轉換現有的HTML/CSS設計,您的團隊具備 Web 開發技能,您需要使用 CSS3 進行複雜的樣式設置,您的文件包含 JavaScript 生成的內容(如圖表),或者您希望降低文件生成的程式碼複雜度。
對於在 2025 年建立現代 .NET 應用程式並計劃在 2026 年實現的團隊而言,IronPDF 與 Web 技術的契合在 Web 和 PDF 輸出需要一致的設計,或者在使用 Web 設計工具和模板生態系統時提供了優勢。
開始使用 IronPdf
要評估IronPDF是否符合您的 PDF 生成需求:
1.安裝 IronPDF NuGet 套件:Install-Package IronPdf。 2.檢閱 HTML 至 PDF 教程,瞭解基本的轉換模式
- 探索專業文件版面中的頁首和頁尾 4.查看 tutorials 部分,了解全面的示例
IronPDF 文件提供了常見場景的詳細指導,包括URL 到 PDF 的轉換、 Razor 視圖整合和進階渲染選項。
MigraDoc 和IronPDF代表了在 .NET 應用程式中生成 PDF 的基本不同方法。MigraDoc提供開放原始碼、程式化的文件模型,適合熟悉其特定 API 的開發人員,以及有直接造型需求的專案。IronPDF提供基於 HTML 的渲染,可充分利用網頁開發技能,並實現基於 CSS 的複雜設計。
對於評估MigraDoc移轉的組織而言,IronPDF 提供了一條通往更簡單的程式碼、更豐富的樣式設計能力以及 JavaScript 支援的路徑 - 但成本卻是商業授權的費用。 轉型涉及從程式化的文件建構轉換到 HTML 模板設計,許多團隊發現這種轉變可降低複雜度,同時增加設計彈性。
根據您團隊的技能、設計需求和預算限制來評估這兩個選項。 了解本比較中概述的架構差異,將有助於您做出符合 PDF 生成需求和開發實務的明智決策。