比較

MigraDoc vs IronPDF:技術比較指南

當.NET開發人員需要產生 PDF 文檔時,他們面臨兩種主要方法:使用 MigraDoc 等函式庫以程式設計方式建立文檔,或使用IronPDF等工具進行基於 HTML 的渲染。 本次比較從關鍵技術方面考察了這兩個庫,以幫助開發人員、架構師和技術決策者為其 PDF 生成工作流程選擇合適的方法。

MigraDoc是什麼?

MigraDoc 是一個基於 PDFSharp 建立的開源文件物件模型,以 MIT 授權發布。 該函式庫提供了一個高級抽象層,它使用諸如 TableChart 之類的文字結構概念,以程式設計方式建立文件。

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

這種程序化模型使 MigraDoc 特別適合產生結構化報告、發票或需要在多個頁面上保持一致格式的文件。 然而,這種方法需要學習 MigraDoc 的特定文件模型,而不是使用現有的 Web 開發技能。

IronPDF是什麼?

IronPDF是一個商業化的.NET函式庫,它使用嵌入式 Chromium 渲染引擎將 HTML、CSS 和JavaScript轉換為 PDF 文件。開發人員無需以程式設計方式建立文檔,只需使用熟悉的 Web 技術建立內容,然後IronPDF處理轉換工作即可。

ChromePdfRenderer類別是轉換的主要介面。 開發者將 HTML 字串、文件或 URL 傳遞給渲染方法, IronPDF產生的 PDF 文件能夠完全忠實地還原原始網頁內容,包括 CSS 樣式、網頁字體和 JavaScript 生成的內容。

這種基於 HTML 的方法允許團隊使用現有的 Web 開發技能和設計工具,並有可能在 Web 應用程式和 PDF 輸出之間共用範本。

文件建立範式比較

MigraDoc 和IronPDF的主要區別在於開發人員如何定義文件內容。 這種架構上的差異會影響程式碼的複雜度、學習曲線和樣式靈活性。

特徵MigraDocIronPDF
內容定義程序化(文檔/章節/段落)HTML/CSS
學習曲線Steep(專有 DOM)簡單(網路技能)
造型有限財產完整的 CSS3
JavaScript支援沒有任何完整的 Chromium 執行
表格手動定義列/行HTML <table> 與 CSS
圖表MigraDoc 基本圖表任何JavaScript圖表庫
圖片手動調整尺寸/定位標準 HTML <img>
響應式佈局不支援Flexbox,網格
執照開源軟體(MIT)商業的

MigraDoc 要求開發人員掌握其專有的文件模型。 每種元素類型都有其特定的建立和配置 API。 IronPDF開發人員使用 HTML 元素和 CSS 屬性,這些元素和屬性他們很可能已經在 Web 開發中了解過。

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

程式碼對比揭示了根本性的範式差異。 MigraDoc 需要建立一個 Document,新增一個 Section,新增一個 Paragraph,然後使用 AddFormattedText() 並帶有明確格式化參數。 IronPDF直接接受 HTML,並透過一次方法呼叫將其渲染出來。

對於擁有現有 HTML 範本、電子郵件設計或需要轉換為 PDF 的 Web 內容的團隊,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");
    }
}
$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");
    }
}
$vbLabelText   $csharpLabel

MigraDoc 需要明確建立表格結構:新增具有特定寬度的列、建立行、透過索引存取儲存格以及為每個儲存格新增段落。 對於一個簡單的兩列兩行的表格,這種方法需要 20 多行程式碼。

IronPDF使用 Web 開發人員已經熟悉的標準 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");
    }
}
$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");
    }
}
$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 <p>, <h1>, 等等。
FormattedTextHTML <span>, <strong>, 等等。
TableHTML <table>
RowHTML <tr>
ColumnHTML <col> 或 CSS
CellHTML <td>, <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;
$vbLabelText   $csharpLabel

IronPDF使用 CSS,並提供對完整 CSS3 規範的存取:

/* IronPDF CSS 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 包含基本的圖表功能,但需要現代互動式圖表的團隊可以使用JavaScript庫,如 Chart.js 或 D3 和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";
$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>");
$vbLabelText   $csharpLabel

後續渲染將以全速執行。 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 教學課程,了解基本轉換模式
  3. 探索專業文件版面中的頁首和頁尾
  4. 請查看教程部分以取得更全面的範例。

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

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

對於正在評估 MigraDoc 遷移的組織而言, IronPDF提供了一條通往更簡單的程式碼、更豐富的樣式功能和JavaScript支援的途徑——但代價是商業許可。 這項轉變涉及從程式化文件建置轉向 HTML 模板設計,許多團隊發現這種改變可以降低複雜性,同時提高設計的靈活性。

根據團隊的技能、設計要求和預算限制,對兩種方案進行評估。 了解本比較中概述的架構差異將有助於您做出明智的決定,以滿足您的 PDF 生成需求和開發實踐。