IRONSOFTWAREHOME
VÍDEOS

Como usar o registro personalizado em C#

Curtis Chau
Curtis Chau
Updated: 19 de julho de 2026

A migração do fo .NET (FO .NET) para o IronPDF representa uma grande atualização para o seu processo de geração de PDFs em .NET . Este guia oferece um caminho simples e passo a passo para migrar sua base de código da linguagem de marcação XSL-FO obsoleta para a geração moderna de PDFs baseada em HTML/CSS, utilizando as habilidades que sua equipe de desenvolvimento já possui.

Por que migrar do .NET para o IronPDF?

Os desafios do .NET

fo.net (FO.NET) é um port do C# de uma construção inicial do Apache FOP que converte documentos XSL-FO em PDF. É licenciado pelo Apache 2.0, mas tem várias limitações para o desenvolvimento atual:

  1. Tecnologia Obsoleta: XSL-FO (Objetos de Formatação de Linguagem de Folhas de Estilo Extensíveis) é uma especificação W3C de 2001; o W3C fechou o Grupo de Trabalho XSL-FO em 2013 e a linguagem não teve mais desenvolvimento.

  2. Curva de aprendizado complexa: XSL-FO requer marcação complexa baseada em XML com objetos de formatação especializados (fo:block, fo:table, fo:page-sequence, etc.).

  3. Sem Suporte a HTML/CSS: fo.net não pode renderizar HTML ou CSS — você deve transformar HTML em XSL-FO por conta própria (normalmente via XSLT).

  4. Abandonado/Não mantido: O pacote Fonet no nuget.org foi publicado pela última vez em abril de 2011 (v1.0.0, .NET Framework 2.0). O fork da comunidade Fonet.Standard (.NET Standard 2.0) foi publicado pela última vez em maio de 2020 (v1.0.5). O repositório CodePlex está obsoleto e os forks no GitHub (prepare/FO.NET, nholik/FO.Net, hahmed/Fo.Net) estão inativos.

  5. Apenas para Windows na prática: A construção legada Fonet depende de APIs System.Drawing (GDI+) que efetivamente o limitam ao Windows.

  6. Recursos Modernos Limitados: Sem motor JavaScript, sem CSS3 (flexbox/grid), sem carregamento de fontes web modernas.

  7. Sem renderização de URL: o .NET não consegue renderizar páginas da web diretamente — requer conversão manual de HTML para XSL-FO.

Comparação entre .NET e IronPDF

Aspectofo .NET (FO .NET)IronPDF
Formato de entradaXSL-FO (XML desatualizado)HTML/CSS (padrões modernos da web)
Curva de AprendizagemÍngreme (experiência em XSL-FO)Gentil (conhecimento de HTML/CSS)
ManutençãoAbandonado (último lançamento em maio de 2020)Mantido ativamente
Suporte da plataformaSomente para WindowsCross-platform (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+)
Suporte a CSSNoneCSS3 completo (Flexbox, Grid)
JavaScriptNoneSuporte completo aJavaScript
Renderização de URLNão suportadoEmbutido
Características modernasLimitadoCabeçalhos, rodapés, marcas d'água, segurança
DocumentaçãoDesatualizadoTutoriais completos

Por que a mudança faz sentido

O .NET foi projetado quando se esperava que o XSL-FO se tornasse um padrão para formatação de documentos. Essa expectativa nunca se concretizou. HTML/CSS tornou-se o formato universal de documentos, enquanto o XSL-FO permaneceu uma habilidade de nicho — a maioria dos recursos de XSL-FO data de 2005–2010, tornando a manutenção cada vez mais difícil.

IronPDF permite que você use as habilidades que já possui para criar PDFs profissionais no .NET moderno.


Antes de começar

Pré-requisitos

  1. Ambiente .NET : O IronPDF é compatível com .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Certifique-se de que você pode instalar pacotes do NuGet.
  3. Chave de licença: Obtenha sua chave de licença do IronPDF para uso em produção em IronPDF.

Faça backup do seu projeto

# Create a backup branch
git checkout -b pre-ironpdf-migration
git add .
git commit -m "Backup before fo.net to IronPDF migration"
SHELL

Identificar todo o uso de .NET

# Find all fo.net references
grep -r "FonetDriver\|Fonet\|\.fo\"\|xsl-region" --include="*.cs" --include="*.csproj" .

# Find all XSL-FO template files
find . -name "*.fo" -o -name "*.xslfo" -o -name "*xsl-fo*"
SHELL

Documente seus modelos XSL-FO

Antes da migração, catalogue todos os arquivos XSL-FO e anote:

  • Dimensões e margens da página
  • Fontes utilizadas
  • Tabelas e suas estruturas
  • Cabeçalhos e rodapés (fo:static-content)
  • Padrões de numeração de páginas
  • Referências de imagens

Migração de Início Rápido

Passo 1: Atualizar pacotes NuGet

# Remove fo.net package
dotnet remove package Fonet
dotnet remove package FO.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

Etapa 2: Atualizar Namespaces

// Before (fo.net)
using Fonet;
using Fonet.Render.Pdf;
using System.Xml;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;

Etapa 3: Inicializar o IronPDF

// Set license key at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Etapa 4: Padrão de Conversão Básico

// Before (fo.net with XSL-FO)
FonetDriver driver = FonetDriver.Make();
using (FileStream output = new FileStream("output.pdf", FileMode.Create))
{
    driver.Render(new StringReader(xslFoContent), output);
}

// After (IronPDF with HTML)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");

Referência completa da API

Mapeamento de Namespace

para o namespace .NETEquivalente ao IronPDF
FonetIronPdf
Fonet.Render.PdfIronPdf
Fonet.LayoutN / D
Fonet.FoN / D
Fonet.ImageIronPdf

FonetDriver para ChromePdfRenderer

Método FonetDriverEquivalente ao IronPDF
FonetDriver.Make()new ChromePdfRenderer()
driver.Render(inputStream, outputStream)renderer.RenderHtmlAsPdf(html)
driver.Render(inputFile, outputStream)renderer.RenderHtmlFileAsPdf(path)
driver.BaseDirectoryRenderingOptions.BaseUrl
driver.OnError += handlerTente/capture em torno do render

Opções de renderização (Configuração de PDF)

fo .NET (Atributos XSL-FO)Opções de renderização do IronPDF
page-heightPaperSize ou SetCustomPaperSize()
page-widthPaperSize
margin-topMarginTop
margin-bottomMarginBottom
margin-leftMarginLeft
margin-rightMarginRight
reference-orientationPaperOrientation

Guia de conversão de XSL-FO para HTML

Elementos XSL-FO para HTML/CSS

A mudança fundamental nesta migração para o .NET é a conversão dos elementos XSL-FO em seus equivalentes HTML:

Elemento XSL-FOEquivalente em HTML/CSS
<fo:root><html>
<fo:layout-master-set>Regra de CSS @page
<fo:simple-page-master>CSS @page
<fo:page-sequence><body> ou <div>
<fo:flow><main> ou <div>
<fo:static-content>HtmlHeaderFooter
<fo:block><p>, <div>, <h1>-<h6>
<fo:inline><span>
<fo:table><table>
<fo:table-row><tr>
<fo:table-cell><td>, <th>
<fo:list-block><ul>, <ol>
<fo:list-item><li>
<fo:external-graphic><img>
<fo:page-number>Espaço reservado {page}
<fo:page-number-citation>{total-pages}
<fo:basic-link><a href>

Propriedades XSL-FO para CSS

Propriedade XSL-FOEquivalente em CSSExemplo
font-familyfont-familyMesma sintaxe
font-sizefont-sizeMesma sintaxe
font-weightfont-weightbold, normal, 700
text-aligntext-alignleft, center, right, justify
colorcolorHex, RGB, nomes
background-colorbackground-colorMesma sintaxe
space-beforemargin-topElemento anterior
space-aftermargin-bottomApós o elemento
start-indentmargin-leftRecuo à esquerda
keep-togetherpage-break-inside: avoidEvitar pausas
break-before="page"page-break-before: alwaysForçar quebra de página

Exemplos de código

Exemplo 1: HTML básico para PDF

Antes (fo .NET com XSL-FO):

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

class Program
{
    static void Main()
    {
        // fo.net 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));
    }
}

Após (IronPDF com HTML):

// 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");
    }
}

A abordagem IronPDF reduz mais de 25 linhas de marcação XSL-FO para apenas 4 linhas de código C# limpo. Para mais opções de conversão de HTML para PDF, consulte a documentação do IronPDF sobre HTML para PDF .

Exemplo 2: PDF com configurações personalizadas

Antes (fo .NET com XSL-FO):

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

class Program
{
    static void Main()
    {
        // fo.net 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));
    }
}

Após (IronPDF com HTML):

// 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");
    }
}

O IronPDF oferece opções de renderização programática em vez de incorporar a configuração na marcação XML.

Exemplo 3: URL para PDF

Antes (fo .NET - não suportado):

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

class Program
{
    static void Main()
    {
        // fo.net 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 - extremely complex
        throw new System.NotImplementedException();
    }
}

Após (IronPDF - suporte integrado):

// 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");
    }
}

A renderização de URL para PDF é uma das vitórias práticas nesta migração fo.net:IronPDF lida com isso nativamente com execução de JavaScript. Saiba mais sobre a conversão de URL para PDF .

Exemplo 4: Cabeçalhos e Rodapés

Antes (fo .NET com XSL-FO):

<fo:static-content flow-name="xsl-region-before">
    <fo:block text-align="center" font-size="10pt">
        Company Name - Confidential
    </fo:block>
</fo:static-content>

<fo:static-content flow-name="xsl-region-after">
    <fo:block text-align="right" font-size="10pt">
        Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page"/>
    </fo:block>
</fo:static-content>
XML

Após (IronPDF):

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center; font-size:10pt;'>Company Name - Confidential</div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:right; font-size:10pt;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true
};

O IronPDF substitui definições complexas de região XSL-FO por cabeçalhos e rodapés HTML simples.

Exemplo 5: Segurança em PDF

Antes (fo .NET):

// fo.net has very limited PDF security options
// Must use post-processing with another library

Após (IronPDF):

using IronPdf;

public byte[] GenerateSecurePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);

    // Set metadata
    pdf.MetaData.Title = "Confidential Report";
    pdf.MetaData.Author = "Company Name";

    // Password protection
    pdf.SecuritySettings.OwnerPassword = "owner123";
    pdf.SecuritySettings.UserPassword = "user456";

    // Restrict permissions
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
    pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;

    return pdf.BinaryData;
}

Considerações sobre o desempenho

Reutilize o ChromePdfRenderer

Para desempenho ideal durante sua migração fo.net, reutilize a instância ChromePdfRenderer:

// GOOD - Reuse the renderer
public class PdfService
{
    private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

    public byte[] Generate(string html) => _renderer.RenderHtmlAsPdf(html).BinaryData;
}

// BAD - Creating new instance each time
public byte[] GenerateBad(string html)
{
    var renderer = new ChromePdfRenderer();  // Wasteful
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

Auxiliar de Conversão de Unidades

fo .NET XSL-FO usa várias unidades. O IronPDF usa milímetros para as margens. Aqui está uma classe auxiliar:

public static class UnitConverter
{
    public static double InchesToMm(double inches) => inches * 25.4;
    public static double PointsToMm(double points) => points * 0.352778;
    public static double PicasToMm(double picas) => picas * 4.233;
    public static double CmToMm(double cm) => cm * 10;
}

// Usage
renderer.RenderingOptions.MarginTop = UnitConverter.InchesToMm(1);  // 1 inch

Solução de problemas

Problema 1: Diferenças no tamanho das páginas

Problema: O tamanho da página PDF parece diferente após a migração para .NET .

Solução: Mapeie corretamente as dimensões da página XSL-FO:

// XSL-FO: page-height='11in' page-width='8.5in' (Letter)
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;

// XSL-FO: page-height='297mm' page-width='210mm' (A4)
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

// Custom size (in mm)
renderer.RenderingOptions.SetCustomPaperSize(210, 297);

Problema 2: Mapeamento de fo:block para HTML

Problema: Não tem certeza do que <fo:block> deve se tornar.

Solução: Utilize HTML semântico apropriado:

  • Títulos: <h1> até <h6>
  • Parágrafos: <p>
  • Contêineres genéricos: <div>
  • Texto em linha: <span>

Problema 3: Fontes não correspondentes

Problema: As fontes parecem diferentes da saída do .NET .

Solução: Utilize fontes da web ou especifique fontes do sistema em CSS:

<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', Arial, sans-serif; }
</style>
HTML

Problema 4: Números de página não funcionam

Problema: <fo:page-number/> não funciona.

Solução: Utilize marcadores de posição do IronPDF em cabeçalhos/rodapés:

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 15  // mm
};

Lista de verificação para migração

Pré-migração

  • Catalogar todos os arquivos de modelo XSL-FO (.fo, .xslfo)
  • Dimensões e margens da página do documento utilizadas
  • Anotar configurações de cabeçalho/rodapé (fo:static-content)
  • Identificar estruturas e estilos de tabelas
  • Fazer backup do projeto para o controle de versão
  • Obtenha a chave de licença do IronPDF

Migração de Pacotes

  • Remover pacote Fonet ou FO.NET: dotnet remove package Fonet
  • Instalar pacote IronPdf: dotnet add package IronPdf
  • Atualizar importações de namespace de Fonet para IronPdf
  • Defina a chave de licença do IronPDF na inicialização.

Migração de código

  • Substituir FonetDriver.Make() por new ChromePdfRenderer()
  • Substituir driver.Render() por renderer.RenderHtmlAsPdf()
  • Atualizar saída de arquivo de streams para pdf.SaveAs()
  • Substitua os manipuladores de eventos de erro por try/catch.
  • Converter fo:static-content para HtmlHeaderFooter
  • Substituir <fo:page-number/> por espaço reservado {page}

Testando

  • Comparar a aparência da saída com os PDFs originais em .NET
  • Verificar as dimensões e margens da página
  • Verificar cabeçalhos e rodapés
  • Validar números de página
  • Renderização de tabela de teste
  • Verificar carregamento da imagem

Pós-migração

  • Excluir arquivos de modelo .fo e .xslfo
  • Remover código e utilitários relacionados ao fo.net
  • Atualizar documentação

Para uma cobertura mais completa da superfície de IronPDF usada acima, consulte a referência de API do IronPDF.

Observe: FO.NET, Fonet, e Apache FOP são marcas comerciais de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado pelo projeto FO.NET ou pela Apache Software Foundation. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.
Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Artigos relacionados

Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.