Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Wie man von fo.net zu IronPDF migriert

Migrieren Sie von fo.net zu IronPDF: Vollständiger C#-Migrationsleitfaden

Die Migration von fo.net (FO.NET)zuIronPDFstellt eine bedeutende Modernisierung Ihres .NET-PDF-Erzeugungsworkflows dar. Dieser Leitfaden bietet einen klaren, schrittweisen Migrationspfad, der Ihre Codebasis von veraltetem XSL-FO-Markup auf moderne HTML/CSS-basierte PDF-Generierung umstellt - und dabei die Fähigkeiten nutzt, die Ihr Entwicklerteam bereits besitzt.

Warum von fo.net zuIronPDFmigrieren

Die fo.net-Herausforderungen

fo.net ist ein XSL-FO-zu-PDF-Renderer, der für die moderne Entwicklung erhebliche Einschränkungen aufweist:

  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 weitgehend als veraltet gilt.

  2. Steile Lernkurve: XSL-FO erfordert das Erlernen von komplexem XML-basiertem Markup mit speziellen Formatierungsobjekten (fo:block, fo:table, fo:page-sequence usw.).

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

  4. Abandoned/Unmaintained: Das ursprüngliche CodePlex-Repository ist nicht mehr existent; GitHub-Forks werden nicht mehr aktiv gepflegt.

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

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

  7. Kein URL-Rendering: fo.net kann Webseiten nicht direkt rendern, sondern erfordert eine manuelle Umwandlung von HTML in XSL-FO.

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 Aufgegeben 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 Umfassende Tutorials

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 Access: Sicherstellen, dass Sie Pakete von NuGet installieren können
  3. Lizenzschlüssel: Beziehen Sie Ihren IronPDF-Lizenzschlüssel für den Produktionseinsatz von 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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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-Seitenabmessungen korrekt abbilden:

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

Ausgabe 2: fo:block zu HTML Mapping

Problem: Ich weiß nicht, was aus <fo:block>werden soll.

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: Verwenden Sie Webfonts oder geben Sie Systemfonts in CSS an:

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

Migrations-Checkliste

Vor der Migration

  • [Katalog aller XSL-FO-Vorlagendateien (.fo, .xslfo)
  • [Verwendete Seitenabmessungen und Ränder des Dokuments
  • [Kopf-/Fußzeilen-Konfigurationen beachten (fo:static-content)
  • [Identifizieren von Tabellenstrukturen und Styling
  • [Projekt in der Versionskontrolle sichern
  • [IronPDF-Lizenzschlüssel erhalten

Paket-Migration

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

Code-Migration

  • [Ersetzen Sie FonetDriver.Make()durch new ChromePdfRenderer()
  • [Ersetzen Sie driver.Render() durch renderer.RenderHtmlAsPdf()
  • [Aktualisieren der Dateiausgabe von Streams zu pdf.SaveAs()
  • [Ersetzen Sie Fehler-Ereignis-Handler durch try/catch
  • [Konvertiere fo:static-content in HtmlHeaderFooter
  • [Ersetze <fo:page-number/> durch {page} Platzhalter

Testing

  • [Vergleichen Sie das Aussehen der Ausgabe mit den originalen fo.net-PDFs
  • [Überprüfen Sie die Seitenabmessungen und -ränder
  • [Kopf- und Fußzeilen prüfen
  • [Seitenzahlen validieren
  • [Rendering der Tabelle testen
  • [Überprüfen Sie das Laden von Bildern

Post-Migration

  • [Löschen von .fo und .xslfo Vorlagendateien
  • [Entfernen von fo.net-bezogenem Code und Dienstprogrammen
  • [Dokumentation aktualisieren

Abschluss

Die Migration von fo.net zuIronPDFmodernisiert Ihren .NET-PDF-Generierungs-Workflow, indem das veraltete XSL-FO-Markup durch HTML/CSS-Fähigkeiten ersetzt wird, über die 98 % der Entwickler bereits verfügen. Die Migration beseitigt die Abhängigkeit von einer nicht mehr verwendeten Bibliothek, bietet plattformübergreifende Unterstützung und ermöglicht den Zugriff auf moderne Funktionen wie JavaScript-Rendering, CSS3-Styling und umfassende PDF-Sicherheit.

Die aktive Wartung vonIronPDFgewährleistet die Kompatibilität mit aktuellen und zukünftigen .NET-Versionen, einschließlich .NET 10 und darüber hinaus. Weitere Anleitungen finden Sie in der vollständigen IronPDF-Dokumentation und API-Referenz.

Sind Sie bereit für Ihre fo.net-Migration? Laden Sie IronPDF herunter und beginnen Sie noch heute mit der Konvertierung Ihrer ersten XSL-FO-Vorlage in HTML.

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