COMPARACIóN

FO.NET frente a IronPDF: Guía de comparación técnica

FO.NET vs IronPDF: Una comparación técnica para desarrolladores .NET

Cuando los desarrolladores .NET evalúan soluciones de generación de PDF, FO.NET surge como una herramienta de nicho diseñada específicamente para convertir documentos XSL-FO a PDF. Sin embargo, su dependencia del obsoleto lenguaje XSL-FO, la falta de compatibilidad con HTML/CSS y su estado de mantenimiento abandonado llevan a muchos equipos a evaluar alternativas.IronPDFofrece un enfoque moderno utilizando estándares web HTML/CSS que la mayoría de los desarrolladores ya conocen, con un motor de renderizado Chromium y actualizaciones mensuales activas.

Esta comparación examina ambas bibliotecas en dimensiones técnicamente relevantes para ayudar a los desarrolladores profesionales y arquitectos a tomar decisiones informadas para sus requisitos de .NET PDF.

Entendiendo FO.NET

FO.NET (también conocida como FoNet) es una biblioteca de código abierto diseñada para convertir documentos XSL Formatting Object (XSL-FO) en PDF utilizando C#. La biblioteca opera bajo la licencia Apache 2.0 y mapea el lenguaje XSL-FO directamente al formato PDF.

FO.NET utiliza FonetDriver como clase principal, con el método de fábrica Make() que crea instancias del controlador y los métodos Render() que procesan flujos de entrada XSL-FO para producir flujos de salida PDF. La configuración se realiza dentro del propio marcado XSL-FO mediante elementos como fo:simple-page-master, fo:layout-master-set y atributos de formato para márgenes, tamaños de página y fuentes.

Una limitación crítica es que FO.NET requiere conocimientos de XSL-FO, un lenguaje basado en XML que es una especificación del W3C de 2001 sin actualizaciones desde 2006. La biblioteca no soporta HTML ni CSS, y no puede renderizar directamente páginas web. XSL-FO se considera en gran medida obsoleto en el panorama tecnológico actual, ya que menos del 1% de los desarrolladores tienen experiencia en él, en comparación con el 98% que conoce HTML/CSS.

El repositorio original de CodePlex ya no existe y las bifurcaciones de GitHub ya no se mantienen de forma activa. FO.NET tiene dependencias internas de System.Drawing que le impiden funcionar en Linux/macOS, lo que limita su despliegue a Windows.

Entendiendo IronPDF

IronPDF es una biblioteca PDF .NET que utiliza HTML/CSS para el estilo y el diseño de los documentos, aprovechando los estándares web omnipresentes en el desarrollo. La biblioteca utiliza un motor de renderizado Chromium, que proporciona compatibilidad completa con CSS3, incluidos los diseños Flexbox y Grid, además de ejecución de JavaScript.

IronPDF utiliza ChromePdfRenderer como su clase de renderizado principal, con RenderingOptions que proporciona configuración programática para el tamaño de página, márgenes, encabezados, pies de página y otros ajustes de PDF. La biblioteca admite la representación directa de URL, cadenas HTML y archivos HTML, y produce objetos PdfDocument que se pueden guardar, combinar, proteger o manipular.

IronPDF se mantiene de forma activa con versiones mensuales, admite una verdadera implementación multiplataforma (Windows, Linux, macOS) y proporciona documentación y tutoriales completos.

Comparación de arquitecturas y tecnologías

La diferencia fundamental entre estas bibliotecas PDF .NET radica en su formato de entrada y su base tecnológica.

AspectoFO.NETIronPDF
Formato de entradaXSL-FO (XML obsoleto)HTML/CSS (estándares web modernos)
Curva de aprendizajeSteep (conocimientos de XSL-FO)Suave (conocimientos de HTML/CSS)
MantenimientoAbandonadoMantenimiento activo mensual
Soporte de PlataformaSólo para WindowsAuténtica multiplataforma
Soporte CSSNingunoCSS3 completo (Flexbox, Grid)
JavaScriptNingunoCompatibilidad total con JavaScript
Renderización de URLNo soportadoIncorporado en
Características modernasLimitadoEncabezados, pies de página, marcas de agua, seguridad
DocumentaciónDesactualizadoTutoriales completos

FO.NET se diseñó cuando se esperaba que XSL-FO se convirtiera en un estándar para el formato de documentos. Eso no ocurrió: HTML/CSS se convirtió en el formato de documento universal. La mayoría de los recursos de XSL-FO son de 2005-2010, por lo que cada vez es más difícil encontrar información actualizada o apoyo de la comunidad.

Comparación de códigos: Operaciones comunes en PDF

Conversión de HTML a PDF

La operación más fundamental demuestra la diferencia de paradigma entre los enfoques XSL-FO y 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

El contraste es evidente. FO.NET requiere un marcado XSL-FO prolijo con declaraciones de espacio de nombres XML, elementos fo:root, fo:layout-master-set, fo:simple-page-master, fo:page-sequence, fo:flow y fo:block, todo ello antes de producir un simple texto "Hello World". El comentario del código señala explícitamente: "FoNet requiere el formato XSL-FO, no HTML"

IronPDF crea un renderizador, pasa HTML estándar, renderiza a PDF y guarda cuatro líneas sencillas utilizando sintaxis que los desarrolladores ya conocen.

Para conocer las opciones avanzadas de conversión de HTML, consulte la Guía de conversión de HTML a PDF.

Conversión de URL a PDF

La conversión de páginas web a PDF revela una brecha de capacidad crítica.

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 no admite explícitamente la representación de URL. Los comentarios del código dicen: "FoNet no admite la renderización de URL directamente" y "Se requiere conversión manual de HTML a XSL-FO (compleja)" El método ConvertHtmlToXslFo() lanza una NotImplementedException porque esta conversión no está incorporada y requeriría una implementación personalizada.

IronPDF proporciona la funcionalidad nativa RenderUrlAsPdf() que gestiona la obtención de URL, la ejecución de JavaScripty la renderización en una única llamada a un método, tres líneas de código frente a un flujo de trabajo complejo y sin implementar.

Más información sobre la conversión de URL en la documentación URL a PDF.

PDF con ajustes personalizados

La configuración de las dimensiones y los márgenes de las páginas muestra las diferencias en el enfoque de configuración.

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

El comentario de código en FO.NET dice explícitamente: "Los ajustes de FoNet se configuran en el marcado XSL-FO" El tamaño de página, los márgenes y el formato están incrustados dentro de la estructura XML como atributos en fo:simple-page-master. Esto significa que la configuración se entrelaza con el contenido en un formato XML prolijo.

IronPDF separa la configuración del contenido mediante propiedades programáticas RenderingOptions. Ajustes como PaperSize, MarginTop, MarginBottom, MarginLeft, y MargenDerechose establecen en el objeto renderizador, mientras que el contenido sigue siendo HTML limpio.

Referencia de mapeo de API

Para los desarrolladores que estén evaluando la migración a FO.NET o comparando capacidades, este mapeo muestra operaciones equivalentes:

Mapeo de clases principales

FO.NETIronPDFNotas
<código>FonetDriver.Make()</código<código>new ChromePdfRenderer()</códigoCrear renderizador
<código>driver.Render(inputStream, outputStream)</códigorenderer.RenderHtmlAsPdf(html)Traducción básica
<código>driver.Render(inputFile, outputStream)</código<código>renderer.RenderHtmlFileAsPdf(ruta)</códigoBasado en archivos
driver.BaseDirectory<código>RenderingOptions.BaseUrl</códigoRuta base de los recursos
driver.OnError += handlerTry/catch alrededor de renderTratamiento de errores

Mapeo de XSL-FO a RenderingOptions

Atributo XSL-FOOpciones de renderizado de IronPDFNotas
altura de página/anchura de página<código>TamañoDePapel</códigoTamaños estándar o personalizados
margin-top<código>MarginTop</códigoEn milímetros
margin-bottomMargenInferiorEn milímetros
margen-izquierdaMargenIzquierdoEn milímetros
margen-derechaMargenDerechoEn milímetros
orientación a referenciasOrientación del documentoRetrato/Paisaje

Mapeo de elementos XSL-FO a HTML

Elemento XSL-FOEquivalente en HTMLNotas
<código></código><código></código>Elemento raíz
<fo:layout-master-set>Regla CSS @pageConfiguración de la página
<código></código>CSS @pageDefinición de la página
<código></código><código></código> o <código>
</código>
Contenido de la página
<código></código><main> o <div>Contenido principal
<código></código><código>HtmlHeaderFooter</códigoEncabezados/pies de página
<código></código><p>, <div>, <h1>-<h6>Contenido del bloque
<código></código><código></código>Tablas
<código></código><ul>, <ol>Listas
<código><fo:gráfico externo></código><código> related to Mapeo de elementos XSL-FO a HTML</código>Imágenes
<fo:page-number/>{page} marcador de posiciónNúmeros de página

Resumen comparativo de características

CaracterísticaFO.NETIronPDF
HTML a PDF❌(requiere conversión manual XSL-FO)
URL a PDF❌(no compatible)
XSL-FO a PDFN/A
Compatibilidad con CSS3✅(Flexbox, Grid)
JavaScript
Encabezados/pies de páginaContenido estático XSL-FOBasado en HTML
Numeración de páginasfo:page-number{page} marcador de posición
Multiplataforma❌(solo Windows)
Mantenimiento activo❌(abandonado)✅(mensual)

Cuándo los equipos consideran cambiar de FO.NET a IronPDF

Los equipos de desarrollo evalúan la transición de FO.NET aIronPDFpor varias razones:

Tecnología obsoleta: XSL-FO es una especificación del W3C de 2001 que no se ha actualizado desde 2006 y se considera en gran medida obsoleta. La mayoría de los recursos y la documentación son de 2005-2010, lo que hace cada vez más difícil encontrar información actualizada o contratar desarrolladores con experiencia en XSL-FO.

Curva de aprendizaje pronunciada: XSL-FO requiere aprender un complejo marcado basado en XML con objetos de formato especializados (fo:block, fo:table, fo:page-sequence, etc.). Menos del 1% de los desarrolladores conocen XSL-FO, frente a más del 98% que conocen HTML/CSS.

Sin soporte HTML/CSS: FO.NET no puede renderizar HTML o CSS - requiere conversión manual de HTML a marcado XSL-FO, que no está incorporado en la biblioteca. Los equipos con contenido web o plantillas HTML deben implementar una lógica de conversión personalizada.

Mantenimiento abandonado: El repositorio original de CodePlex ha desaparecido y las bifurcaciones de GitHub ya no se mantienen de forma activa. No se desarrollan parches de seguridad, correcciones de errores ni nuevas funciones.

Limitaciones de la plataforma: FO.NET tiene dependencias internas de System.Drawing que le impiden funcionar en Linux/macOS, lo que limita su despliegue a entornos exclusivamente Windows. Las aplicaciones modernas requieren cada vez más el despliegue multiplataforma.

Características modernas que faltan: No es compatible con JavaScript, no tiene características CSS3 (Flexbox, Grid), no tiene fuentes web modernas y no tiene capacidad de renderización directa de URL.

Fuerzas y consideraciones

Fuertes de .NET

  • Conversión directa XSL-FO: Optimizado específicamente para la conversión de XSL-FO a PDF
  • Código abierto: Licencia Apache 2.0-libre de uso, modificación y distribución
  • Control preciso: XSL-FO proporciona un control detallado sobre el diseño del documento

Consideraciones sobre .NET

  • Tecnología obsoleta: La especificación XSL-FO no tiene actualizaciones desde 2006
  • Requiere conocimientos de XSL-FO: Menos del 1% de los desarrolladores tienen conocimientos
  • Sin soporte HTML: No puede renderizar contenido HTML o CSS
  • Abandonado: Sin mantenimiento activo ni actualizaciones de seguridad
  • Sólo Windows: las dependencias de System.Drawing impiden el uso multiplataforma
  • Sin renderización de URL: No se pueden convertir directamente páginas web
  • Documentación Limitada: Los recursos están desactualizados

Puntos fuertes de IronPDF

  • Estándar HTML/CSS: Utiliza tecnologías web que más del 98% de los desarrolladores ya conoce
  • Renderizado moderno: Motor Chromium con soporte completo de CSS3 y JavaScript
  • Desarrollo activo: Lanzamientos mensuales con nuevas características y parches de seguridad
  • Cross-Platform: Compatibilidad real con Windows, Linux y macOS
  • Renderización directa de URL: Capacidad nativa RenderUrlAsPdf()
  • Características profesionales: Encabezados, pies de página, marcas de agua, seguridad, todo integrado
  • Recursos completos: tutoriales y documentación exhaustivos

Consideraciones sobre IronPDF

  • Licencia comercial: Requiere licencia para su uso en producción
  • Diferente paradigma: las plantillas XSL-FO necesitan conversión a HTML

Conclusión

FO.NET yIronPDFrepresentan enfoques fundamentalmente diferentes para la generación de PDF en .NET. FO.NET sirve para el nicho de uso de la conversión de XSL-FO a PDF, pero su dependencia de tecnología obsoleta, mantenimiento abandonado, limitación a Windows y falta de compatibilidad con HTML hacen que sea cada vez más difícil de justificar para nuevos proyectos.

IronPDF ofrece un enfoque moderno mediante el uso de estándares web HTML/CSS que se ajusta a las habilidades y tecnologías actuales de los desarrolladores. La capacidad de renderizar directamente HTML, URL y utilizar CSS3 completo con un motor Chromium lo hace adecuado para los requisitos contemporáneos de generación de PDF.

A medida que las organizaciones planifican .NET 10, C# 14 y el desarrollo de aplicaciones hasta 2026, la base tecnológica es importante. Los equipos que mantienen sistemas XSL-FO heredados pueden seguir utilizando FO.NET, pero el camino a seguir para la generación moderna de PDF apunta claramente hacia soluciones basadas en HTML comoIronPDFque aprovechan la experiencia existente en desarrollo web.

Comience a evaluarIronPDFcon una prueba gratuita y explore la documentación exhaustiva para evaluar si se adapta a sus requisitos específicos.