比較

FastReport與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()
    {
        //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 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要求建立AddFormattedText()具有明確的格式參數。 IronPDF直接接受HTML並以單一方法調用進行渲染。

對於有現存HTML模板、電子郵件設計或需轉換的網頁內容的團隊,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需要存取部分的AddPageField()這樣的特殊方法插入頁碼。

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

佔位符語法比較

使用標題和尾部的動態內容時,語法不同:

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使用基於屬性的樣式在文件元素上:

//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 = 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安裝:

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開發相容,針對.NET 10和C# 14開發。

性能考量

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的渲染沒有這種初始化開銷,但可能在進行複雜的CSS布局時較慢,這些是Chromium高效處理的。

做出決策

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

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

考慮使用IronPDF如果:您有現成的HTML/CSS設計要轉換,您的團隊具備網頁開發技能,您需要CSS3的先進樣式,您的文件包含JavaScript生成的內容,比如圖表,或者您想減少文件生成的程式碼複雜性。

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

開始使用 IronPDF

要評估您的 PDF 生成需求的 IronPDF:

  1. 安裝IronPDF NuGet包Install-Package IronPdf
  2. 查看HTML到PDF教程以獲取基本轉換模式
  3. 探索頭部和尾部以獲取專業文件布局
  4. 查看教程部分以獲取全面的範例

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

MigraDoc和IronPDF在.NET應用程式中的PDF生成遵循本質上的不同方法。 MigraDoc提供了一個開源、以程式方式的文件模型,適合於對其特定API感到自在的開發者,以及有簡單樣式需求的專案。 IronPDF提供基於HTML的渲染,利用網頁開發技能並實現複雜的基於CSS的設計。

對於評估MigraDoc遷移的組織,IronPDF提供了一個簡化程式碼、更豐富樣式能力及JavaScript支持的途徑——需要支付商業授權費用。 遷移涉及從程式化文件構造轉向HTML模板設計,這一轉變讓許多團隊發現降低了複雜性,同時增加了設計靈活性。

根據您的團隊技能、設計需求及預算限制評估兩個選項。 了解本比較中概述的架構差異將幫助您做出一個符合您的PDF生成需求及開發實踐的資訊化決策。

請注意MigraDoc和PDFSharp是其各自所有者的註冊商標。 本網站與empira Software GmbH無關,不代表也不受其贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}