比較

MigraDoc與IronPDF:技術比較指南

當 .NET 開發人員需要生成 PDF 文件時,他們面臨兩種主要方法:使用像 MigraDoc 這樣的程式庫以程式化方式構建文件,或使用像IronPDF這樣的工具基於 HTML 進行渲染。 本比較檢視了這兩個程式庫在關鍵技術層面上的表現,以協助開發人員、架構師和技術決策者選擇適合其 PDF 生成工作流的方法。

MigraDoc 是什麼?

MigraDoc 是一個基於 PDFSharp 構建的開源文檔物件模型,依據 MIT 授權條款分發。 該程式庫提供了一個使用文字處理概念的高級抽象層,如Chart,以程式化方式創建結構化文件。

MigraDoc 的方法要求開發人員透過程式碼逐個構建文件元素。 每個內容元素——標題、段落、表格、圖像——必須使用 MigraDoc 專有的 API 明確創建和配置。 然後,該程式庫使用 PdfDocumentRenderer 類將這個文檔結構渲染為 PDF 格式。

這種程式化模型使得 MigraDoc 特別適合生成結構化報告、發票或需要跨多頁保持一致格式的文件。 然而,這種方法需要學習 MigraDoc 特有的文檔模型,而不能使用現有的網頁開發技能。

什麼是IronPDF?

IronPDF 是一個商業 .NET 程式庫,使用內嵌的 Chromium 渲染引擎將 HTML、CSS 和 JavaScript 轉換為 PDF 文件。開發人員使用熟悉的網頁技術創建內容,由IronPDF處理轉換,而不是程式化地構建文件。

ChromePdfRenderer類是轉換的主要接口。 開發人員將 HTML 字串、文件或 URL 傳遞給渲染方法,IronPDF 則生產與原始網頁內容完全一致的 PDF 文件——包括 CSS 樣式、網頁字體,以及 JavaScript 生成的內容。

這種基於 HTML 的方法允許團隊利用現有的網頁開發技能和設計工具,甚至可以在網頁應用和 PDF 輸出之間共享模板。

文檔創建範式比較

MigraDoc 和IronPDF之間的主要區別在於開發者如何定義文檔內容。 這一架構區別影響到程式碼複雜度、學習曲線和樣式靈活性。

功能MigraDocIronPDF
內容定義程式化 (文件/章節/段落)HTML/CSS
學習曲線簡陋 (專有 DOM)簡單 (網頁技能)
樣式限制的屬性完全支持CSS3
JavaScript支持None完整的 Chromium 執行
表格手動行/列定義HTML <table> 與 CSS
圖表基本的 MigraDoc 圖表任何 JavaScript 圖表程式庫
圖像手動調整大小/定位標準 HTML <img>
響應式佈局不支持Flexbox, Grid
授權開源 (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()
    {
        // MigraDoc doesn'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()
    {
        // MigraDoc doesn'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 Class
$vbLabelText   $csharpLabel

IronPDF 方法 (原生 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
$vbLabelText   $csharpLabel

程式碼比較顯示出基本的範式差異。 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 Class
$vbLabelText   $csharpLabel

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

MigraDoc 需要明確創建表格結構:添加特定寬度的列,創建行,按索引訪問單元格,並向每個單元格添加段落。 這種方法對於一個簡單的兩列兩行表格共需超過 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 Class
$vbLabelText   $csharpLabel

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

MigraDoc 需要訪問章節上的 Headers.PrimaryFooters.Primary 集合,並在其中創建段落,還需使用如 AddPageField() 的特殊方法插入頁碼。

IronPDF 提供了便捷的方法,如 AddTextHeader()AddTextFooter(),可以在渲染後的 PDF 文件上調用。 {page} 佔位符自動插入當前頁碼。IronPDF還支持通過 RenderingOptions.HtmlHeaderRenderingOptions.HtmlFooter 屬性來進行複雜設計的 基於 HTML 的頁眉和頁腳

佔位符語法比較

在頁眉和頁腳中使用動態內容時,語法會有所不同:

MigraDoc 方法IronPDF佔位符目的
AddPageField(){page}當前頁碼
AddNumPagesField(){total-pages}總頁數
AddDateField(){date}當前日期

API設計比較

API 設計哲學反映了基礎文檔創建範式。

類映射

MigraDoc 類IronPDF等效
DocumentChromePdfRenderer
SectionHTML <body><div>
ParagraphHTML <h1>
FormattedTextHTML <strong>
TableHTML <table>
RowHTML <tr>
ColumnHTML <col> 或 CSS
CellHTML <th>
ImageHTML <img>
StyleCSS 類 或 行內樣式
HeadersFootersRenderingOptions.HtmlHeader/Footer
PageSetupRenderingOptions.*
PdfDocumentRendererChromePdfRenderer

樣式比較

MigraDoc 使用基於屬性的樣式來處理文檔元素:

// MigraDoc styling
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 = 10;
' MigraDoc styling
paragraph.Format.Font.Size = 16
paragraph.Format.Font.Bold = True
paragraph.Format.Font.Color = Colors.DarkRed
paragraph.Format.SpaceBefore = 10
$vbLabelText   $csharpLabel

IronPDF 使用 CSS,提供 CSS3 規範的全面訪問:

/*IronPDFCSS styling */
.heading {
    font-size: 16pt;
    font-weight: bold;
    color: darkred;
    margin-top: 10pt;
}

CSS 提供了 MigraDoc 的樣式系統無法匹敵的功能: Flexbox 佈局、CSS 網格、自定義字體通過 @font-face 、漸變、陰影、變換和媒體查詢。 對於構建視覺上複雜文件的團隊來說,IronPDF 的 CSS 支持提供了顯著更多的設計靈活性。

當團隊考慮從 MigraDoc 遷移到IronPDF時

多種因素促使團隊評估IronPDF作為 MigraDoc 的替代方案:

現有的 HTML/CSS 資產:擁有現有網頁模板、郵件設計或需 PDF 轉換的樣式內容的機構發現,MigraDoc 需要以程式化方式重建這些設計。IronPDF允許直接轉換現有的 HTML。

網頁開發技能:網頁開發技能強但在 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-GDI
Install-Package PdfSharp-MigraDoc-GDI
SHELL

IronPDF 安裝:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPDF 在應用程式啟動時需要授權金鑰配置:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

兩個程式庫都支持 .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>")
$vbLabelText   $csharpLabel

隨後的渲染則以全速執行。 MigraDoc 的渲染沒有這種初始化的負擔,但在處理 Chromium 能高效處理的複雜 CSS 佈局時可能較慢。

做出決策

在 MigraDoc 和IronPDF之間的選擇取決於您的具體需求:

考慮使用 MigraDoc 如果:您需要一個沒有授權費用的開源方案,您的團隊已經熟悉 MigraDoc 的文檔模型,您的文檔需要簡單的樣式要求,並且您正在生成沒有現成 HTML 模板的結構化報告。

考慮使用IronPDF如果:您已經有要轉換的 HTML/CSS 設計,您的團隊擁有網頁開發技能,您需要用 CSS3 進行複雜的樣式設計,您的文檔包含 JavaScript 生成的內容,例如圖表,或者您想降低文檔生成的程式碼複雜性。

對於2025年構建現代 .NET 應用程式並計畫向2026年發展的團隊來說,IronPDF 與網頁技術的對齊在網頁和 PDF 輸出需要一致設計,或者在使用網頁設計工具和模板生態系統時提供了優勢。

開始使用IronPDF

要評估IronPDF是否滿足您的PDF生成需求:

  1. 安裝 IronPDF NuGet 套件Install-Package IronPdf
  2. 查看HTML 到 PDF 教學以了解基本轉換模式
  3. 探索頁眉和頁腳以設計專業文件佈局
  4. 檢查 教學部分以獲得全面的範例

IronPDF 文件 提供了常見場景的詳細指南,包括 URL 到 PDF 轉換Razor 視圖整合,以及進階渲染選項。

MigraDoc 和IronPDF代表了 PDF 生成在 .NET 應用程式中根本不同的方法。 MigraDoc 提供了一個開源的、程式化的文檔模型,適合熟悉其特定 API 的開發人員以及有簡單樣式需求的專案。IronPDF提供基於 HTML 的渲染,利用網頁開發技能,並支持複雜的基於 CSS 的設計。

對於評估 MigraDoc 遷移的機構來說,IronPDF 提供了一條途徑,以更簡單的程式碼、更豐富的樣式能力和 JavaScript 支持——需商業授權費用。 轉換涉及從程式化文檔構建到 HTML 模板設計的轉變,許多團隊發現這減少了複雜性,同時提升了設計靈活性。

根據您的團隊技能、設計需求和預算限制,評估這兩個選項。 瞭解本比較中列出的架構差異將幫助您做出一致於您的 PDF 生成需求和開發實踐的知情決定。

{i:(MigraDoc 和 PDFSharp 是其各自所有者的註冊商標。 本網站與 empira Software GmbH 無關,也未經其認可或支持。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供信息之用,並反映撰寫時的公開信息。)}]