IRONSOFTWAREHOME
VIDÉOS

Comment utiliser une journalisation personnalisée en C#

Curtis Chau
Curtis Chau
Updated: 19 juillet 2026

La migration de fo .NET (FO .NET) vers IronPDF constitue une mise à jour majeure pour votre processus de génération de PDF .NET . Ce guide propose une méthode simple et progressive pour faire évoluer votre code source, passant d'un balisage XSL-FO obsolète à une génération de PDF moderne basée sur HTML/CSS, en utilisant les compétences que possède déjà votre équipe de développement.

Pourquoi migrer d'IronPDF for .NET à IronPDF

Les défis de fo.net

fo.net (FO.NET) est un port C# d'une première version d'Apache FOP qui convertit les documents XSL-FO en PDF. Il est sous licence Apache 2.0 mais présente plusieurs limitations pour le développement actuel :

  1. Technologie obsolète : XSL-FO (Extensible Stylesheet Language Formatting Objects) est une spécification W3C de 2001 ; le W3C a fermé le groupe de travail XSL-FO en 2013 et le langage n'a eu aucun développement supplémentaire.

  2. Courbe d'apprentissage complexe : XSL-FO nécessite un balisage complexe basé sur XML avec des objets de formatage spécialisés (fo:block, fo:table, fo:page-sequence, etc.).

  3. Pas de support HTML/CSS : fo.net ne peut pas rendre HTML ou CSS - vous devez transformer HTML en XSL-FO vous-même (généralement via XSLT).

  4. Abandonné/Non maintenu : Le package Fonet sur nuget.org a été publié pour la dernière fois en avril 2011 (v1.0.0, .NET Framework 2.0). Le fork communautaire Fonet.Standard (.NET Standard 2.0) a été publié pour la dernière fois en mai 2020 (v1.0.5). Le dépôt CodePlex est désactivé et les forks GitHub (prepare/FO.NET, nholik/FO.Net, hahmed/Fo.Net) sont inactifs.

  5. Uniquement pour Windows en pratique : La version héritée Fonet dépend des API System.Drawing (GDI+) qui la limitent effectivement à Windows.

  6. Fonctionnalités modernes limitées : Pas de moteur JavaScript, pas de CSS3 (flexbox/grid), pas de chargement moderne de polices web.

  7. Pas de rendu d'URL : fo .NET ne peut pas afficher directement les pages Web ; une conversion manuelle HTML vers XSL-FO est nécessaire.

Comparaison IronPDF for NET vs IronPDF

Aspectfo.net (FO.NET)IronPDF
Format d'entréeXSL-FO (XML obsolète)HTML/CSS (normes web modernes)
Courbe d'apprentissageSteep (expertise XSL-FO)Douceur (connaissances en HTML/CSS)
EntretienAbandonné (dernière version mai 2020)Entretienactive
Prise en charge de la plate-formeWindows uniquementCross-platform (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+)
Support CSSNoneCSS3 complet (Flexbox, Grid)
JavaScriptNonePrise en charge complète de JavaScript
Rendu d'URLNon pris en chargeIntégré
Caractéristiques modernesLimitéEn-têtes, pieds de page, filigranes, sécurité
DocumentationObsolèteTutoriels complets

Pourquoi le changement a du sens

fo.net a été conçu à l'époque où l'on s'attendait à ce que XSL-FO devienne une norme pour la mise en forme des documents. Cette attente ne s'est jamais concrétisée. HTML/CSS est devenu le format de document universel, alors que XSL-FO est resté une compétence de niche — la plupart des ressources XSL-FO datent de 2005-2010, rendant la maintenance de plus en plus difficile.

IronPDF vous permet d'utiliser les compétences que vous avez déjà pour créer des PDF professionnels sur le .NET moderne.


Avant de commencer

Prérequis

  1. **Environnement .NET :**IronPDF prend en charge .NET Framework 4.6.2+, .NET Core 3.1+ et .NET 5/6/7/8/9+.
  2. Accès à NuGet : assurez-vous de pouvoir installer des packages depuis NuGet.
  3. Clé de licence : Obtenez votre clé de licence IronPDF pour une utilisation en production sur IronPDF

Sauvegarde de votre projet

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

Identifier toutes les utilisations de fo.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

Documentez vos modèles XSL-FO

Avant la migration, répertoriez tous les fichiers XSL-FO et notez-les :

  • Dimensions des pages et marges
  • Polices utilisées
  • Les tableaux et leurs structures
  • En-têtes et pieds de page (fo:static-content)
  • Modèles de numérotation des pages
  • Références d'images

Migration rapide

Étape 1 : Mise à jour des paquets NuGet

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

# Install IronPDF
dotnet add package IronPdf
SHELL

Étape 2 : Mise à jour des espaces de noms

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

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

Étape 3 : Initialisation d'IronPDF

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

Étape 4 : Modèle de conversion de base

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

Référence API complète

Cartographie des espaces de noms

espace de noms fo.netÉquivalent d'IronPDF
FonetIronPdf
Fonet.Render.PdfIronPdf
Fonet.LayoutN/A
Fonet.FoN/A
Fonet.ImageIronPdf

FonetDriver vers ChromePdfRenderer

Méthode FonetDriverÉquivalent d'IronPDF
FonetDriver.Make()new ChromePdfRenderer()
driver.Render(inputStream, outputStream)renderer.RenderHtmlAsPdf(html)
driver.Render(inputFile, outputStream)renderer.RenderHtmlFileAsPdf(path)
driver.BaseDirectoryRenderingOptions.BaseUrl
driver.OnError += handlerTry/catch autour du rendu

Options de rendu (Configuration PDF)

fo.net (Attributs XSL-FO)Options de rendu IronPDF
page-heightPaperSize ou SetCustomPaperSize()
page-widthPaperSize
margin-topMarginTop
margin-bottomMarginBottom
margin-leftMarginLeft
margin-rightMarginRight
reference-orientationPaperOrientation

Guide de conversion XSL-FO vers HTML

Éléments XSL-FO vers HTML/CSS

Le changement fondamental dans cette migration fo.net est la conversion des éléments XSL-FO en leurs équivalents HTML :

Élément XSL-FOÉquivalent HTML/CSS
<fo:root><html>
<fo:layout-master-set>Règle 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>{page} placeholder
<fo:page-number-citation>{total-pages}
<fo:basic-link><a href>

Propriétés XSL-FO vers CSS

Propriété XSL-FOÉquivalent CSSExemple d'application
font-familyfont-familyMême syntaxe
font-sizefont-sizeMême syntaxe
font-weightfont-weightbold, normal, 700
text-aligntext-alignleft, center, right, justify
colorcolorHex, RGB, noms
background-colorbackground-colorMême syntaxe
space-beforemargin-topAvant l'élément
space-aftermargin-bottomAprès l'élément
start-indentmargin-leftRetrait à gauche
keep-togetherpage-break-inside: avoidPrévenir les ruptures
break-before="page"page-break-before: alwaysForcer le saut de page

Exemples de code

Exemple 1 : HTML de base vers PDF

Avant (fo.net avec 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));
    }
}

Après (IronPDF avec 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");
    }
}

L'approche d'IronPDF permet de réduire plus de 25 lignes de balisage XSL-FO à seulement 4 lignes de code C# propre. Pour plus d'options HTML vers PDF, consultez la documentation HTML vers PDF d'IronPDF.

Exemple 2 : PDF avec paramètres personnalisés

Avant (fo.net avec 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));
    }
}

Après (IronPDF avec 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");
    }
}

IronPDF fournit des options de rendu programmatiques au lieu d'intégrer la configuration dans le balisage XML.

Exemple 3 : URL au format PDF

Avant (fo.net - non pris en charge):

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

Après (IronPDF - support intégré):

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

L'URL vers le rendu PDF est l'un des avantages pratiques de cette migration fo.net :IronPDF le gère nativement avec l'exécution JavaScript. En savoir plus sur la conversion d'URL en PDF.

Exemple 4 : En-têtes et pieds de page

Avant (fo.net avec 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

Aprè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
};

IronPDF remplace les définitions complexes de régions XSL-FO par de simples en-têtes et pieds de page HTML.

Exemple 5 : Sécurité des PDF

Avant (fo.net):

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

Aprè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;
}

Considérations de Performance

Réutiliser ChromePdfRenderer

Pour des performances optimales lors de votre migration fo.net, réutilisez l'instance 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;
}

Aide à la conversion d'unités

fo.net XSL-FO utilise différentes unités.IronPDF utilise des millimètres pour les marges. Voici une classe d'aide :

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

Dépannage

Sujet 1 : Différences de taille de page

Problème : La taille des pages PDF semble différente après la migration vers .NET .

Solution : Associer correctement les dimensions de page 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);

Edition 2 : fo:block to HTML Mapping (en anglais)

Problème : Pas sûr de ce que <fo:block> devrait devenir.

Solution : Utilisez un code HTML sémantique approprié :

  • Titres : <h1> à <h6>
  • Paragraphes : <p>
  • Conteneurs génériques : <div>
  • Texte en ligne : <span>

Sujet 3 : Les polices ne correspondent pas

Problème : Les polices d'écriture sont différentes de celles affichées par le fichier .NET .

Solution : Utilisez des polices web ou spécifiez les polices système dans le CSS :

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

Edition 4 : Les numéros de page ne fonctionnent pas

Problème : <fo:page-number/> ne fonctionne pas.

Solution : Utilisez les espaces réservés IronPDF dans les en-têtes/pieds de page :

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

Liste de contrôle de la migration

Pré-migration

  • Cataloguer tous les fichiers de modèles XSL-FO (.fo, .xslfo)
  • Dimensions et marges des pages du document utilisées
  • Noter les configurations d'en-tête/pied de page (fo:static-content)
  • Identifier les structures et le style des tableaux
  • Sauvegarder le projet dans le système de contrôle de version
  • Obtenir une clé de licence IronPDF

Migration de paquets

  • Supprimer le package Fonet ou FO.NET : dotnet remove package Fonet
  • Installer le package IronPdf : dotnet add package IronPdf
  • Mettre à jour les importations de namespace de Fonet à IronPdf
  • Définir la clé de licence IronPDF au démarrage

Migration de code

  • Remplacer FonetDriver.Make() par new ChromePdfRenderer()
  • Remplacer driver.Render() par renderer.RenderHtmlAsPdf()
  • Mettre à jour la sortie du fichier des streams vers pdf.SaveAs()
  • Remplacez les gestionnaires d'événements d'erreur par des blocs try/catch.
  • Convertir fo:static-content en HtmlHeaderFooter
  • Remplacer <fo:page-number/> par {page} placeholder

Essai

  • Comparer l'apparence du résultat aux fichiers PDF .NET d'origine
  • Vérifier les dimensions et les marges de la page
  • Vérifiez les en-têtes et les pieds de page
  • Valider les numéros de page
  • Rendu du tableau de test
  • Vérifier le chargement de l'image

Après la migration

  • Supprimer les fichiers modèles .fo et .xslfo
  • Supprimer le code et les utilitaires liés à fo.net
  • Mise à jour de la documentation

Pour une couverture plus approfondie de la surface IronPDF utilisée ci-dessus, consultez la référence de l'API IronPDF.

Veuillez noter: FO.NET, Fonet, et Apache FOP sont des marques déposées de leurs propriétaires respectifs. Ce site n'est pas affilié, approuvé ou sponsorisé par le projet FO.NET ou la Fondation Apache Software. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.
Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise