fo.net'ten IronPDF'e Nasıl Geçilir
fo.net'den (FO.NET) IronPDF'ye geçmek, .NET PDF üretim süreciniz için büyük bir güncellemedir. Bu rehber, geliştirme ekibinizin zaten sahip olduğu becerilerle kod tabanınızı eski XSL-FO işaretlemesinden modern HTML/CSS tabanlı PDF üretimine dönüştürmek için basit, adım adım bir yol sunar.
fo.net'ten IronPDF'ye Neden Geçilmeli
fo.net Zorlukları
fo.net (FO.NET), XSL-FO belgelerini PDF'ye dönüştüren erken bir Apache FOP yapısının C#'a aktarımıdır. Apache 2.0 lisanslıdır ancak mevcut geliştirme için bazı sınırlamalar taşır:
-
Eskimiş Teknoloji: XSL-FO (Genişletilebilir Stil Şablonu Dili Biçimlendirme Nesneleri) 2001 yılına ait bir W3C spesifikasyonudur; W3C, 2013'te XSL-FO Çalışma Grubu'nu kapattı ve dilde başka bir geliştirme yapılmadı.
-
Karmaşık Öğrenme Eğrisi: XSL-FO, uzmanlaşmış formatlama nesneleri ile ayrıntılı XML tabanlı işaretleme gerektirir (
fo:block,fo:table,fo:page-sequence, vb.). -
HTML/CSS Desteği Yok: fo.net HTML veya CSS'yi render edemez—HTML'yi genellikle XSLT aracılığıyla kendiniz XSL-FO'ya dönüştürmelisiniz.
-
Terk Edilmiş/Bakım Yapılmıyor: nuget.org üzerindeki
Fonetpaketi en son Nisan 2011'de yayımlandı (v1.0.0, .NET Framework 2.0). Topluluk çatallamasıFonet.Standard(.NET Standard 2.0) en son Mayıs 2020'de yayımlandı (v1.0.5). CodePlex deposu işlevini yitirmiş durumda ve GitHub çatalları (prepare/FO.NET,nholik/FO.Net,hahmed/Fo.Net) durgun. -
Uygulamada Sadece Windows: Geçmişten gelen
Fonetderlemesi, onu etkili bir şekilde Windows ile sınırlayanSystem.Drawing(GDI+) API'lerine bağlıdır. -
Sınırlı Modern Özellikler: JavaScript motoru yok, CSS3 (flexbox/grid) yok, modern web font yüklemesi yok.
- URL Renderleme Yok: fo.net doğrudan web sayfalarını renderleyemez—HTML'den XSL-FO'ya manuel dönüştürme gerektirir.
fo.net vs IronPDF Karşılaştırması
| Aspekt | fo.net (FO.NET) | IronPDF |
|---|---|---|
| Girdi Biçimi | XSL-FO (demode XML) | HTML/CSS (modern web standartları) |
| Öğrenme Eğrisi | Dik (XSL-FO uzmanlığı) | Nazik (HTML/CSS bilgisi) |
| Bakım | Terkedildi (son yayın Mayıs 2020) | Aktif olarak sürdürülüyor |
| Platform Desteği | Sadece Windows | Cross-platform (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+) |
| CSS Desteği | None | Tam CSS3 (Flexbox, Grid) |
| JavaScript | None | TamJavaScriptdesteği |
| URL Renderleme | Desteklenmiyor | Yerleşik |
| Modern Özellikler | Sınırlı | Başlıklar, alt bilgiler, filigranlar, güvenlik |
| Dokümantasyon | Modası geçmiş | Kapsamlı eğitimler |
Neden Geçiş Anlamlıdır
fo.net, XSL-FO'nun belge formatlamada bir standart olması beklendiğinde tasarlandı. Bu beklenti hiçbir zaman gerçekleşmedi. HTML/CSS evrensel belge biçimi haline gelirken, XSL-FO niş bir beceri olarak kaldı — çoğu XSL-FO kaynağı 2005–2010'dan kalma, bu da bakım yapmayı giderek zorlaştırıyor.
IronPDF, sahip olduğunuz becerileri modern .NET üzerinde profesyonel PDF'ler oluşturmak için kullanmanıza olanak tanır.
Başlamadan Önce
Ön Koşullar
- .NET Ortamı: IronPDF, .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+ sürümlerini destekler
- NuGet Erişimi: NuGet'ten paket kurabileceğinizden emin olun
- Lisans Anahtarı: Üretim kullanımı için IronPDF lisans anahtarınızı ironpdf.com adresinden edinin
Projenizi Yedekleyin
# Create a backup branch
git checkout -b pre-ironpdf-migration
git add .
git commit -m "Backup before fo.net to IronPDF migration"
# Create a backup branch
git checkout -b pre-ironpdf-migration
git add .
git commit -m "Backup before fo.net to IronPDF migration"
Tüm fo.net Kullanımını Belirleyin
# 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*"
XSL-FO Şablonlarınızı Belgeleyin
Göç öncesi tüm XSL-FO dosyalarını kataloglayın ve not alın:
- Sayfa boyutları ve kenar boşlukları
- Kullanılan yazı tipleri
- Tablolar ve yapıları
- Başlıklar ve altlıklar (
fo:static-content) - Sayfa numaralama desenleri
- Görsel referanslar
Hızlı Başlangıç Göçü
1. Adım: NuGet Paketlerini Güncelleyin
# 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
Adım 2: Ad Alanlarını Güncelleyin
// 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
Adım 3: IronPDF'yi Başlatın
// 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"
Adım 4: Temel Dönüştürme Deseni
// 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")
Tam API Referansı
Namespace Haritalama
| fo.net Ad Alanı | IronPDF Eşdeğeri |
|---|---|
Fonet |
IronPdf |
Fonet.Render.Pdf |
IronPdf |
Fonet.Layout |
Yok |
Fonet.Fo |
Yok |
Fonet.Image |
IronPdf |
FonetDriver'dan ChromePdfRenderer'a
| FonetDriver Yöntemi | IronPDF Eşdeğeri |
|---|---|
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 |
İşleme çevresinde try/catch |
Renderleme Seçenekleri (PDF Konfigürasyonu)
| fo.net (XSL-FO Özellikleri) | IronPDF RenderingOptions |
|---|---|
page-height |
PaperSize veya SetCustomPaperSize() |
page-width |
PaperSize |
margin-top |
MarginTop |
margin-bottom |
MarginBottom |
margin-left |
MarginLeft |
margin-right |
MarginRight |
reference-orientation |
PaperOrientation |
XSL-FO'dan HTML'e Dönüşüm Kılavuzu
XSL-FO Elemanlarından HTML/CSS'e
Bu fo.net göçündeki temel değişiklik, XSL-FO elemanlarının HTML eşdeğerlerine dönüştürülmesidir:
| XSL-FO Elemanı | HTML/CSS Eşdeğeri | |
|---|---|---|
<fo:root> |
<html> |
|
<fo:layout-master-set> |
CSS @page kuralı |
|
<fo:simple-page-master> |
CSS @page |
|
<fo:page-sequence> |
veya |
|
<fo:flow> |
veya |
|
<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} yer tutucu |
|
<fo:page-number-citation> |
{total-pages} |
|
<fo:basic-link> |
<a href> |
XSL-FO Özelliklerinden CSS'e
| XSL-FO Özelliği | CSS Eşdeğeri | Örnek |
|---|---|---|
font-family |
font-family |
Aynı sözdizimi |
font-size |
font-size |
Aynı sözdizimi |
font-weight |
font-weight |
bold, normal, 700 |
text-align |
text-align |
left, center, right, justify |
color |
color |
Hex, RGB, isimler |
background-color |
background-color |
Aynı sözdizimi |
space-before |
margin-top |
Öncesi eleman |
space-after |
margin-bottom |
Sonrası eleman |
start-indent |
margin-left |
Sol girinti |
keep-together |
page-break-inside: avoid |
Bozulmaları önleyin |
break-before="page" |
page-break-before: always |
Sayfa kırılmasını zorlayın |
Kod Örnekleri
Örnek 1: Temel HTML'den PDF'ye
Öncesi (fo.net ile 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
Sonrası (IronPDF ile 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
IronPDF yaklaşımı, 25+ satırlık XSL-FO işaretlemesini sadece 4 satır temiz C# koduna indirir. Daha fazla HTML'den PDF'e seçeneği için IronPDF HTML to PDF belgelerine bakın.
Örnek 2: Özel Ayarlarla PDF
Öncesi (fo.net ile 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
Sonrası (IronPDF ile 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, XML işaretlemesinde konfigürasyonları gömmek yerine programatik renderleme seçenekleri sunar.
Örnek 3: URL'den PDF'e
Öncesi (fo.net - desteklenmiyor):
// 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
Sonrası (IronPDF - yerleşik destek):
// 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
URL'den PDF renderleme, bu fo.net geçişinde pratik kazançlardan biridir: IronPDF, JavaScript yürütme ile bunu yerel olarak ele alır. URL'den PDF'e dönüştürme hakkında daha fazla bilgi edinin.
Örnek 4: Üstbilgi ve Altbilgiler
Öncesi (fo.net ile 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>
Sonrası (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, karmaşık XSL-FO bölge tanımlarını basit HTML üstbilgi ve altbilgileri ile değiştirir.
Örnek 5: PDF Güvenliği
Öncesi (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
Sonrası (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
Performans Dikkat Edilecek Hususlar
ChromePdfRenderer'ı Yeniden Kullanın
fo.net geçişiniz sırasında en iyi performans için ChromePdfRenderer örneğini yeniden kullanın:
// 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
Birim Dönüşüm Yardımcısı
fo.net XSL-FO çeşitli birimler kullanır. IronPDF, kenar boşlukları için milimetre kullanır. İşte bir yardımcı sınıf:
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
Hata Ayıklama
Sorun 1: Sayfa Boyutu Farklılıkları
Problem: PDF sayfa boyutu fo.net göçünden sonra farklı görünüyor.
Çözüm: XSL-FO sayfa boyutlarını doğru eşleyin:
// 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)
Sorun 2: fo:block'tan HTML Eşlemesine
Problem: <fo:block> ne haline gelmeli emin değilim.
Çözüm: Uygun semantik HTML kullanın:
- Başlıklar:
<h1>üzerinden<h6> - Paragraflar:
- Genel kapsayıcılar:
- Satır içi metin:
Sorun 3: Yazı Tipleri Eşleşmiyor
Problem: Yazı tipi fo.net çıktısından farklı görünüyor.
Çözüm: Web yazı tiplerini kullanın veya CSS'de sistem yazı tiplerini belirtin:
<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>HTMLSorun 4: Sayfa Numaraları Çalışmıyor
Problem:
<fo:page-number/>çalışmıyor.Çözüm: Üstbilgi/altbilgilerde IronPDF yer tutucularını kullanın:
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 }$vbLabelText $csharpLabel
Geçiş Kontrol Listesi
Öncesi-Geçiş
- Tüm XSL-FO şablon dosyalarını katalogla (
.fo,.xslfo) - Kullanılan sayfa boyutlarını ve kenar boşluklarını belgeleyin
- Başlık/altlık yapılandırmalarını not et (
fo:static-content) - Tablo yapıları ve stillerini belirleyin
- Projeyi sürüm kontrolüne yedekleyin -IronPDF lisans anahtarını edinin
Paket Göçü
FonetveyaFO.NETpaketini kaldır:dotnet remove package FonetIronPdfpaketini yükle:dotnet add package IronPdf- İsim alanı ithallerini
Fonet'danIronPdf'a güncelle - Başlangıçta IronPDF lisans anahtarını ayarlayın
Kod Geçişi
FonetDriver.Make()ilenew ChromePdfRenderer()değiştirdriver.Render()ilerenderer.RenderHtmlAsPdf()değiştir- Dosya çıkışını akışlardan
pdf.SaveAs()'a güncelle - Hata olay işleyicilerini try/catch ile değiştirin
fo:static-content'yiHtmlHeaderFooter'ya dönüştür<fo:page-number/>'yi{page}yer tutucu ile değiştir
Test Etme
- Çıktı görünümünü orijinal fo.net PDF'lerle karşılaştırın
- Sayfa boyutlarını ve kenar boşluklarını doğrulayın
- Üstbilgi ve altbilgileri kontrol edin
- Sayfa numaralarını doğrulayın
- Tablo renderlemesini test edin
- Görüntü yüklemesini doğrulayın
Geçiş Sonrası
.fove.xslfoşablon dosyalarını sil- fo.net ile ilgili kod ve yardımcı programları çıkarın
- Belgeleri güncelleyin
Yukarıda kullanılan IronPDF yüzeyinin daha derin bir kapsamı için, IronPDF API referansına bakın.
Lütfen dikkate alınFO.NET, Fonet ve Apache FOP kendi sahiplerinin ticari markalarıdır. Bu site FO.NET projesi veya Apache Software Foundation ile ilişkili değildir, onaylanmamıştır veya sponsoru değildir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır. - Satır içi metin:

