フッターコンテンツにスキップ
移行ガイド

fo.netからIronPDFへの移行方法

fo.netからIronPDFへの移行:完全なC#移行ガイド

fo.net(FO.NET)からIronPDFへの移行は、.NET PDF生成ワークフローの大幅な近代化を意味します。 このガイドでは、コードベースを時代遅れのXSL-FOマークアップから最新のHTML/CSSベースのPDF生成に移行するための、明確で段階的な移行パスを提供します。

なぜfo.netからIronPDFへ移行するのか

fo.netの課題

fo.netはXSL-FOからPDFへのレンダラーですが、最新の開発には大きな制限があります:

1.時代遅れの技術:XSL-FO(Extensible Stylesheet Language Formatting Objects)は2001年のW3C仕様で、2006年以降更新がなく、ほとんど時代遅れと見なされています。

2.急な学習曲線:XSL-FOは、特殊なフォーマットオブジェクト(fo:blockfo:tablefo:page-sequenceなど)を持つ複雑なXMLベースのマークアップを学習する必要があります。

3.HTML/CSSサポートなし:fo.netはHTMLやCSSをレンダリングできません。HTMLからXSL-FOマークアップへの手動変換が必要です。

4.Abandoned/Unmaintained: オリジナルのCodePlexリポジトリは廃止されました; GitHubのフォークは現在アクティブにメンテナンスされていません。

5.Windowsのみ:fo.netはSystem.Drawingに内部依存しているため、Linux/macOSでは動作しません。

6.制限されたモダンな機能:JavaScriptのサポートなし、CSS3なし、フレックスボックス/グリッドなし、モダンなWebフォントなし。

7.URLレンダリングなし: fo.netはウェブページを直接レンダリングできません。

fo.netとIronPDFの比較

</fo.net
アスペクトfo.net (FO.NET)IronPDF
入力フォーマットXSL-FO(時代遅れのXML)HTML/CSS(最新のウェブ標準)
学習曲線スティープ(XSL-FOの専門知識)ジェントル(HTML/CSSの知識)
メンテナンス中止毎月積極的にメンテナンス
プラットフォームサポートWindowsのみ真のクロスプラットフォーム (.NET 6/7/8/9/10+)
CSSサポートなしフルCSS3(フレックスボックス、グリッド)
JavaScriptなしJavaScriptフルサポート
URLレンダリングサポートされていません内蔵
最新の機能制限的ヘッダー、フッター、透かし、セキュリティ
ドキュメンテーション古い包括的なチュートリアル

なぜ切り替えは理にかなっているのか

fo.netは、XSL-FOが文書フォーマットの標準になると予想されたときに設計されました。 そのような期待は実現しませんでした。 HTML/CSSは普遍的な文書フォーマットとなり、XSL-FOを知っている開発者が1%未満であるのに対し、HTML/CSSを知っている開発者は98%以上にのぼります。 ほとんどのXSL-FOリソースは2005年から2010年のもので、メンテナンスがますます難しくなっています。

IronPDFは、2025年まで、そして2026年まで、.NET 10とC# 14を含む最新の.NETバージョンをフルサポートし、すでに持っているスキルを使ってプロフェッショナルなPDFを作成することができます。


始める前に

前提条件

1..NET環境: IronPDFは.NET Framework 4.6.2+、.NET Core 3.1+、.NET 5/6/7/8/9+をサポートしています。 2.NuGetアクセス: NuGetからパッケージをインストールできるようにする。 3.ライセンスキーironpdf.comから本番使用用のIronPDFライセンスキーを入手してください。

プロジェクトのバックアップ

# 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

すべてのfo.netの使用法を特定する。

# 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

XSL-FOテンプレートを文書化する

移行する前に、すべてのXSL-FOファイルをカタログ化し、メモしてください:

  • ページ寸法と余白
  • 使用フォント
  • 表とその構造
  • ヘッダーとフッター (fo:static-content<//code>)
  • ページ番号のパターン
  • 画像参照

クイック スタート マイグレーション

ステップ 1: NuGet パッケージを更新する。

# 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

ステップ 2: 名前空間の更新

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

ステップ3: IronPDFを初期化する

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

ステップ 4: 基本的な変換パターン

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

完全な API リファレンス

名前空間マッピング

fo.net 名前空間IronPDF 同等物ノート
<コード>Fonet</コードIronPdf(アイアンPDF主な名前空間
<コード>Fonet.Render.Pdf</コードIronPdf(アイアンPDFPDFレンダリング
<コード>Fonet.Layout</コード該当なしレイアウトはCSSで処理
<コード>Fonet.Fo</コード該当なしオブジェクトのフォーマット → HTML
<コード>Fonet.Image</コードIronPdf(アイアンPDF画像処理内蔵

FonetDriverからChromePdfRendererへの翻訳

FonetDriver メソッドIronPDF 同等物ノート
FonetDriver.Make()を使用してください。new ChromePdfRenderer().レンダラーの作成
driver.Render(inputStream, outputStream).renderer.RenderHtmlAsPdf(html).ストリームベース
driver.Render(inputFile, outputStream).renderer.RenderHtmlFileAsPdf(path)のようにします。ファイルベース
ドライバー.ベースディレクトリ<コード>RenderingOptions.BaseUrl</コードリソースのベースパス
driver.OnError += handler.レンダリング周りのトライ/キャッチエラー処理

レンダリングオプション (PDF 設定)

fo.net (XSL-FO属性)IronPDF レンダリングオプションノート
<コード>ページハイト</コードPaperSizeまたはSetCustomPaperSize()ページサイズ
<コード>ページ幅</コード<コード>用紙サイズ</コード標準またはカスタム
<コード>マージントップ</コード<コード>マージントップ</コード単位:ミリメートル
<コード>マージンボトム</コード<コード>マージンボトム</コード単位:ミリメートル
<コード>マージンレフト</コード<コード>マージンレフト</コード単位:ミリメートル
margin-right<コード>マージンライト</コード単位:ミリメートル
<コード>リファレンス指向</コードペーパーオリエンテーションポートレート/風景

XSL-FOからHTMLへの変換ガイド

XSL-FO要素をHTML/CSSに変換する

このfo.net移行における基本的なシフトは、XSL-FO要素を同等のHTMLに変換することです:

XSL-FO要素HTML/CSS相当ノート
<fo:root>のようにします。<html>ルート要素
<//code>CSS @pageルールページ設定
<fo:simple-page-master>CSS <コード>@ページ</コードページ定義
<//code><body> または <div> を使用してください。ページ内容
<fo:flow>のようにします。<main> または <div> を使用してください。主な内容
<//code><コード>HtmlHeaderFooter</コードヘッダー/フッター
<fo:block>のようにします。<p><div><h1>-<h6>ブロックコンテンツ
<fo:inline>のようにします。<span>インラインコンテンツ
<//code><table>
<//code><tr>表の行
<//code><td><th>表セル
<//code><ul><ol>リスト
<//code><li>リスト項目
<//code><img>画像
<//code><コード>{ページ}</コード>プレースホルダページ数
<//code><コード>{総ページ数}</コード総ページ数
<//code><a href>ハイパーリンク

XSL-FOプロパティからCSSへ

XSL-FOプロパティCSS相当翻訳例
font-familyfont-family同じ構文
<コード>フォントサイズ</コード<コード>フォントサイズ</コード同じ構文
<コード>フォントウェイト</コード<コード>フォントウェイト</コードboldnormal700
<コード>テキストアライン</コード<コード>テキストアライン</コードleftcenterrightjustify
<コード>カラー</コード<コード>カラー</コード16進数、RGB、名前
<コード>背景色</コード<コード>背景色</コード同じ構文
<コード>スペース・ビフォー</コード<コード>マージントップ</コード翻訳前
<コード>スペースアフター</コード<コード>マージンボトム</コード要素
start-indent<//code><コード>マージンレフト</コード左インデント
<コード>keep-together</コードpage-break-inside: 避けてください改行を防ぐ
break-before="page"を使用してください。page-break-before: always強制改ページ

コード例

例1: 基本的なHTMLからPDFへ

ビフォア(XSL-FO付きfo.net):

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

翻訳後(HTML付きIronPDF):

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

IronPDFのアプローチは25行以上のXSL-FOマークアップをわずか4行のクリーンなC#コードに削減します。 HTMLからPDFへのオプションについては、IronPDF HTML to PDF documentationをご覧ください。

例2: カスタム設定のPDF

ビフォア(XSL-FO付きfo.net):

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

翻訳後(HTML付きIronPDF):

// 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はXMLマークアップに設定を埋め込む代わりに、プログラムによるレンダリングオプションを提供します。

例3: URLからPDFへ

Before(fo.netはサポートされていません):

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

翻訳後(IronPDF - 組み込みサポート):

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

URLからPDFへのレンダリングは、このfo.net移行における最も重要な利点の1つです。 IronPdfは完全なJavaScript実行でこれをネイティブに処理します。 URLからPDFへの変換の詳細については、こちらをご覧ください。

例4: ヘッダーとフッター

ビフォア(XSL-FO付きfo.net):

<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

翻訳後(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は複雑なXSL-FO領域定義をシンプルなHTMLヘッダーとフッターに置き換えます。

例5: PDFセキュリティ

ビフォア(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

翻訳後(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

パフォーマンスの考慮事項

ChromePdfRendererを再利用してください。

fo.net移行時のパフォーマンスを最適化するために、ChromePdfRendererインスタンスを再利用してください:

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

ユニット変換ヘルパー

fo.net XSL-FOはさまざまな単位を使用します。 IronPDFは余白にミリメートルを使用しています。 ヘルパークラスはこちらです:

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

トラブルシューティング

課題1:ページサイズの違い

問題:fo.net移行後、PDFのページサイズが異なって見える。

ソリューション:XSL-FOのページ寸法を正しくマッピングします:

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

課題2:fo:blockからHTMLへのマッピング

問題<fo:block>が何になるべきかわからない。

解決策:適切なセマンティックHTMLを使用してください:

  • 見出し<h1>から<h6>まで
  • 段落<p>
  • 一般的なコンテナ<div>のようにします。
  • インラインテキスト<span>

問題3:フォントが一致しない

問題:フォントがfo.netの出力と異なって見える。

解決策:ウェブフォントを使用するか、CSSでシステムフォントを指定します:

<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

課題4:ページ番号が機能しない

問題<fo:ページ番号/>が機能しません。

解決策:ヘッダー/フッターにIronPDFプレースホルダーを使用する:

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

移行チェックリスト

移行前

  • [すべてのXSL-FOテンプレートファイル(.fo, .xslfo)をカタログ化する。)
  • [ドキュメントのページ寸法と余白
  • [ヘッダー/フッターの設定に注意してください (fo:static-content)
  • [表構造とスタイルの識別
  • [プロジェクトのバージョン管理へのバックアップ
  • [IronPDF ライセンスキーの取得

パッケージの移行

  • [ ]<コード>Fonet</コードまたは FO.NET パッケージを削除してください:dotnet remove package Fonet を削除してください。
  • [ ] IronPdfパッケージをインストールしてください:dotnet add package IronPdf.
  • [ ] 名前空間のインポートをFonetからIronPdfに更新してください。
  • [ ] 起動時にIronPDFライセンスキーを設定する

コードの移行

  • [ ]FonetDriver.Make()を使用してください。をnew ChromePdfRenderer().に置き換えてください。
  • [ ] driver.Render()renderer.RenderHtmlAsPdf()に置き換えてください。
  • [ ] ストリームからのファイル出力を pdf.SaveAs() に更新する。
  • [エラーイベントハンドラを try/catch に置き換える。
  • [ ] fo:static-contentHtmlHeaderFooterに変換してください。
  • [ ] <fo:page-number/>{page}<//code> プレースホルダーに置き換えてください。

テスティング

  • [ ] オリジナルのfo.net PDFと出力の外観を比較する
  • [ページの寸法と余白の確認
  • [ヘッダーとフッターのチェック
  • [ページ番号の検証
  • [テストテーブルレンダリング
  • [画像読み込みの確認

移行後

  • [ ] .fo.xslfo テンプレートファイルの削除
  • [ ] fo.net関連のコードとユーティリティの削除
  • [ドキュメントの更新

結論

fo.netからIronPDFへの移行は、時代遅れのXSL-FOマークアップを98%以上の開発者がすでに持っているHTML/CSS-スキルに置き換えることで、.NET PDF生成ワークフローを近代化します。 この移行により、放棄されたライブラリへの依存が解消され、クロスプラットフォームのサポートが追加され、JavaScriptレンダリング、CSS3スタイリング、包括的なPDFセキュリティなどの最新機能へのアクセスが可能になります。

IronPDFの積極的なメンテナンスにより、.NET 10以降の.NETバージョンを含む現在および将来の.NETバージョンとの互換性が保証されます。 その他のガイダンスについては、IronPDFドキュメントAPIリファレンスをご覧ください。

fo.netへの移行を始める準備はできましたか? IronPdfをダウンロードして、今すぐ最初のXSL-FOテンプレートをHTMLに変換してください。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。