Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer d'IronPDF for NET à IronPDF

Migrer d'IronPDF for .NET àIronPDF: Guide complet de migration vers C

La migration de fo.net (FO.NET)versIronPDFreprésente une modernisation significative de votre flux de production de PDF .NET. Ce guide fournit un chemin de migration clair, étape par étape, qui permet à votre base de code de passer d'un balisage XSL-FO obsolète à une génération moderne de PDF basée sur HTML/CSS, en tirant parti des compétences que votre équipe de développement possède déjà.

Pourquoi migrer d'IronPDF for .NET à IronPDF

Les défis de fo.net

fo.net est un moteur de rendu XSL-FO vers PDF qui présente des limites importantes pour le développement moderne :

  1. Technologie obsolète : XSL-FO (Extensible Stylesheet Language Formatting Objects) est une spécification du W3C datant de 2001 qui n'a fait l'objet d'aucune mise à jour depuis 2006 et qui est largement considérée comme obsolète.

  2. Courbe d'apprentissage abrupte : 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. Pas de support HTML/CSS : fo.net ne peut pas rendre HTML ou CSS - il nécessite une conversion manuelle de HTML en balisage XSL-FO.

  4. Abandonné/non maintenu : Le dépôt CodePlex original n'existe plus ; Les forks GitHub ne sont plus activement maintenus.

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

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

  7. Pas de rendu d'URL : fo.net ne peut pas rendre directement les pages web, ce qui nécessite une conversion manuelle de HTML en XSL-FO.

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 Abandonné 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+, .NET 5/6/7/8/9+
  2. NuGet Access : s'assurer que vous pouvez installer des paquets à partir de 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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Dépannage

Sujet 1 : Différences de taille de page

Problème : La taille des pages PDF est différente après la migration vers fo.net.

Solution : Mettez correctement en correspondance les dimensions des pages 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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

Problème : Je ne suis pas sûr de ce que <fo:block>devrait devenir.

Solution : Utilisez le langage 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 sont différentes de la sortie fo.net.

Solution : Utilisez des polices web ou spécifiez des polices système dans 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/> ne fonctionne pas.

Solution : Utilisez des 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
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Liste de contrôle de la migration

Pré-migration

  • [Cataloguer tous les fichiers modèles XSL-FO (.fo, .xslfo)
  • [Dimensions des pages du document et marges utilisées
  • [Configurations de l'en-tête et du pied de page des notes (fo:static-content)
  • [Identifier les structures et le style des tableaux
  • [Sauvegarde du projet dans le contrôle de version
  • [Obtenir la clé de licence IronPDF

Migration de paquets

  • [ ] Supprimer le paquet Fonetou FO.NET : dotnet remove package Fonet
  • [Installer le paquet IronPDF: dotnet add package IronPdf
  • [Mise à jour des importations de l'espace de noms de Fonetvers IronPdf
  • [Définir la clé de licenceIronPDFau démarrage

Migration de code

  • [Remplacer FonetDriver.Make()par new ChromePdfRenderer()
  • [Remplacer driver.Render() par renderer.RenderHtmlAsPdf()
  • [La traduction doit rester professionnelle, en préservant l'exactitude technique tout en expliquant les caractéristiques et les avantages de ces outils de développement
  • [Remplacer les gestionnaires d'événements d'erreur par des try/catch
  • [ ] Convertir fo:static-content en HtmlHeaderFooter
  • [Remplacer <fo:page-number/> par {page}

Testing

  • [Comparer l'apparence de la traduction avec celle des PDF fo.net d'origine
  • [Vérifier les dimensions et les marges des pages
  • [Vérifier les en-têtes et les pieds de page
  • [Valider les numéros de page
  • [Test de rendu de table
  • [Vérifier le chargement de l'image

Post-Migration

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

Conclusion

La migration de fo.net versIronPDFmodernise votre flux de travail de génération de PDF .NET en remplaçant le balisage XSL-FO obsolète par des compétences HTML/CSS que plus de 98 % des développeurs possèdent déjà. La migration élimine la dépendance à l'égard d'une bibliothèque abandonnée, ajoute une prise en charge multiplateforme et permet d'accéder à des fonctionnalités modernes telles que le rendu JavaScript, le style CSS3 et une sécurité PDF complète.

La maintenance active d'IronPDF garantit la compatibilité avec les versions .NET actuelles et futures, y compris .NET 10 et au-delà. Pour obtenir des conseils supplémentaires, explorez la documentation complète IronPDF et référence API.

Prêt à entamer votre migration vers fo.net ? Téléchargez IronPDF et commencez dès aujourd'hui à convertir votre premier modèle XSL-FO en HTML.

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