Wie man von fo.net zu IronPDF migriert
Die Migration von fo .NET (FO .NET) zuIronPDF ist ein wichtiges 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 zuIronPDF migrieren
Die fo.net-Herausforderungen
.NET ist ein XSL-FO-zu-PDF-Renderer mit einigen Einschränkungen für die aktuelle Entwicklung:
-
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.
-
Komplexe Lernkurve: XSL-FO erfordert das Erlernen komplizierter XML-basierter Auszeichnungssprachen mit spezialisierten Formatierungsobjekten (
fo:block,fo:table,fo:page-sequence, etc.). -
Keine HTML/CSS-Unterstützung: fo .NET kann weder HTML noch CSS rendern – es erfordert eine manuelle Konvertierung von HTML in XSL-FO-Markup.
-
Nicht mehr gepflegt: Das ursprüngliche CodePlex-Repository existiert nicht mehr; GitHub-Forks werden nicht mehr aktiv gepflegt.
-
Nur für Windows: fo .NET hat interne Abhängigkeiten von
System.Drawing, die verhindern, dass es unter Linux/macOS funktioniert. -
Eingeschränkte moderne Funktionen: Keine JavaScriptUnterstützung, kein CSS3, kein Flexbox/Grid, keine modernen Webfonts.
- 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.
MitIronPDF kö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
- .NET Umgebung:IronPDF unterstützt .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+
- NuGet -Zugriff: Stellen Sie sicher, dass Sie Pakete von NuGet installieren können.
- Lizenzschlüssel: IhrenIronPDF Lizenzschlüssel für die produktive Nutzung erhalten Sie unter IronPDF.
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"
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*"
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
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;
Imports IronPdf
Imports IronPdf.Rendering
Schritt 3:IronPDF initialisieren
// Set license key at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Set license key at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Set license key at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
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");
Imports System.IO
Imports Fonet
Imports IronPdf
' Before (fo.net with XSL-FO)
Dim driver As FonetDriver = FonetDriver.Make()
Using output As FileStream = New FileStream("output.pdf", FileMode.Create)
driver.Render(New StringReader(xslFoContent), output)
End Using
' After (IronPDF with HTML)
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Komplette API-Referenz
Namensraum-Zuordnung
| fo.net Namespace | IronPDF-Äquivalent |
|---|---|
Fonet |
IronPdf |
Fonet.Render.Pdf |
IronPdf |
Fonet.Layout |
Nicht anwendbar |
Fonet.Fo |
Nicht anwendbar |
Fonet.Image |
IronPdf |
FonetDriver zu ChromePdfRenderer
| FonetDriver-Methode | IronPDF-Äquivalent |
|---|---|
FonetDriver.Make() |
new ChromePdfRenderer() |
driver.Render(inputStream, outputStream) |
renderer.RenderHtmlAsPdf(html) |
driver.Render(inputFile, outputStream) |
renderer.RenderHtmlFileAsPdf(path) |
driver.BaseDirectory |
RenderingOptions.BaseUrl |
driver.OnError += handler |
Try/catch um rendern |
RenderingOptions (PDF-Konfiguration)
| fo.net (XSL-FO-Attribute) | IronPDF RenderingOptionen |
|---|---|
page-height |
PaperSize oder SetCustomPaperSize() |
page-width |
PaperSize |
margin-top |
MarginTop |
margin-bottom |
MarginBottom |
margin-left |
MarginLeft |
margin-right |
MarginRight |
reference-orientation |
PaperOrientation |
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 |
|---|---|
<fo:root> |
<html> |
<fo:layout-master-set> |
CSS @page Regel |
<fo:simple-page-master> |
CSS @page |
<fo:page-sequence> |
<body> oder <div> |
<fo:flow> |
<main> oder <div> |
<fo:static-content> |
HtmlHeaderFooter |
<fo:block> |
<p>, <div>, <h1>-<h6> |
<fo:inline> |
<span> |
<fo:table> |
<table> |
<fo:table-row> |
<tr> |
<fo:table-cell> |
<td>, <th> |
<fo:list-block> |
<ul>, <ol> |
<fo:list-item> |
<li> |
<fo:external-graphic> |
<img> |
<fo:page-number> |
{page} Platzhalter |
<fo:page-number-citation> |
{total-pages} |
<fo:basic-link> |
<a href> |
XSL-FO-Eigenschaften in CSS
| XSL-FO-Eigenschaft | CSS-Äquivalent | Beispiel |
|---|---|---|
font-family |
font-family |
Gleiche Syntax |
font-size |
font-size |
Gleiche Syntax |
font-weight |
font-weight |
bold, normal, 700 |
text-align |
text-align |
left, center, right, justify |
color |
color |
Hex, RGB, Namen |
background-color |
background-color |
Gleiche Syntax |
space-before |
margin-top |
Vor dem Element |
space-after |
margin-bottom |
Nach Element |
start-indent |
margin-left |
Linker Einzug |
keep-together |
page-break-inside: avoid |
Brüche verhindern |
break-before="page" |
page-break-before: always |
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));
}
}
Imports Fonet
Imports Fonet.Render.Pdf
Imports System.IO
Imports System.Xml
Module Program
Sub Main()
' fo.net requires XSL-FO format, not HTML
' First convert HTML to XSL-FO (manual process)
Dim xslFo As String = "<?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>"
Dim driver As FonetDriver = FonetDriver.Make()
driver.Render(New StringReader(xslFo),
New FileStream("output.pdf", FileMode.Create))
End Sub
End Module
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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<h1>Hello World</h1><p>This is HTML content.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
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));
}
}
Imports Fonet
Imports Fonet.Render.Pdf
Imports System.IO
Class Program
Shared Sub Main()
' fo.net settings are configured in XSL-FO markup
Dim xslFo As String = "<?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>"
Dim driver As FonetDriver = FonetDriver.Make()
driver.Render(New StringReader(xslFo),
New FileStream("custom.pdf", FileMode.Create))
End Sub
End Class
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");
}
}
Imports IronPdf
Imports IronPdf.Engines.Chrome
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 25
renderer.RenderingOptions.MarginRight = 25
Dim html As String = "<h1 style='font-size:14pt'>Custom PDF</h1>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("custom.pdf")
End Sub
End Class
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();
}
}
Imports Fonet
Imports System.IO
Imports System.Net
Class Program
Shared Sub Main()
' fo.net does not support URL rendering directly
' Must manually download, convert HTML to XSL-FO, then render
Dim url As String = "https://example.com"
Dim html As String = New WebClient().DownloadString(url)
' Manual conversion from HTML to XSL-FO required (complex)
Dim xslFo As String = ConvertHtmlToXslFo(html) ' Not built-in
Dim driver As FonetDriver = FonetDriver.Make()
driver.Render(New StringReader(xslFo),
New FileStream("webpage.pdf", FileMode.Create))
End Sub
Shared Function ConvertHtmlToXslFo(html As String) As String
' Custom implementation required - extremely complex
Throw New System.NotImplementedException()
End Function
End Class
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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
Die Umwandlung von URLs in PDFs ist einer der wichtigsten Vorteile bei dieser fo.net-Migration.IronPDF erledigt 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>
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
};
Imports System
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center; font-size:10pt;'>Company Name - Confidential</div>",
.DrawDividerLine = True
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:right; font-size:10pt;'>Page {page} of {total-pages}</div>",
.DrawDividerLine = True
}
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
' fo.net has very limited PDF security options
' Must use post-processing with another library
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;
}
Imports IronPdf
Public Function GenerateSecurePdf(html As String) As Byte()
Dim renderer = New ChromePdfRenderer()
Dim 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
End Function
Erwägungen zur Leistung
Wiederverwendung von ChromePdfRenderer
Für eine optimale Performance während Ihrer fo .NET -Migration verwenden Sie die ChromePdfRenderer-Instanz wieder:
// 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;
}
Imports System
' GOOD - Reuse the renderer
Public Class PdfService
Private Shared ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
End Class
' BAD - Creating new instance each time
Public Function GenerateBad(html As String) As Byte()
Dim renderer As New ChromePdfRenderer() ' Wasteful
Return renderer.RenderHtmlAsPdf(html).BinaryData
End Function
Helfer bei der Einheitenumwandlung
fo.net XSL-FO verwendet verschiedene Einheiten.IronPDF verwendet 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
Public Module UnitConverter
Public Function InchesToMm(inches As Double) As Double
Return inches * 25.4
End Function
Public Function PointsToMm(points As Double) As Double
Return points * 0.352778
End Function
Public Function PicasToMm(picas As Double) As Double
Return picas * 4.233
End Function
Public Function CmToMm(cm As Double) As Double
Return cm * 10
End Function
End Module
' Usage
renderer.RenderingOptions.MarginTop = UnitConverter.InchesToMm(1) ' 1 inch
Fehlerbehebung
Problem 1: Unterschiede in der Seitengröße
Problem: Die PDF-Seitengröße sieht nach der .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);
' 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)
Ausgabe 2: fo:block zu HTML Mapping
Problem: Ich bin mir nicht sicher, was aus <fo:block> werden soll.
Lösung: Verwenden Sie geeignetes semantisches HTML:
- Überschriften:
<h1>bis<h6> - Absätze:
<p> - Generische Container:
<div> - Inline-Text:
<span>
Problem 3: Nicht übereinstimmende Schriftarten
Problem: Die Schriftarten sehen anders aus als in der .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>
Ausgabe 4: Nicht funktionierende Seitenzahlen
Problem: <fo:page-number/> funktioniert nicht.
Lösung: Verwenden SieIronPDF 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
};
Imports System
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 15 ' mm
}
Migrations-Checkliste
Vor der Migration
- Alle XSL-FO-Vorlagendateien katalogisieren (
.fo,.xslfo) - Dokumentseitenabmessungen und -ränder verwendet
- Hinweis zu Kopf-/Fußzeilenkonfigurationen (
fo:static-content) - Tabellenstrukturen und -styling identifizieren
- Projekt in der Versionskontrolle sichern -IronPDF-Lizenzschlüssel erhalten
Paket-Migration
- Entfernen Sie das Paket
FonetoderFO.NET:dotnet remove package Fonet - Installieren Sie das Paket
IronPdf:dotnet add package IronPdf - Namespace-Importe von
FonetaufIronPdfaktualisieren -IronPDF-Lizenzschlüssel beim Start festlegen
Code-Migration
- Ersetzen Sie
FonetDriver.Make()durchnew ChromePdfRenderer() - Ersetzen Sie
driver.Render()durchrenderer.RenderHtmlAsPdf() - Aktualisiere die Dateiausgabe von Streams auf
pdf.SaveAs() - Ersetzen Sie Fehlerbehandlungsroutinen durch try/catch
- Konvertiere
fo:static-contentinHtmlHeaderFooter - Ersetzen Sie
<fo:page-number/>durch den Platzhalter{page}
Testen
- Vergleichen Sie das Erscheinungsbild der Ausgabe mit dem ursprünglichen fo .NET PDF.
- 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 die Vorlagendateien
.found.xslfo - Entfernen Sie fo.net-bezogenen Code und Hilfsprogramme.
- Dokumentation aktualisieren

