fo.netからIronPDFへの移行方法
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:block 、 fo:table 、 fo:page-sequenceなど) を使用した複雑な XML ベースのマークアップを学習する必要があります。
- HTML/CSS はサポートされていません。fo.net は HTML または CSS をレンダリングできないため、HTML から XSL-FO マークアップへの手動変換が必要です。
4.メンテナンスされていない:元の CodePlex リポジトリは廃止されています。 GitHubのフォークは現在アクティブにメンテナンスされていません。
- Windows のみ: fo.net は
System.Drawingに内部的に依存しているため、Linux/macOS では動作しません。
6.最新機能が限られている:JavaScriptのサポート、CSS3、フレックスボックス/グリッド、最新の Web フォントはありません。
- URL レンダリングなし: fo.net は Web ページを直接レンダリングできないため、手動で HTML から XSL-FO に変換する必要があります。
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を作成することができます。
始める前に
前提条件
- .NET環境: IronPDFは.NET Framework 4.6.2以降、.NET Core 3.1以降、.NET 5/6/7/8/9以降をサポートしています。
- 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"すべての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*"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ステップ 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;ステップ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";ステップ 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");完全な API リファレンス
名前空間マッピング
| fo.net 名前空間 | IronPDF 同等物 | ノート |
|---|---|---|
| <コード>Fonet</コード | IronPdf(アイアンPDF | 主な名前空間 |
| <コード>Fonet.Render.Pdf</コード | IronPdf(アイアンPDF | PDFレンダリング |
| <コード>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> | ルート要素 |
| CSS @pageルール | ページ設定 |
<fo:simple-page-master>。 | CSS <コード>@ページ</コード | ページ定義 |
| <body> または <div> を使用してください。 | ページ内容 |
<fo:flow>のようにします。 | <main> または <div> を使用してください。 | 主な内容 |
| <コード>HtmlHeaderFooter</コード | ヘッダー/フッター |
<fo:block>のようにします。 | <p>、<div>、<h1>-<h6>。 | ブロックコンテンツ |
<fo:inline>のようにします。 | <span> | インラインコンテンツ |
| <table> | 表 |
| <tr> | 表の行 |
| <td>、<th>。 | 表セル |
| <ul>、<ol>。 | リスト |
| <li> | リスト項目 |
| <img> | 画像 |
| <コード>{ページ}</コード>プレースホルダ | ページ数 |
| <コード>{総ページ数}</コード | 総ページ数 |
| <a href> | ハイパーリンク |
XSL-FOプロパティからCSSへ
| XSL-FOプロパティ | CSS相当 | 翻訳例 |
|---|---|---|
font-family | font-family | 同じ構文 |
| <コード>フォントサイズ</コード | <コード>フォントサイズ</コード | 同じ構文 |
| <コード>フォントウェイト</コード | <コード>フォントウェイト</コード | bold、normal、700。 |
| <コード>テキストアライン</コード | <コード>テキストアライン</コード | left、center、right、justify。 |
| <コード>カラー</コード | <コード>カラー</コード | 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));
}
}翻訳後(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");
}
}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));
}
}翻訳後(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");
}
}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();
}
}翻訳後(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");
}
}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>翻訳後(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
};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翻訳後(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;
}パフォーマンスの考慮事項
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;
}ユニット変換ヘルパー
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 inchpublic 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トラブルシューティング
課題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);課題2:fo:blockからHTMLへのマッピング
問題:何が問題なのか分からない<fo:block>なるはずです。
解決策:適切なセマンティック HTML を使用します。
- 見出し
<h1>から<h6>まで - 段落
<p> - 一般的なコンテナ
<div>のようにします。 - インラインテキスト
<span>
問題3:フォントが一致しない
問題:フォントが fo.net 出力と異なります。
解決策: Web フォントを使用するか、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>課題4:ページ番号が機能しない
問題:<fo:page-number/>動作しません。
解決策:ヘッダー/フッターに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
};移行チェックリスト
移行前
- すべての XSL-FO テンプレート ファイル (
.fo、.xslfo) をカタログ化します。 - 文書ページの寸法と使用される余白
- ヘッダー/フッターの設定(
fo:static-content) - 表の構造とスタイルを識別する
- バージョン管理にプロジェクトをバックアップする
- IronPDFライセンスキーを取得する
パッケージの移行
FonetまたはFO.NETパッケージを削除します:dotnet remove package FonetIronPdfパッケージをインストールします:dotnet add package IronPdfFonetからIronPdfへの名前空間のインポートを更新- 起動時にIronPDFライセンスキーを設定する
コードの移行
FonetDriver.Make()をnew ChromePdfRenderer()に置き換えますdriver.Render()をrenderer.RenderHtmlAsPdf()に置き換えます- ストリームからのファイル出力を
pdf.SaveAs()に更新します - エラーイベントハンドラをtry/catchに置き換える
fo:static-contentをHtmlHeaderFooterに変換する- 交換する
<fo:page-number/>``{page}プレースホルダー付き
テスティング
- 出力の外観を元のfo.net PDFと比較する
- ページのサイズと余白を確認する
- ヘッダーとフッターを確認する
- ページ番号を検証する
- テストテーブルのレンダリング
- 画像の読み込みを確認する
移行後
.foおよび.xslfoテンプレートファイルを削除します- fo.net関連のコードとユーティリティを削除する
- ドキュメントの更新
リファレンスを参照してください。






