比較

FO.NET vs IronPDF for .NET:技術比較指南

FO.NET vs IronPDF:.NET 開發人員的技術比較。

當 .NET 開發人員評估 PDF 生成解決方案時,FO.NET 成為專門用於將 XSL-FO 文件轉換為 PDF 的利基工具。 然而,它依賴於過時的 XSL-FO 語言、缺乏 HTML/CSS 支援,以及棄用的維護狀態,導致許多團隊評估替代方案。 IronPdf 使用大多數開發人員都已熟知的 HTML/CSS 網頁標準,提供現代化的方法,並採用 Chromium 演算引擎和每月主動更新。

本比較針對技術上相關的層面檢視這兩個函式庫,以協助專業開發人員和架構人員針對他們的 .NET PDF 需求做出明智的決定。

瞭解 FO.NET

FO.NET(也稱為 FoNet)是一個開放源碼函式庫,設計用來使用 C# 將 XSL Formatting Object (XSL-FO) 文件轉換成 PDF。 該資料庫在 Apache 2.0 授權下運作,並將 XSL-FO 語言直接映射為 PDF 格式。

FO.NET 使用 FonetDriver 作為其主要類別,藉由 Make() 工廠方法建立驅動程式實體,以及 Render() 方法處理 XSL-FO 輸入串流以產生 PDF 輸出串流。 配置發生在 XSL-FO 標記本身,使用的元素包括 fo:simple-page-masterfo:layout-master-set,以及頁邊空白、頁面大小和字型的格式屬性。

一個重要的限制是,FO.NET 需要 XSL-FO 的知識 - 一種以 XML 為基礎的語言,是 2001 年的 W3C 規格,自 2006 年以來就沒有更新。這個函式庫不支援 HTML 或 CSS,也無法直接呈現網頁。 在現今的技術領域中,XSL-FO 基本上已被視為過時,只有不到 1% 的開發人員擁有相關的專業知識,相比之下,98% 以上的開發人員都知道 HTML/CSS。

CodePlex 原始資源庫已停用,GitHub 分叉也不再積極維護。 FO.NET 內部依賴 System.Drawing,因此無法在 Linux/macOS 上運作,只能在 Windows 上部署。

了解 IronPDF

IronPDF 是一個 .NET PDF 函式庫,使用 HTML/CSS 進行文件造型與排版,充分利用開發中無處不在的網路標準。 該函式庫使用 Chromium 渲染引擎,提供完整的 CSS3 支援,包括 Flexbox 和 Grid 佈局,以及JavaScript執行。

IronPDF 使用 ChromePdfRenderer 作為其主要的渲染類別,而 RenderingOptions 則為頁面大小、邊界、頁首、頁尾以及其他 PDF 設定提供程式化的設定。 該函式庫支援直接 URL 呈現、HTML 字串呈現和 HTML 檔案呈現,產生 PdfDocument 物件,這些物件可以儲存、合併、保全或進一步處理。

IronPdf 每月發佈一次,積極進行維護,支援真正的跨平台部署(Windows、Linux、macOS),並提供全面的說明文件和教學。

架構與技術比較

這些 .NET PDF 函式庫的根本差異在於其輸入格式和技術基礎。

範疇FO.NETIronPDF
輸入格式XSL-FO (過時的 XML)HTML/CSS (現代網路標準)
學習曲線Steep (XSL-FO 專長)溫和 (HTML/CSS 知識)
維護每月積極維護
平台支援僅限 Windows真正的跨平台
CSS 支援完整的 CSS3 (Flexbox、Grid)
JavaScript完整的JavaScript支援
URL 渲染不支援內建
現代功能限額頁眉、頁腳、水印、安全性
說明文件過時的全面的教學

FO.NET 設計時,XSL-FO 可望成為文件格式的標準。 這並沒有發生-HTML/CSS 成為了通用的文件格式。 大多數 XSL-FO 資源都是 2005-2010 年間的,因此越來越難找到最新的資訊或社群支援。

程式碼比較:常見的 PDF 作業

HTML 至 PDF 轉換

最基本的操作展示了 XSL-FO 和 HTML 方法之間的範例差異。

FO.NET:

// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;
using System.Xml;

class Program
{
    static void Main()
    {
        // FoNet requires XSL-FO format, not HTML
        // First convert HTML to XSL-FO (manual process)
        string xslFo = @"<?xml version='1.0' encoding='utf-8'?>
            <fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
                <fo:layout-master-set>
                    <fo:simple-page-master master-name='page'>
                        <fo:region-body/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference='page'>
                    <fo:flow flow-name='xsl-region-body'>
                        <fo:block>Hello World</fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>";

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("output.pdf", FileMode.Create));
    }
}
// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;
using System.Xml;

class Program
{
    static void Main()
    {
        // FoNet requires XSL-FO format, not HTML
        // First convert HTML to XSL-FO (manual process)
        string xslFo = @"<?xml version='1.0' encoding='utf-8'?>
            <fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
                <fo:layout-master-set>
                    <fo:simple-page-master master-name='page'>
                        <fo:region-body/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference='page'>
                    <fo:flow flow-name='xsl-region-body'>
                        <fo:block>Hello World</fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>";

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("output.pdf", FileMode.Create));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<h1>Hello World</h1><p>This is HTML content.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string html = "<h1>Hello World</h1><p>This is HTML content.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

強烈的對比。 FO.NET 要求使用 XML 命名空間聲明、fo:rootfo:layout-master-setfo:simple-page-masterfo:page-sequencefo:flowfo:block 元素的冗長 XSL-FO 標記,所有這些都是在產生一個簡單的 "Hello World "文字之前。 程式碼註解明確指出"FoNet需要XSL-FO格式,而非HTML"。

IronPDF 會建立一個渲染器、傳輸標準的 HTML、渲染成 PDF,並使用開發人員已熟悉的語法來節省簡單的行數。

如需進階的 HTML 呈現選項,請探索 HTML 至 PDF 轉換指南

URL 轉 PDF

將網頁轉換為 PDF 顯示出重要的能力差距。

FO.NET:

// NuGet: Install-Package Fonet
using Fonet;
using System.IO;
using System.Net;

class Program
{
    static void Main()
    {
        // FoNet does not support URL rendering directly
        // Must manually download, convert HTML to XSL-FO, then render
        string url = "https://example.com";
        string html = new WebClient().DownloadString(url);

        // Manual conversion from HTML to XSL-FO required (complex)
        string xslFo = ConvertHtmlToXslFo(html); // Not built-in

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("webpage.pdf", FileMode.Create));
    }

    static string ConvertHtmlToXslFo(string html)
    {
        // Custom implementation required
        throw new System.NotImplementedException();
    }
}
// NuGet: Install-Package Fonet
using Fonet;
using System.IO;
using System.Net;

class Program
{
    static void Main()
    {
        // FoNet does not support URL rendering directly
        // Must manually download, convert HTML to XSL-FO, then render
        string url = "https://example.com";
        string html = new WebClient().DownloadString(url);

        // Manual conversion from HTML to XSL-FO required (complex)
        string xslFo = ConvertHtmlToXslFo(html); // Not built-in

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("webpage.pdf", FileMode.Create));
    }

    static string ConvertHtmlToXslFo(string html)
    {
        // Custom implementation required
        throw new System.NotImplementedException();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

FO.NET 明確不支援 URL 呈現。 程式碼註解說明:"FoNet 不支援 URL 直接渲染 "和 "需要手動將 HTML 轉換為 XSL-FO(複雜)"。ConvertHtmlToXslFo() 方法會產生 NotImplementedException 錯誤,因為這個轉換不是內建的,需要自訂實作。

IronPDF 提供原生 RenderUrlAsPdf() 功能,可在單一方法呼叫中處理 URL 取用、JavaScript 執行和渲染,僅需三行代碼即可實現複雜、未實現的工作流程。

URL to PDF 文件中了解更多關於 URL 渲染的資訊。

具有自訂設定的 PDF 文件

配置頁面尺寸和頁邊空白展示了配置方法的差異。

FO.NET:

// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // FoNet settings are configured in XSL-FO markup
        string xslFo = @"<?xml version='1.0' encoding='utf-8'?>
            <fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
                <fo:layout-master-set>
                    <fo:simple-page-master master-name='A4' 
                        page-height='297mm' page-width='210mm'
                        margin-top='20mm' margin-bottom='20mm'
                        margin-left='25mm' margin-right='25mm'>
                        <fo:region-body/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference='A4'>
                    <fo:flow flow-name='xsl-region-body'>
                        <fo:block font-size='14pt'>Custom PDF</fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>";

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("custom.pdf", FileMode.Create));
    }
}
// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;

class Program
{
    static void Main()
    {
        // FoNet settings are configured in XSL-FO markup
        string xslFo = @"<?xml version='1.0' encoding='utf-8'?>
            <fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format'>
                <fo:layout-master-set>
                    <fo:simple-page-master master-name='A4' 
                        page-height='297mm' page-width='210mm'
                        margin-top='20mm' margin-bottom='20mm'
                        margin-left='25mm' margin-right='25mm'>
                        <fo:region-body/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference='A4'>
                    <fo:flow flow-name='xsl-region-body'>
                        <fo:block font-size='14pt'>Custom PDF</fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>";

        FonetDriver driver = FonetDriver.Make();
        driver.Render(new StringReader(xslFo), 
            new FileStream("custom.pdf", FileMode.Create));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;

        string html = "<h1 style='font-size:14pt'>Custom PDF</h1>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 25;
        renderer.RenderingOptions.MarginRight = 25;

        string html = "<h1 style='font-size:14pt'>Custom PDF</h1>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

FO.NET 中的程式碼註解明確指出:"FoNet 設定在 XSL-FO 標記中配置"。頁面大小、頁邊距離和格式化是以 fo:simple-page-master 上的屬性嵌入 XML 結構中。 這意味著配置與內容交織在一起,以冗長的 XML 格式呈現。

IronPDF 使用程式化的 RenderingOptions 屬性將設定與內容分離。 PaperSize, MarginTop, MarginBottom, MarginLeft, 和MarginRight等設定會在渲染器物件上設定,而內容則保持乾淨的 HTML。

API 對應參考。

對於評估 FO.NET 遷移或比較功能的開發人員而言,此對應會顯示等效的操作:

核心類映射

FO.NETIronPDF筆記
<編碼>FonetDriver.Make()</編碼新的 ChromePdfRenderer()建立呈現器
driver.Render(inputStream,outputStream)renderer.RenderHtmlAsPdf(html)核心渲染
driver.Render(inputFile,outputStream)renderer.RenderHtmlFileAsPdf(path)檔案型
<編碼>driver.BaseDirectory</編碼RenderingOptions.BaseUrl資源的基本路徑
driver.OnError += 處理器圍繞 render 的 Try/catch錯誤處理

XSL-FO 至 RenderingOptions 對應

XSL-FO 屬性IronPdf RenderingOptions筆記
頁高/頁寬紙張大小標準或自訂尺寸
margin-topMarginTop以毫米為單位
margin-bottom邊界底線以毫米為單位
margin-left邊界左側以毫米為單位
<編碼>右邊距</編碼MarginRight以毫米為單位
參考導向紙張方向肖像/風景

XSL-FO 元素到 HTML 的映射

XSL-FO 元件HTML 對應筆記
<fo:root><html>根元素
<fo:layout-master-set>CSS @page 規則頁面設定
<fo:simple-page-master>CSS @page頁面定義
<fo:page-sequence><body><div>頁面內容
<編碼><fo:流程></編碼<main><div>主要內容領域
<fo:static-content><編碼>HtmlHeaderFooter</編碼標題/頁腳
<fo:block><p>, <div>, <h1>-<h6>區塊內容
<fo:table><table>表格
<fo:list-block><ul><ol>清單
<fo:外部圖形><編碼> related to XSL-FO 元素到 HTML 的映射</編碼圖片
<fo:page-number/>{page} 占位符頁數

功能比較摘要

特點FO.NETIronPDF
HTML 至 PDF❌(需要手動 XSL-FO 轉換)
URL 至 PDF❌(不支援)
XSL-FO 至 PDF不適用
CSS3 支持✅ (Flexbox, Grid)
JavaScript
頁首/頁尾XSL-FO 靜態內容基於 HTML
頁面編號<編碼>fo:page-number</編碼{page} 占位符
跨平台❌(僅限 Windows)
主動維護❌(已放棄)✅(每月)

當團隊考慮從 FO.NET 轉移到IronPDF時。

開發團隊評估從 FO.NET 過渡到IronPDF有幾個原因:

過時的技術:XSL-FO 是 2001 年的 W3C 規格,自 2006 年以來就沒有更新,基本上已被視為過時的技術。 大多數資源和文件都是 2005-2010 年間的,使得尋找最新資訊或僱用具備 XSL-FO 專業知識的開發人員變得越來越困難。

陡峭的學習曲線:XSL-FO 需要學習複雜的基於 XML 的標記與專門的格式化物件 (fo:blockfo:tablefo:page-sequence 等)。 知道 XSL-FO 的開發人員不到 1%,而知道 HTML/CSS 的開發人員超過 98%。

不支援 HTML/CSS:FO.NET 無法呈現 HTML 或 CSS - 它需要手動將 HTML 轉換為 XSL-FO 標記,而這並非該函式庫內建的功能。 擁有網頁內容或 HTML 模板的團隊必須執行自訂的轉換邏輯。

Abandoned Maintenance:原始 CodePlex 倉庫已停用,GitHub 分叉也不再積極維護。 不開發安全修補程式、錯誤修正和新功能。

平台限制:FO.NET 內部依賴 System.Drawing,使其無法在 Linux/macOS 上運作,因此只能在僅限 Windows 的環境中部署。 現代應用程式越來越需要跨平台部署。

遺失的現代功能:無JavaScript支援、無 CSS3 功能 (Flexbox、Grid)、無現代網路字型、無直接 URL 呈現功能。

優勢和考慮因素

FO.NET 的優勢

  • Direct XSL-FO Conversion:專為 XSL-FO 轉換為 PDF 而優化
  • 開放原始碼:Apache 2.0 授權可自由使用、修改和散佈
  • 精確控制:XSL-FO 提供詳細的文件排版控制

FO.NET注意事項

  • 過時的技術:XSL-FO 規格自 2006 年起就沒有更新。
  • 需要 XSL-FO 知識:只有少於 1% 的開發人員具備專業知識
  • 無 HTML 支援:無法呈現 HTML 或 CSS 內容
  • 已停用:無活動維護或安全更新
  • 僅限 Windows:System.Drawing 的依賴性阻止跨平台使用
  • 無 URL 渲染功能:無法直接轉換網頁
  • 有限的文件:資源過時

IronPDF的優勢

  • HTML/CSS 標準:使用 98% 以上的開發人員已經熟悉的網路技術
  • 現代化的渲染:完全支援 CSS3 與JavaScript的 Chromium 引擎
  • 主動開發:每月發佈新功能和安全修補程式
  • 跨平台:真正支援 Windows、Linux 和 macOS
  • 直接 URL 渲染:原生 RenderUrlAsPdf() 功能
  • 專業功能:頁首、頁尾、水印、安全性 - 全部內建
  • 全面的資源:廣泛的教學文件

IronPDF注意事項

  • 商業授權:生產使用需要授權
  • Different Paradigm: XSL-FO 模板需要轉換為 HTML

結論

FO.NET 和IronPDF代表了在 .NET 中生成 PDF 的基本不同方法。 FO.NET 服務於 XSL-FO 至 PDF 轉換的利基用例,但其對過時技術的依賴、棄用的維護、僅限於 Windows 的限制,以及缺乏 HTML 支援,使得它越來越難為新專案辯護。

IronPdf 提供使用 HTML/CSS 網路標準的現代方法,符合目前開發人員的技能和技術。 能夠直接呈現 HTML、URL,並使用完整的 CSS3 與 Chromium 引擎,使其適用於當代的 PDF 生成需求。

在組織規劃 .NET 10、C# 14 以及到 2026 年的應用程式開發時,技術基礎非常重要。 維護傳統 XSL-FO 系統的團隊可能會繼續使用 FO.NET,但現代 PDF 生成的前進道路顯然指向IronPDF等基於 HTML 的解決方案,這些解決方案充分利用了現有的網路開發專業知識。

免費試用開始評估 IronPDF,並探索全面的文件,以評估是否適合您的特定需求。