FO.NET vs IronPDF:技術比較ガイド
.NET開発者がPDF生成ソリューションに注目するとき、FO.NETはXSL-FOドキュメントをPDFに変換する専門ツールとして際立っています。 しかし、時代遅れのXSL-FO言語に依存していること、HTML/CSSをサポートしていないこと、メンテナンスが終了していることから、多くのチームが代替案を検討しています。 IronPdfはほとんどの開発者がすでに慣れ親しんでいるHTML/CSSウェブスタンダードを使用し、Chromiumレンダリングエンジンと毎月の定期的なアップデートを特徴とする最新のソリューションを提供します。
この比較では、.NET PDFのニーズに対して、プロの開発者やアーキテクトが十分な情報を得た上で決断できるように、関連する技術的側面にわたって両ライブラリをレビューします。
FO.NETを理解する
FO.NET(別名FoNet)は、C#を使用してXSL Formatting Object(XSL-FO)ドキュメントをPDFに変換するために設計されたオープンソースライブラリです。 このライブラリはApache 2.0ライセンスの下で動作し、XSL-FO言語をPDFフォーマットに直接マッピングします。
FO .NET は、プライマリ クラスとして FonetDriver を使用し、Make() ファクトリ メソッドでドライバー インスタンスを作成し、Render() メソッドで XSL-FO 入力ストリームを処理して PDF 出力ストリームを生成します。 構成は、fo:layout-master-set などの要素や、余白、ページ サイズ、フォントの書式設定属性を使用して、XSL-FO マークアップ自体内で行われます。
重要な制限は、FO.NETがXSL-FOの知識を必要とすることです。XSL-FOは、2001年のW3C仕様で、2006年以降更新されていないXMLベースの言語です。このライブラリはHTMLやCSSをサポートしておらず、ウェブページを直接レンダリングすることはできません。 XSL-FOは、今日の技術分野では時代遅れと考えられており、HTML/CSSを知っている開発者が98%以上いるのに対し、XSL-FOの専門知識を持っている開発者は1%未満です。
オリジナルのCodePlexリポジトリは廃止され、GitHubのフォークもアクティブにメンテナンスされていません。 FO.NETはSystem.Drawingに内部依存しているため、Linux/macOSでは動作せず、Windowsのみの展開に制限されています。
IronPDFの理解
IronPDFは.NET PDFライブラリで、ドキュメントのスタイリングとレイアウトにHTML/CSSを使用し、開発で一般的なWeb標準を使用します。 このライブラリはChromiumレンダリングエンジンを使用しており、FlexboxやGridレイアウトを含むCSS3のフルサポートに加え、JavaScriptの実行も可能です。
IronPDF は、主なレンダリング クラスとして ChromePdfRenderer を使用し、RenderingOptions によってページ サイズ、余白、ヘッダー、フッター、およびその他の PDF 設定のプログラムによる構成を提供します。 ライブラリは、直接 URL レンダリング、HTML 文字列レンダリング、および HTML ファイル レンダリングをサポートし、保存、結合、保護、またはさらに操作できる PdfDocument オブジェクトを生成します。
IronPdfは毎月リリースされ、積極的にメンテナンスされ、真のクロスプラットフォーム(Windows, Linux, macOS)をサポートし、徹底したドキュメントとチュートリアルを提供します。
アーキテクチャとテクノロジーの比較
これら for .NET PDFライブラリの基本的な違いは、入力形式と技術基盤にあります。
| アスペクト | FO.NET | IronPDF |
|---|---|---|
| 入力フォーマット | XSL-FO(時代遅れのXML) | HTML/CSS(最新のウェブ標準) |
| ラーニングカーブ | スティープ(XSL-FOの専門知識) | ジェントル(HTML/CSSの知識) |
| メンテナンス | 中止 | 毎月積極的にメンテナンス |
| プラットフォームサポート | Windowsのみ | 真のクロスプラットフォーム |
| CSSサポート | なし | フルCSS3(フレックスボックス、グリッド) |
| JavaScript(JavaScript | なし | JavaScriptフルサポート |
| URLレンダリング。 | サポートされていません | 内蔵 |
| 最新の機能 | 制限的 | ヘッダー、フッター、透かし、セキュリティ |
| ドキュメント | 古い | 包括的なチュートリアル |
FO.NETは、XSL-FOが文書フォーマットの標準になると予想されたときに設計されました。 それが実現しなかったのです。TTML/CSSが普遍的な文書フォーマットになったのです。 ほとんどのXSL-FOリソースは2005年から2010年のものであり、最新の情報やコミュニティサポートを見つけることはますます難しくなっています。
コードの比較:一般的なPDF操作
HTMLからPDFへの変換
最も基本的な操作は、XSL-FOとHTMLのアプローチの間のモデルの違いを示しています。
FO.NET:(英語
// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;
using System.Xml;
class Program
{
static void Main()
{
// FoNet 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()
{
// FoNet 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));
}
}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");
}
}コントラストは明確です。 FO .NETでは、単純な"Hello World"テキストを生成する前に、XML 名前空間宣言、fo:flow、および fo:block 要素を含む詳細な XSL-FO マークアップが必要です。 コードコメントには、次のように明確に記されています:"FoNetはHTMLではなくXSL-FO形式を必要とします。
IronPdfはレンダラーを作成し、標準的なHTMLを渡し、PDFにレンダリングし、開発者がすでに知っている構文を使って簡単な行をセーブします。
高度なHTMLレンダリングオプションについては、HTMLからPDFへの変換ガイドをご覧ください。
URLからPDFへの変換
ウェブページをPDFに変換すると、重大な能力差が明らかになります。
FO.NET:(英語
// NuGet: Install-Package Fonet
using Fonet;
using System.IO;
using System.Net;
class Program
{
static void Main()
{
// FoNet 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
throw new System.NotImplementedException();
}
}// NuGet: Install-Package Fonet
using Fonet;
using System.IO;
using System.Net;
class Program
{
static void Main()
{
// FoNet 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
throw new System.NotImplementedException();
}
}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");
}
}FO.NETは明示的にURLレンダリングをサポートしていません。 コードコメントには、"FoNet は URL レンダリングを直接サポートしていません"および"HTML から XSL-FO への手動変換が必要です (複雑)"と記載されています。この変換は組み込まれておらず、カスタム実装が必要になるため、ConvertHtmlToXslFo() メソッドは NotImplementedException をスローします。
IronPDF は、URL の取得、JavaScriptの実行、レンダリングを 1 回のメソッド呼び出しで処理するネイティブの RenderUrlAsPdf() 機能を提供します。複雑で実装されていないワークフローではなく、3 行のコードです。
URL レンダリングの詳細については、URL to PDF documentationを参照してください。
カスタム設定の PDF
ページ寸法と余白の設定は、設定アプローチの違いを示しています。
FO.NET:(英語
// NuGet: Install-Package Fonet
using Fonet;
using Fonet.Render.Pdf;
using System.IO;
class Program
{
static void Main()
{
// FoNet 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()
{
// FoNet 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));
}
}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");
}
}FO .NETのコード コメントには、"FoNet 設定は XSL-FO マークアップで構成されます"と明示的に記載されています。ページ サイズ、余白、書式設定は、fo:simple-page-master の属性として XML 構造内に埋め込まれています。 つまり、コンフィギュレーションは、冗長なXML形式のコンテンツと絡み合っています。
IronPDF は、プログラムによる RenderingOptions プロパティを使用して構成とコンテンツを分離します。 MarginLeft、および MarginRight のような設定はレンダラー オブジェクトに設定され、コンテンツはクリーンな HTML のままになります。
APIマッピングリファレンス
FO.NETの移行を評価したり、機能を比較したりする開発者のために、このマッピングは同等の操作を示します:
コア クラス マッピング
| FO.NET | IronPDF |
|---|---|
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 | レンダリング周りのトライ/キャッチ |
XSL-FOからRenderingOptionsへのマッピング
| XSL-FO属性 | IronPDF レンダリングオプション |
|---|---|
page-width | PaperSize |
margin-top | MarginTop |
margin-bottom | MarginBottom |
margin-left | MarginLeft |
margin-right | MarginRight |
reference-orientation | PaperOrientation |
XSL-FO要素からHTMLへのマッピング
| XSL-FO要素 | HTML相当 | |
|---|---|---|
<fo:root> | <html> | |
<fo:layout-master-set> | CSS @page ルール | |
<fo:simple-page-master> | CSS @page | |
<fo:page-sequence> | <body> または <div> | |
<fo:flow> | <main> または <div> | |
<fo:static-content> | HtmlHeaderFooter | |
<fo:block> | <p>, <div>, <h1>-<h6> | |
<fo:table> | <table> | |
<fo:list-block> | <ul>, <ol> | |
<fo:external-graphic> | <img> | |
<fo:page-number/> | {page} プレースホルダー |
機能比較の概要
| フィーチャー | FO.NET | IronPDF |
|---|---|---|
| HTMLからPDFへ | ❌ (手作業によるXSL-FO変換が必要) | ✅ |
| URLからPDFへ | ❌ (サポートされていません) | ✅ |
| XSL-FOからPDFへ | ✅ | 該当なし |
| CSS3 サポート | ❌ | ✅ (フレックスボックス、グリッド) |
| JavaScript | ❌ | ✅ |
| ヘッダー/フッター | XSL-FO 静的コンテンツ | HTMLベース |
| ページ番号 | fo:page-number | {page} プレースホルダー |
| クロスプラットフォーム | ❌ (Windowsのみ) | ✅ |
| アクティブメンテナンス | ❌ (放棄) | ✅ (毎月) |
チームがFO.NETからIronPDFへの移行を検討するとき
開発チームが.NETからIronPDFへの移行を評価する理由はいくつかあります:
時代遅れの技術: XSL-FOは2001年のW3C仕様で、2006年以降更新がなく、ほとんど時代遅れと見なされています。 ほとんどのリソースやドキュメントは2005年から2010年のものであり、最新の情報を見つけたり、XSL-FOの専門知識を持つ開発者を雇ったりすることはますます難しくなっています。
学習曲線が急: XSL-FO では、特殊な書式設定オブジェクト (fo:page-sequence など) を使用した複雑な XML ベースのマークアップを学習する必要があります。 HTML/CSSを知っている開発者が98%以上であるのに対し、XSL-FOを知っている開発者は1%未満です。
HTML/CSSサポートなし: FO.NETはHTMLやCSSをレンダリングできません。HTMLからXSL-FOマークアップに手動で変換する必要がありますが、ライブラリには組み込まれていません。 ウェブコンテンツやHTMLテンプレートを使用しているチームは、カスタム変換ロジックを実装する必要があります。
メンテナンスの放棄:元のCodePlexリポジトリは廃止され、GitHubのフォークもアクティブにメンテナンスされていません。 セキュリティパッチ、バグ修正、新機能の開発は行いません。
プラットフォームの制限: FO.NETにはSystem.Drawingへの内部依存があるため、Linux/macOSでは動作せず、デプロイはWindowsのみの環境に制限されます。 最近のアプリケーションでは、クロスプラットフォームのデプロイがますます必要になっています。
不足しているモダンな機能: JavaScriptのサポートなし、CSS3の機能なし(Flexbox、Grid)、モダンなWebフォントなし、URLの直接レンダリング機能なし。
長所と考慮点
FO.NETの強み
- 直接XSL-FO変換: XSL-FOからPDFへの変換のために特別に最適化されています。
- オープンソース: Apache 2.0ライセンスは、使用、変更、配布が自由です。
- 正確な制御: XSL-FOは、文書のレイアウトを詳細に制御します。
FO.NETについての考察
- 時代遅れの技術: XSL-FO仕様は2006年以降更新されていません。
- XSL-FOの知識が必要: 専門知識を持つ開発者は全体の1%未満です。
- HTMLサポートなし: HTMLまたはCSSコンテンツをレンダリングできません。
- Abandoned: アクティブなメンテナンスまたはセキュリティアップデートはありません。
- Windowsのみ: System.Drawingの依存関係はクロスプラットフォームでの使用を妨げます。
- URLレンダリングなし:ウェブページを直接変換することはできません。
- 限られたドキュメント: リソースは古いです。
IronPDFの強み
IronPDFについての考察
- 商用ライセンス: 本番使用ライセンスが必要です。
- 異なるパラダイム: XSL-FOテンプレートはHTMLに変換する必要があります。
結論
FO.NETとIronPDFは.NETでPDFを生成するための根本的に異なるアプローチです。 FO.NETは、XSL-FOからPDFへの変換というニッチなユースケースに対応していますが、時代遅れの技術への依存、放棄されたメンテナンス、Windowsのみの制限、HTMLサポートの欠如により、新しいプロジェクトで正当化することがますます難しくなっています。
IronPDFはHTML/CSSウェブスタンダードを使用し、現在の開発者のスキルや技術に沿った最新のアプローチを提供します。 HTML、URLを直接レンダリングし、Chromiumエンジンで完全なCSS3を使用できるため、現代のPDF生成要件に適しています。
組織が.NET 10、C# 14、2026年までのアプリケーション開発を計画する中で、技術基盤は重要です。 レガシーなXSL-FOシステムを保守しているチームはFO.NETを使い続けるかもしれませんが、最新のPDF生成の道は明らかに既存のウェブ開発の専門知識を活用するIronPDFのようなHTMLベースのソリューションに向いています。
無料トライアルでIronPDFの評価を開始し、包括的なドキュメントを参照して、特定の要件への適合性を評価してください。
