Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer d'IronPDF for NET à IronPDF

La migration de fo.net (FO.NET)versIronPDFconstitue 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 est un moteur de rendu XSL-FO vers PDF présentant plusieurs limitations pour le développement actuel :

  1. Technologie obsolète : XSL-FO (Extensible Stylesheet Language Formatting Objects) est une spécification du W3C datant de 2001, sans mise à jour depuis 2006, et est largement considérée comme obsolète.

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

  3. Aucune prise en charge HTML/CSS : fo.net ne peut pas afficher de code HTML ou CSS ; une conversion manuelle du HTML en balisage XSL-FO est nécessaire.

  4. Non maintenu : le dépôt CodePlex d'origine est abandonné ; Les forks GitHub ne sont plus activement maintenus.

  5. Windows uniquement : fo.net a des dépendances internes sur System.Drawing qui l'empêchent de fonctionner sous Linux/macOS.

  6. Fonctionnalités modernes limitées : pas de prise en charge de JavaScript, pas de CSS3, pas de flexbox/grid, pas de polices web modernes.

  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.

ComparaisonIronPDFfor NET vs IronPDF

Aspect fo.net (FO.NET) IronPDF
Format d'entrée XSL-FO (XML obsolète) HTML/CSS (normes web modernes)
Courbe d'apprentissage Steep (expertise XSL-FO) Douceur (connaissances en HTML/CSS)
Entretien Non entretenu Entretienmensuelle active
Prise en charge de la plate-forme Windows uniquement Véritablement multiplateforme (.NET 6/7/8/9/10+)
Support CSS Aucun CSS3 complet (Flexbox, Grid)
JavaScript Aucun Prise en charge complète de JavaScript
Rendu d'URL Non pris en charge Intégré
Caractéristiques modernes Limité En-têtes, pieds de page, filigranes, sécurité
Documentation Obsolète Tutoriels 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, avec plus de 98 % des développeurs connaissant HTML/CSS contre moins de 1 % connaissant XSL-FO. La plupart des ressources XSL-FO datent de 2005-2010, ce qui rend la maintenance de plus en plus difficile.

IronPDF vous permet d'utiliser les compétences que vous possédez déjà pour créer des PDF professionnels, avec une prise en charge complète des versions modernes de .NET, notamment .NET 10 et C# 14, au fur et à mesure de leur disponibilité jusqu'en 2025 et en 2026.


Avant de commencer

Prérequis

  1. Environnement .NET :IronPDFprend 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 licenceIronPDFpour une utilisation en production sur ironpdf.com

Sauvegarde de votre projet

# Create a backup branch
git checkout -b pre-ironpdf-migration
git add .
git commit -m "Backup before fo.net toIronPDFmigration"
# Create a backup branch
git checkout -b pre-ironpdf-migration
git add .
git commit -m "Backup before fo.net toIronPDFmigration"
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*"
# 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
# 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;
// Before (fo.net)
using Fonet;
using Fonet.Render.Pdf;
using System.Xml;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;
$vbLabelText   $csharpLabel

Étape 3 : Initialisation d'IronPDF

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

É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");
// 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");
$vbLabelText   $csharpLabel

Référence API complète

Cartographie des espaces de noms

espace de noms fo.net Équivalent d'IronPDF Notes
Fonet IronPDF Espace de noms principal
Fonet.Render.Pdf IronPDF Rendu PDF
Fonet.Layout N/A Mise en page gérée par CSS
Fonet.Fo N/A Formatage des objets → HTML
Fonet.Image IronPDF Traitement des images intégré

FonetDriver vers ChromePdfRenderer

Méthode FonetDriver Équivalent d'IronPDF Notes
FonetDriver.Make() new ChromePdfRenderer() Créer un moteur de rendu
driver.Render(inputStream, outputStream) renderer.RenderHtmlAsPdf(html) Basé sur le flux
driver.Render(inputFile, outputStream) renderer.RenderHtmlFileAsPdf(path) Basé sur des fichiers
driver.BaseDirectory RenderingOptions.BaseUrl Chemin de base pour les ressources
driver.OnError += handler Try/catch autour du rendu Gestion des erreurs

Options de rendu (Configuration PDF)

fo.net (Attributs XSL-FO) Options de rendu IronPDF Notes
hauteur de la page Taille du papierou SetCustomPaperSize() Dimensions de la page
page-width Taille du papier Standard ou personnalisé
margin-top MarginTop En millimètres
margin-bottom MarginBottom En millimètres
marge-gauche MarginLeft En millimètres
margin-right MarginRight En millimètres
référence-orientation Orientation du papier Portrait/paysage

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 Notes
<fo:root> <html> Élément racine
<fo:layout-master-set> Règle @page CSS Mise en page
<fo:simple-page-master> CSS @page Définition de la page
<fo:page-séquence> <body> ou <div> Contenu de la page
<fo:flow> <main> ou <div> Contenu principal
<fo:static-content> HtmlHeaderFooter En-têtes/pieds de page
<fo:block> <p>, <div>, <h1>-<h6> Contenu du bloc
<fo:inline> <span> Contenu en ligne
<fo:table> <table> Tableaux
<fo:table-row> <tr> Rangées de table
<fo:table-cell> <td>, <th> Cellules de tableau
<fo:list-block> <ul>, <ol> Listes
<fo:list-item> <li> Éléments de la liste
<fo:external-graphic> <img> Images
<fo:page-numéro> {page} placeholder Nombre de pages
<fo:page-number-citation> {total-pages} Nombre total de pages
<fo:basic-link> <a href> Hyperliens

Propriétés XSL-FO vers CSS

Propriété XSL-FO Équivalent CSS Exemple d'application
font-family font-family Même syntaxe
taille de police taille de police Même syntaxe
font-weight font-weight bold, normal, 700
alignement-texte alignement-texte gauche, centre, droite, justifier
color color Hex, RGB, noms
couleur d'arrière-plan couleur d'arrière-plan Même syntaxe
space-before margin-top Avant l'élément
space-after margin-bottom Après l'élément
start-indent marge-gauche Retrait à gauche
maintenir ensemble page-break-inside : éviter Prévenir les ruptures
break-before="page" page-break-before : always Forcer 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));
    }
}
// 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));
    }
}
$vbLabelText   $csharpLabel

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

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));
    }
}
// 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));
    }
}
$vbLabelText   $csharpLabel

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

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

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

Le rendu des URL en PDF est l'un des avantages les plus significatifs de cette migration fo.net.IronPDFgère cela de manière native avec une exécution complète de 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>
<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
};
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
};
$vbLabelText   $csharpLabel

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
// fo.net has very limited PDF security options
// Must use post-processing with another library
$vbLabelText   $csharpLabel

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;
}
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;
}
$vbLabelText   $csharpLabel

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;
}
// 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;
}
$vbLabelText   $csharpLabel

Aide à la conversion d'unités

fo.net XSL-FO utilise différentes unités.IronPDFutilise 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
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
$vbLabelText   $csharpLabel

Dépannage

Sujet 1 : Différences de taille de page

Problème : La taille des pages PDF semble différente après la migration fo.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);
// 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);
$vbLabelText   $csharpLabel

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

Problème : Je ne sais pas quoi<fo:block> devrait devenir.

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

  • Rubriques : <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 fo.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>
<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/> Ça ne marche pas.

Solution : Utilisez les espaces réservésIronPDFdans 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
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 15  // mm
};
$vbLabelText   $csharpLabel

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
  • Notez les configurations d'en-tête/de 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 Fonetou FO.NET : dotnet remove package Fonet
  • Installez le paquet IronPdf : dotnet add package IronPdf
  • Mise à jour des importations d'espace de noms de Fonetvers IronPdf
  • Définir la clé de licenceIronPDFau démarrage

Migration de code

  • Remplacez FonetDriver.Make()par new ChromePdfRenderer()
  • Remplacez driver.Render() par renderer.RenderHtmlAsPdf()
  • Mettre à jour la sortie du fichier des flux 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/> avec l'espace réservé {page}

Essai

  • Comparer l'apparence du document obtenu aux PDF originaux de fo.net
  • 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

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

référence](https://ironpdf.com/object-reference/api/).

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 ...

Lire la suite