比较

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 格式化对象(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 和网格布局,以及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、网格)
JavaScript语言完全支持 JavaScript
URL 渲染不支持内置
现代功能有限的页眉、页脚、水印、安全性
文档过时综合教程

设计 FO.NET 时,XSL-FO 正有望成为文档格式化的标准。 但这种情况并没有发生--TML/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()</代码<代码>new ChromePdfRenderer()</ 代码创建呈现器
<代码>driver.Render(inputStream, outputStream)</代码<代码>renderer.RenderHtmlAsPdf(html)</代码核心渲染
<代码>driver.Render(inputFile, outputStream)</代码<代码>renderer.RenderHtmlFileAsPdf(path)</代码基于文件
<代码>driver.BaseDirectory</代码<代码>RenderingOptions.BaseUrl</代码资源的基本路径
<代码>driver.OnError += 处理程序</代码围绕渲染的 Try/catch错误处理

XSL-FO 到 RenderingOptions 映射

XSL-FO 属性IronPdf 渲染选项备注
<代码>页面高度</代码>/<代码>页面宽度</代码<代码>纸张大小</代码标准或定制尺寸
<代码>边框-顶部</代码<代码>页边距</代码单位:毫米
<代码>边距-底部</代码<代码>边距下限</代码单位:毫米
<代码>margin-left</代码<代码>边距左移</代码单位:毫米
<代码>右边距</代码<代码>MarginRight</代码单位:毫米
<代码>参考-导向</代码<代码>文件方向</代码肖像/风景

XSL-FO 元素到 HTML 的映射

XSL-FO 元素HTML 同等内容备注
<代码></代码<html>根元素
<代码><fo:布局主集></代码CSS @page 规则页面设置
<代码></代码CSS @page页面定义
<代码></代码<body><div>页面内容
<代码><fo:流程></代码<main><div>主要内容
<代码><fo:静态内容></代码<代码>HtmlHeaderFooter</代码页眉/页脚
<代码><fo:块></代码<p>, <div>, <h1>-<h6>区块内容
<代码><fo:表格></代码<table>表格
<代码></代码<代码>
    </代码>, <代码>
      </代码
清单
<代码><fo:外部图形></代码<img>图片
<fo:page-number/>{page} 占位符页码

功能对比摘要

特征FO.NETIronPDF
HTML 至 PDF❌(需要手动 XSL-FO 转换)
URL 至 PDF❌(不支持)
XSL-FO 至 PDF不适用
CSS3 支持✅(Flexbox、Grid)
JavaScript
页眉/页脚XSL-FO 静态内容基于 HTML
页码<代码>fo:页码</代码{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 模板的团队必须实施自定义转换逻辑。

放弃维护:CodePlex 的原始版本库已停用,GitHub 的分叉也不再积极维护。 不开发安全补丁、错误修复和新功能。

平台限制:FO.NET 内部依赖 System.Drawing,因此无法在 Linux/macOS 上运行,从而限制了在仅 Windows 环境中的部署。 现代应用程序越来越需要跨平台部署。

缺失的现代功能:不支持 JavaScript,没有 CSS3 功能(Flexbox、Grid),没有现代网络字体,也没有直接 URL 呈现功能。

优势和考虑因素

FO.NET 的优势

  • 直接 XSL-FO 转换:专门针对 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注意事项

  • 商业许可:生产使用需要许可证
  • 不同范例:XSL-FO 模板需要转换为 HTML

结论

FO.NET 和IronPDF代表了在 .NET 中生成 PDF 的根本不同方法。 FO.NET 为 XSL-FO 到 PDF 的转换这一利基用例提供了服务,但其对过时技术的依赖、放弃维护、仅限 Windows 系统以及缺乏 HTML 支持等问题使其越来越难以满足新项目的需要。

IronPdf 提供了一种使用 HTML/CSS 网络标准的现代方法,与当前开发人员的技能和技术保持一致。 Chromium 引擎能够直接呈现 HTML、URL 并使用完整的 CSS3,这使得它能够满足现代 PDF 生成的要求。

随着企业对 .NET 10、C# 14 以及 2026 年之前的应用开发进行规划,技术基础至关重要。 维护传统 XSL-FO 系统的团队可以继续使用 FO.NET,但现代 PDF 生成的发展方向显然是基于 HTML 的解决方案,如 IronPDF,这些解决方案可以利用现有的网络开发专业知识。

通过免费试用开始评估 IronPDF,并浏览全面的文档以评估是否适合您的特定需求。