IRONSOFTWAREHOME
VIDEOLAR

C#'ta Özel Günlükleme Kullanma

Curtis Chau
Curtis Chau
Updated: 19 Temmuz 2026

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:

  1. 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ı.

  2. 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.).

  3. 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.

  4. Terk Edilmiş/Bakım Yapılmıyor: nuget.org üzerindeki Fonet paketi 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.

  5. Uygulamada Sadece Windows: Geçmişten gelen Fonet derlemesi, onu etkili bir şekilde Windows ile sınırlayan System.Drawing (GDI+) API'lerine bağlıdır.

  6. Sınırlı Modern Özellikler: JavaScript motoru yok, CSS3 (flexbox/grid) yok, modern web font yüklemesi yok.

  7. 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ı

Aspektfo.net (FO.NET)IronPDF
Girdi BiçimiXSL-FO (demode XML)HTML/CSS (modern web standartları)
Öğrenme EğrisiDik (XSL-FO uzmanlığı)Nazik (HTML/CSS bilgisi)
BakımTerkedildi (son yayın Mayıs 2020)Aktif olarak sürdürülüyor
Platform DesteğiSadece WindowsCross-platform (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+)
CSS DesteğiNoneTam CSS3 (Flexbox, Grid)
JavaScriptNoneTamJavaScriptdesteği
URL RenderlemeDesteklenmiyorYerleşik
Modern ÖzelliklerSınırlıBaşlıklar, alt bilgiler, filigranlar, güvenlik
DokümantasyonModası 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

  1. .NET Ortamı: IronPDF, .NET Framework 4.6.2+, .NET Core 3.1+, .NET 5/6/7/8/9+ sürümlerini destekler
  2. NuGet Erişimi: NuGet'ten paket kurabileceğinizden emin olun
  3. 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"
SHELL

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*"
SHELL

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
SHELL

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;

Adım 3: IronPDF'yi Başlatın

// 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");

Tam API Referansı

Namespace Haritalama

fo.net Ad AlanıIronPDF Eşdeğeri
FonetIronPdf
Fonet.Render.PdfIronPdf
Fonet.LayoutYok
Fonet.FoYok
Fonet.ImageIronPdf

FonetDriver'dan ChromePdfRenderer'a

FonetDriver YöntemiIronPDF Eşdeğeri
FonetDriver.Make()new ChromePdfRenderer()
driver.Render(inputStream, outputStream)renderer.RenderHtmlAsPdf(html)
driver.Render(inputFile, outputStream)renderer.RenderHtmlFileAsPdf(path)
driver.BaseDirectoryRenderingOptions.BaseUrl
driver.OnError += handlerİşleme çevresinde try/catch

Renderleme Seçenekleri (PDF Konfigürasyonu)

fo.net (XSL-FO Özellikleri)IronPDF RenderingOptions
page-heightPaperSize veya SetCustomPaperSize()
page-widthPaperSize
margin-topMarginTop
margin-bottomMarginBottom
margin-leftMarginLeft
margin-rightMarginRight
reference-orientationPaperOrientation

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><body> veya <div>
<fo:flow><main> veya <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} yer tutucu
<fo:page-number-citation>{total-pages}
<fo:basic-link><a href>

XSL-FO Özelliklerinden CSS'e

XSL-FO ÖzelliğiCSS EşdeğeriÖrnek
font-familyfont-familyAynı sözdizimi
font-sizefont-sizeAynı sözdizimi
font-weightfont-weightbold, normal, 700
text-aligntext-alignleft, center, right, justify
colorcolorHex, RGB, isimler
background-colorbackground-colorAynı sözdizimi
space-beforemargin-topÖncesi eleman
space-aftermargin-bottomSonrası eleman
start-indentmargin-leftSol girinti
keep-togetherpage-break-inside: avoidBozulmaları önleyin
break-before="page"page-break-before: alwaysSayfa 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));
    }
}

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");
    }
}

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));
    }
}

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");
    }
}

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();
    }
}

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");
    }
}

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

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
};

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

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;
}

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;
}

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

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);

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: <p>
  • Genel kapsayıcılar: <div>
  • Satır içi metin: <span>

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

Sorun 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
};

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öçü

  • Fonet veya FO.NET paketini kaldır: dotnet remove package Fonet
  • IronPdf paketini yükle: dotnet add package IronPdf
  • İsim alanı ithallerini Fonet'dan IronPdf'a güncelle
  • Başlangıçta IronPDF lisans anahtarını ayarlayın

Kod Geçişi

  • FonetDriver.Make() ile new ChromePdfRenderer() değiştir
  • driver.Render() ile renderer.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'yi HtmlHeaderFooter'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ı

  • .fo ve .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ın: FO.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.
Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Ücretsiz Canlı Demo rezervasyonu yapın
Booking Badge

Dünya Çapında Milyonlarca Mühendisin Güvendiği

Iron Software müşteri logoları
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez