Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Wie man von fo.net zu IronPDF migriert

Die Migration von fo.net (FO.NET)zuIronPDFist ein bedeutendes Update für Ihren .NET-PDF-Generierungsprozess. Dieser Leitfaden bietet eine unkomplizierte Schritt-für-Schritt-Anleitung, um Ihre Codebasis von veraltetem XSL-FO-Markup auf moderne HTML/CSS-basierte PDF-Generierung umzustellen und dabei die bereits vorhandenen Fähigkeiten Ihres Entwicklerteams zu nutzen.

Warum von fo.net zuIronPDFmigrieren

Die fo.net-Herausforderungen

fo.net ist ein XSL-FO-zu-PDF-Renderer mit einigen Einschränkungen für die aktuelle Entwicklung:

  1. Veraltete Technologie: XSL-FO (Extensible Stylesheet Language Formatting Objects) ist eine W3C-Spezifikation aus dem Jahr 2001, die seit 2006 nicht mehr aktualisiert wurde und daher weitgehend als veraltet gilt.

  2. Komplexe Lernkurve: XSL-FO erfordert das Erlernen komplizierter XML-basierter Auszeichnungssprachen mit spezialisierten Formatierungsobjekten ( fo:block , fo:table , fo:page-sequence usw.).

  3. Keine HTML/CSS-Unterstützung: fo.net kann weder HTML noch CSS rendern – es erfordert eine manuelle Konvertierung von HTML in XSL-FO-Markup.

  4. Nicht mehr gepflegt: Das ursprüngliche CodePlex-Repository existiert nicht mehr; GitHub-Forks werden nicht mehr aktiv gepflegt.

  5. Nur für Windows: fo.net hat interne Abhängigkeiten von System.Drawing , die die Funktionsfähigkeit unter Linux/macOS verhindern.

  6. Eingeschränkte moderne Funktionen: Keine JavaScript-Unterstützung, kein CSS3, kein Flexbox/Grid, keine modernen Webfonts.

  7. Keine URL-Darstellung: fo.net kann Webseiten nicht direkt darstellen – erfordert eine manuelle HTML-zu-XSL-FO-Konvertierung.

Vergleich zwischen fo.net und IronPDF

Aspekt fo.net (FO.NET) IronPDF
Eingabeformat XSL-FO (veraltetes XML) HTML/CSS (moderne Webstandards)
Lernkurve Steep (XSL-FO-Kenntnisse) Sanft (HTML/CSS-Kenntnisse)
Wartung Nicht gewartet Monatlich aktiv gepflegt
Plattform-Unterstützung Nur für Windows Echt plattformübergreifend (.NET 6/7/8/9/10+)
CSS-Unterstützung Keine Vollständiges CSS3 (Flexbox, Grid)
JavaScript Keine Volle JavaScript-Unterstützung
URL-Rendering Nicht unterstützt Eingebaut
Moderne Merkmale Beschränkt Kopfzeilen, Fußzeilen, Wasserzeichen, Sicherheit
Dokumentation Veraltet Ausführliche Anleitungen

Warum der Wechsel Sinn macht

fo.net wurde entwickelt, als erwartet wurde, dass XSL-FO ein Standard für die Dokumentenformatierung werden würde. Diese Erwartung hat sich nicht erfüllt. HTML/CSS hat sich zum universellen Dokumentenformat entwickelt. Über 98 % der Entwickler kennen HTML/CSS, während weniger als 1 % XSL-FO kennen. Die meisten XSL-FO-Ressourcen stammen aus den Jahren 2005-2010, was die Pflege zunehmend erschwert.

MitIronPDFkönnen Sie Ihre bereits vorhandenen Kenntnisse nutzen, um professionelle PDFs zu erstellen, mit voller Unterstützung für moderne .NET-Versionen, einschließlich .NET 10 und C# 14, die bis 2025 und bis ins Jahr 2026 verfügbar sein werden.


Bevor Sie beginnen

Voraussetzungen

  1. .NET-Umgebung:IronPDFunterstützt .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+
  2. NuGet-Zugriff: Stellen Sie sicher, dass Sie Pakete von NuGet installieren können.
  3. Lizenzschlüssel: Ihren IronPDF-Lizenzschlüssel für die produktive Nutzung erhalten Sie unter ironpdf.com.

Sichern Sie Ihr Projekt

# 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

Alle fo.net-Nutzungen identifizieren

# 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

Dokumentieren Sie Ihre XSL-FO-Vorlagen

Katalogisieren Sie vor der Migration alle XSL-FO-Dateien und notieren Sie sie:

  • Seitenabmessungen und Ränder
  • Verwendete Schriftarten
  • Tabellen und ihre Strukturen
  • Kopf- und Fußzeilen (fo:static-content)
  • Seitennummerierungsmuster
  • Bildreferenzen

Schnellstart Migration

Schritt 1: NuGet-Pakete aktualisieren

# 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

Schritt 2: Namespaces aktualisieren

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

Schritt 3:IronPDFinitialisieren

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

Schritt 4: Grundlegendes Konvertierungsmuster

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

Komplette API-Referenz

Namensraum-Zuordnung

fo.net Namespace IronPDF-Äquivalent Notizen
Fonet IronPdf Haupt-Namensraum
Fonet.Render.Pdf IronPdf PDF-Rendering
Fonet.Layout Nicht anwendbar Das Layout wird mit CSS erstellt
Fonet.Fo Nicht anwendbar Formatierung von Objekten → HTML
Fonet.Image IronPdf Integrierte Bildbearbeitung

FonetDriver zu ChromePdfRenderer

FonetDriver-Methode IronPDF-Äquivalent Notizen
FonetDriver.Make() new ChromePdfRenderer() Renderer erstellen
driver.Render(inputStream, outputStream) renderer.RenderHtmlAsPdf(html) Stream-basiert
driver.Render(inputFile, outputStream) renderer.RenderHtmlFileAsPdf(path) Dateibasiert
driver.BaseDirectory RenderingOptions.BaseUrl Basispfad für Ressourcen
driver.OnError += handler Try/catch um rendern Fehlerbehandlung

RenderingOptions (PDF-Konfiguration)

fo.net (XSL-FO-Attribute) IronPDFRenderingOptionen Notizen
Seitenhöhe Papiergrößeoder SetCustomPaperSize() Abmessungen der Seite
Seiten-Breite Papiergröße Standard oder benutzerdefiniert
margin-top MarginTop In Millimetern
Rand-unten MarginBottom In Millimetern
Margin-left MarginLeft In Millimetern
margin-right MarginRight In Millimetern
Referenz-Orientierung Papierausrichtung Porträt/Landschaft

XSL-FO zu HTML Konvertierungsanleitung

XSL-FO-Elemente in HTML/CSS

Die grundlegende Veränderung bei dieser fo.net-Migration ist die Umwandlung von XSL-FO-Elementen in ihre HTML-Entsprechungen:

XSL-FO-Element HTML/CSS-Äquivalent Notizen
<fo:root> <html> Wurzelelement
<fo:layout-master-set> CSS @page-Regel Seite einrichten
<fo:simple-page-master> CSS @page Definition der Seite
<fo:page-sequence> <body> oder <div> Inhalt der Seite
<fo:flow> <main> oder <div> Hauptinhaltsbereich
<fo:static-content> HtmlHeaderFooter Kopfzeilen/Fußzeilen
<fo:block> <p>, <div>, <h1>-<h6> Blockinhalt
<fo:inline> <span> Inline-Inhalt
<fo:table> <table> Tabellen
<fo:table-row> <tr> Tabellenzeilen
<fo:table-cell> <td>, <th> Tabellenzellen
<fo:list-block> <ul>, <ol> Verzeichnisse
<fo:list-item> <li> Elemente auflisten
<fo:external-graphic> <img> Bilder
<fo:page-number> {Seite} Platzhalter Seitenzahlen
<fo:page-number-citation> {Gesamtseiten} Seiten insgesamt
<fo:basic-link> <a href> Hyperlinks

XSL-FO-Eigenschaften in CSS

XSL-FO-Eigenschaft CSS-Äquivalent Beispiel
font-family font-family Gleiche Syntax
Schriftgröße Schriftgröße Gleiche Syntax
Schriftgewicht Schriftgewicht fett, normal, 700
text-align text-align Links, Mitte, Rechts, Bereinigen
Farbe Farbe Hex, RGB, Namen
Hintergrundfarbe Hintergrundfarbe Gleiche Syntax
Space-before margin-top Vor dem Element
Raum-nach Rand-unten Nach Element
start-indent Margin-left Linker Einzug
Zusammenhalten Page-break-inside: vermeiden Brüche verhindern
break-before="page" Seitenumbruch-vorher: immer Seitenumbruch erzwingen

Beispiele für Code

Beispiel 1: Grundlegendes HTML zu PDF

Vor (fo.net mit 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

Nachher (IronPDF mit 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

Der IronPDF-Ansatz reduziert 25+ Zeilen XSL-FO-Markup auf nur 4 Zeilen sauberen C#-Code. Weitere Optionen für die Umwandlung von HTML in PDF finden Sie in der IronPDF HTML to PDF Dokumentation.

Beispiel 2: PDF mit benutzerdefinierten Einstellungen

Vor (fo.net mit 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

Nachher (IronPDF mit 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 bietet programmatische Rendering-Optionen anstelle der Einbettung der Konfiguration in XML-Markup.

Beispiel 3: URL zu PDF

Vor (fo.net - nicht unterstützt):

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

Nach (IronPDF - integrierte Unterstützung):

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

Die Umwandlung von URLs in PDFs ist einer der wichtigsten Vorteile bei dieser fo.net-Migration.IronPDFerledigt dies nativ mit vollständiger JavaScript-Ausführung. Erfahren Sie mehr über die URL in PDF Konvertierung.

Beispiel 4: Kopf- und Fußzeilen

Vor (fo.net mit 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

Nach (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 ersetzt komplexe XSL-FO-Bereichsdefinitionen durch einfache HTML-Kopf- und -Fußzeilen.

Beispiel 5: PDF-Sicherheit

Vor (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

Nach (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

Erwägungen zur Leistung

Wiederverwendung von ChromePdfRenderer

Für eine optimale Leistung während Ihrer fo.net-Migration sollten Sie die ChromePdfRenderer-Instanz wiederverwenden:

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

Helfer bei der Einheitenumwandlung

fo.net XSL-FO verwendet verschiedene Einheiten.IronPDFverwendet Millimeter für die Ränder. Hier ist eine Hilfsklasse:

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

Fehlerbehebung

Problem 1: Unterschiede in der Seitengröße

Problem: Die PDF-Seitengröße sieht nach der fo.net-Migration anders aus.

Lösung: XSL-FO-Seitendimensionen korrekt zuordnen:

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

Ausgabe 2: fo:block zu HTML Mapping

Problem: Ich bin mir nicht sicher, was<fo:block> sollte werden.

Lösung: Verwenden Sie geeignetes semantisches HTML:

  • Überschriften: <h1> bis <h6>
  • Absätze: <p>
  • Allgemeine Container: <div>
  • Inline-Text: <span>

Problem 3: Nicht übereinstimmende Schriftarten

Problem: Die Schriftarten sehen anders aus als in der fo.net-Ausgabe.

Lösung: Webfonts verwenden oder Systemfonts in CSS angeben:

<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

Ausgabe 4: Nicht funktionierende Seitenzahlen

Problem:<fo:page-number/> Funktioniert nicht.

Lösung: Verwenden Sie IronPDF-Platzhalter in Kopf- und Fußzeilen:

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

Migrations-Checkliste

Vor der Migration

  • Alle XSL-FO-Vorlagendateien ( .fo , .xslfo ) katalogisieren
  • Dokumentseitenabmessungen und -ränder verwendet
  • Beachten Sie die Kopf-/Fußzeilenkonfigurationen ( fo:static-content )
  • Tabellenstrukturen und -styling identifizieren
  • Projekt in der Versionskontrolle sichern
  • IronPDF-Lizenzschlüssel erhalten

Paket-Migration

  • Entfernen Sie Fonetoder FO.NET -Paket: dotnet remove package Fonet
  • Installieren Sie IronPdf-Paket: dotnet add package IronPdf
  • Namespace-Importe von Fonetnach IronPdfaktualisieren
  • IronPDF-Lizenzschlüssel beim Start festlegen

Code-Migration

  • Ersetzen Sie FonetDriver.Make()durch new ChromePdfRenderer()
  • Ersetzen Sie driver.Render() durch renderer.RenderHtmlAsPdf()
  • Aktualisiere die Dateiausgabe von Streams auf pdf.SaveAs()
  • Ersetzen Sie Fehlerbehandlungsroutinen durch try/catch
  • Konvertiere fo:static-content in HtmlHeaderFooter
  • Ersetzen<fo:page-number/> mit {page} Platzhalter

Testen

  • Vergleichen Sie das Erscheinungsbild der Ausgabe mit den originalen fo.net-PDFs.
  • Seitenabmessungen und Ränder überprüfen
  • Überprüfen Sie Kopf- und Fußzeilen
  • Seitenzahlen überprüfen
  • Testtabellenrendering
  • Überprüfen Sie das Laden des Bildes.

Nach der Migration

  • Löschen Sie .fo und .xslfo -Vorlagendateien.
  • Entfernen Sie fo.net-bezogenen Code und Hilfsprogramme.
  • Dokumentation aktualisieren

Referenz](https://ironpdf.com/object-reference/api/).

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen