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

Fluid(テンプレート)からIronPDFへの移行

Fluid(テンプレート)からIronPDFへの移行:完全なC#開発者ガイド

Fluidは、動的なテンプレートをレンダリングし、プレゼンテーションロジックからコンテンツを分離するための汎用的な方法を開発者に提供するテンプレート言語Liquidを実装する.NETライブラリです。 Fluidは、動的なテキスト出力を生成することに優れていますが、PDFの生成を直接サポートしていません-開発者は、HTML出力をPDF文書に変換するために、追加のPDFライブラリを統合する必要があります。 この2つのライブラリによるアプローチは、多くの開発チームが排除しようとしている複雑さをもたらします。

このガイドは、外部PDFライブラリを使ったFluid(テンプレート)からIronPDFへの完全な移行経路を、この移行を評価するプロの.NET開発者のために、ステップバイステップの手順、コード比較、実用的な例とともに提供します。

なぜFluid (Templating)からIronPDFに移行するのか

Fluidは優れたLiquidベースのテンプレートエンジンですが、PDF生成に使用することは非常に複雑です:

2つのライブラリへの依存:FluidはHTMLしか生成しません。PDFを作成するには、別のPDFライブラリ(wkhtmltopdf、PuppeteerSharpなど)が必要で、依存関係とメンテナンスの負担が2倍になります。

統合の複雑さ:2つのライブラリを調整することは、2組の設定、エラー処理、更新を管理することを意味します。 何かが壊れると、デバッグが難しくなります。

Liquid構文学習曲線:C# にはすでに強力な文字列処理機能が組み込まれているのに、開発者は Liquid テンプレート構文 ({{ }}, {% %}) を学ばなければなりません。

Limited PDF Control: PDF出力の品質は、専用のレンダリングエンジンではなく、Fluidと組み合わせるPDFライブラリに依存します。

デバッグの課題: テンプレート化またはPDF生成のいずれかの段階でエラーが発生する可能性があり、単一の統合ソリューションに比べてトラブルシューティングが難しくなります。

スレッド安全性の懸念TemplateContextはスレッドセーフではなく、並行アプリケーションでは慎重な管理が必要です。

IronPDFとFluid(テンプレート)の比較:機能の比較

アーキテクチャの違いを理解することは、技術的な意思決定者が移行への投資を評価するのに役立ちます:

アスペクトFluid + PDF ライブラリIronPDF
依存関係について2つ以上のパッケージ(Fluid + PDFライブラリ)単一パッケージ
テンプレート化するリキッド構文 ({{ }}<//code>)C# 文字列補間または Razor
PDFジェネレーション外部ライブラリが必要内蔵Chromiumエンジン
CSSサポートPDFライブラリに依存フルCSS3とFlexbox/Grid
JavaScript(ジャバスクリプトPDFライブラリに依存JavaScriptフルサポート
スレッドセーフティスレッドセーフではない TemplateContextChromePdfRendererはスレッドセーフです。
ラーニングカーブLiquid + PDF ライブラリ APIHTML/CSS(ウェブ標準)
エラー処理2つのエラーソース単一のエラーソース

クイックスタートFluidからIronPdfへの移行

これらの基本的なステップを踏めば、すぐにでも移行を開始できます。

ステップ 1: NuGet パッケージを置き換える。

Fluidと外部PDFライブラリを削除してください:

# Remove Fluid and external PDF library
dotnet remove package Fluid.Core
dotnet remove package WkHtmlToPdf-DotNet  # or whatever PDF library you used
dotnet remove package PuppeteerSharp       # if used
# Remove Fluid and external PDF library
dotnet remove package Fluid.Core
dotnet remove package WkHtmlToPdf-DotNet  # or whatever PDF library you used
dotnet remove package PuppeteerSharp       # if used
SHELL

IronPDFをインストールします:

# InstallIronPDF(all-in-one solution)
dotnet add package IronPdf
# InstallIronPDF(all-in-one solution)
dotnet add package IronPdf
SHELL

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

Fluid名前空間をIronPdfに置き換えてください:

// Before (Fluid + external PDF library)
using Fluid;
using Fluid.Values;
using SomeExternalPdfLibrary;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
// Before (Fluid + external PDF library)
using Fluid;
using Fluid.Values;
using SomeExternalPdfLibrary;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;  // For RenderingOptions
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ステップ 3: ライセンスの初期化

アプリケーション起動時のライセンス初期化を追加します:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

コード移行の例

基本的な HTML から PDF

最も基本的な操作によって、これらのアプローチの重要な違いが明らかになります。

流動的なアプローチ:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse("<html><body><h1>Hello {{name}}!</h1></body></html>");
        var context = new TemplateContext();
        context.SetValue("name", "World");
        var html = await template.RenderAsync(context);

        // Fluid only generates HTML - you'd need another library to convert to PDF
        File.WriteAllText("output.html", html);
    }
}
// NuGet: Install-Package Fluid.Core
using Fluid;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse("<html><body><h1>Hello {{name}}!</h1></body></html>");
        var context = new TemplateContext();
        context.SetValue("name", "World");
        var html = await template.RenderAsync(context);

        // Fluid only generates HTML - you'd need another library to convert to PDF
        File.WriteAllText("output.html", html);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World!</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World!</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Fluidは、FluidParserを作成し、テンプレート文字列を解析し、TemplateContextを作成し、各変数に対してSetValue()を呼び出し、HTMLを取得するために非同期にレンダリングし、そしてファイルに書き込む必要があります。 コード内のコメントには、"FluidはHTMLを生成するだけです。" "PDFに変換するには、別のライブラリが必要です。"と明記されています。

IronPDFはこの複雑さを解消します: レンダラーを作成し、RenderHtmlAsPdf()を呼び出し、直接PDFに保存します。 中間HTMLファイル、追加ライブラリはありません。

高度なHTMLからPDFへのシナリオについては、HTMLからPDFへの変換ガイドをご覧ください。

動的データを含む請求書テンプレート

複数の変数を持つドキュメントテンプレートは、テンプレートパターンの違いを明確に示します。

流動的なアプローチ:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>Invoice #{{invoiceNumber}}</h1>
                <p>Date: {{date}}</p>
                <p>Customer: {{customer}}</p>
                <p>Total: ${{total}}</p>
            </body></html>");

        var context = new TemplateContext();
        context.SetValue("invoiceNumber", "12345");
        context.SetValue("date", DateTime.Now.ToShortDateString());
        context.SetValue("customer", "John Doe");
        context.SetValue("total", 599.99);

        var html = await template.RenderAsync(context);
        // Fluid outputs HTML - requires additional PDF library
        File.WriteAllText("invoice.html", html);
    }
}
// NuGet: Install-Package Fluid.Core
using Fluid;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>Invoice #{{invoiceNumber}}</h1>
                <p>Date: {{date}}</p>
                <p>Customer: {{customer}}</p>
                <p>Total: ${{total}}</p>
            </body></html>");

        var context = new TemplateContext();
        context.SetValue("invoiceNumber", "12345");
        context.SetValue("date", DateTime.Now.ToShortDateString());
        context.SetValue("customer", "John Doe");
        context.SetValue("total", 599.99);

        var html = await template.RenderAsync(context);
        // Fluid outputs HTML - requires additional PDF library
        File.WriteAllText("invoice.html", html);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var invoiceNumber = "12345";
        var date = DateTime.Now.ToShortDateString();
        var customer = "John Doe";
        var total = 599.99;

        var html = $@"
            <html><body>
                <h1>Invoice #{invoiceNumber}</h1>
                <p>Date: {date}</p>
                <p>Customer: {customer}</p>
                <p>Total: ${total}</p>
            </body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("invoice.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var invoiceNumber = "12345";
        var date = DateTime.Now.ToShortDateString();
        var customer = "John Doe";
        var total = 599.99;

        var html = $@"
            <html><body>
                <h1>Invoice #{invoiceNumber}</h1>
                <p>Date: {date}</p>
                <p>Customer: {customer}</p>
                <p>Total: ${total}</p>
            </body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("invoice.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Fluidは、各変数にcontext.SetValue()を持つLiquidの{変数}}構文を使用しています。 コメントには "Fluid outputs HTML - requires additional PDF library. "と明記されています。IronPDFは標準的なC#の文字列補間($"{変数}")-開発者がすでに知っている構文-を使い、PDFに直接出力します。

IronPDFチュートリアルで、より多くの文書生成パターンをご覧ください。

ループを使用した動的データ

コレクションとループを使ったテンプレートは、制御フローの違いを示しています。

流動的なアプローチ:

// NuGet: Install-Package Fluid.Core
using Fluid;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>{{title}}</h1>
                <ul>
                {% for item in items %}
                    <li>{{item}}</li>
                {% endfor %}
                </ul>
            </body></html>");

        var context = new TemplateContext();
        context.SetValue("title", "My List");
        context.SetValue("items", new[] { "Item 1", "Item 2", "Item 3" });

        var html = await template.RenderAsync(context);
        // Fluid generates HTML only - separate PDF conversion needed
        File.WriteAllText("template-output.html", html);
    }
}
// NuGet: Install-Package Fluid.Core
using Fluid;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var parser = new FluidParser();
        var template = parser.Parse(@"
            <html><body>
                <h1>{{title}}</h1>
                <ul>
                {% for item in items %}
                    <li>{{item}}</li>
                {% endfor %}
                </ul>
            </body></html>");

        var context = new TemplateContext();
        context.SetValue("title", "My List");
        context.SetValue("items", new[] { "Item 1", "Item 2", "Item 3" });

        var html = await template.RenderAsync(context);
        // Fluid generates HTML only - separate PDF conversion needed
        File.WriteAllText("template-output.html", html);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPDFのアプローチ:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var title = "My List";
        var items = new[] { "Item 1", "Item 2", "Item 3" };

        var html = $@"
            <html><body>
                <h1>{title}</h1>
                <ul>";

        foreach (var item in items)
        {
            html += $"<li>{item}</li>";
        }

        html += "</ul></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("template-output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var title = "My List";
        var items = new[] { "Item 1", "Item 2", "Item 3" };

        var html = $@"
            <html><body>
                <h1>{title}</h1>
                <ul>";

        foreach (var item in items)
        {
            html += $"<li>{item}</li>";
        }

        html += "</ul></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("template-output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

FluidはLiquidの{% for item in items %}...{% endfor %}構文を使用しています。 コメントには "FluidはHTMLのみを生成します-別途PDF変換が必要です "と書かれています。IronPDFは標準的なC#のforeachループを使用します。

Fluid APIからIronPDFへのマッピングリファレンス

このマッピングは、APIと同等のものを直接示すことで、移行を加速します:

コア クラス マッピング

流体クラスIronPDF 同等物ノート
<コード>FluidParser</コード該当なし不要-C#文字列を使用してください。
<コード>FluidTemplate</コード該当なし不要
<コード>テンプレートコンテキスト</コードC#オブジェクト/文字列データを直接渡す
<コード>テンプレートオプション</コード<コード>レンダリングオプション</コードPDF出力設定
<コード>FluidValue</コードC#ネイティブタイプ変換不要
外部PDFクラス<コード>ChromePdfRenderer</コード主なレンダリングクラス

メソッドマッピング

流体メソッドIronPDF 同等物ノート
new FluidParser().new ChromePdfRenderer().代わりにレンダラーを作成
<コード>parser.Parse(ソース)</コード該当なし不要-HTMLは文字列です
template.RenderAsync(context).renderer.RenderHtmlAsPdf(html).直接PDFレンダリング
context.SetValue("key", value).var キー = 値;.C#変数を使用する

リキッド構文から C# へのマッピング

リキッド構文C#相当ノート
{{ 変数 }}<//code><コード>$"{変数}"</コード文字列の補間
{% for item in items %}<//code><コード>foreach (var item in items)C#ループ
{% if 条件 %}<//code>if (条件)C#条件付き
{{ x \|アップケース }}<コード>x.ToUpper()</コードC#メソッド
{{ x \|date: '%Y-%m-%d' }}.x.ToString("yyyy-MM-dd")C#フォーマット
{{ x \|数_with_precision: 2 }}x.ToString("F2").C#数値フォーマット

一般的な移行の問題と解決策

課題1:リキッド構文変換

Fluid: {変数}}{%制御%}構文を使用します。

解決策: C#の文字列補間と制御フローに置き換える:

// Liquid: {{ name | upcase }}
// C#: $"{name.ToUpper()}"

// Liquid: {% for item in items %}{{item}}{% endfor %}
// C#: foreach (var item in items) { html += $"{item}"; }
// Liquid: {{ name | upcase }}
// C#: $"{name.ToUpper()}"

// Liquid: {% for item in items %}{{item}}{% endfor %}
// C#: foreach (var item in items) { html += $"{item}"; }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

課題 2: TemplateContext 変数について

Fluid:データを渡すためにcontext.SetValue("key", value)を使用します。

解決策: C#の標準変数を使用する:

// Before (Fluid)
var context = new TemplateContext();
context.SetValue("customer", customerName);

// After (IronPDF)
var customer = customerName;
var html = $"<p>Customer: {customer}</p>";
// Before (Fluid)
var context = new TemplateContext();
context.SetValue("customer", customerName);

// After (IronPDF)
var customer = customerName;
var html = $"<p>Customer: {customer}</p>";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第3号:スレッドの安全性

Fluid:TemplateContextはスレッドセーフではないので、並行アプリケーションでは慎重な管理が必要です。

ソリューション: ChromePdfRendererはスレッドセーフで、スレッド間で共有できます:

// Thread-safe usage
private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] GeneratePdf(string html)
{
    var pdf = _renderer.RenderHtmlAsPdf(html);
    return pdf.BinaryData;
}
// Thread-safe usage
private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

public byte[] GeneratePdf(string html)
{
    var pdf = _renderer.RenderHtmlAsPdf(html);
    return pdf.BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

課題4: 2段階のエラー処理

流動的: テンプレート作成段階やPDF生成段階でエラーが発生する可能性があります。

ソリューション: IronPDFには1つのエラーソースがあります:

try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    // Single point of failure—easier debugging
    Console.WriteLine($"PDF generation failed: {ex.Message}");
}
try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    // Single point of failure—easier debugging
    Console.WriteLine($"PDF generation failed: {ex.Message}");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

流体マイグレーション チェックリスト

マイグレーション前のタスク

コードベースを監査し、すべてのFluidの使用法を特定します:

# Find all Fluid references
grep -r "FluidParser\|FluidTemplate\|TemplateContext\|using Fluid" --include="*.cs" --include="*.csproj" .

# Find Liquid template files
find . -name "*.liquid" -o -name "*.html" | xargs grep -l "{{"
# Find all Fluid references
grep -r "FluidParser\|FluidTemplate\|TemplateContext\|using Fluid" --include="*.cs" --include="*.csproj" .

# Find Liquid template files
find . -name "*.liquid" -o -name "*.html" | xargs grep -l "{{"
SHELL

ファイルの場所、使用する変数、ループと条件式、外部PDFライブラリの設定など、すべてのテンプレートを文書化すること。

コード更新タスク

1.Fluid.CoreのNuGetパッケージの削除 2.外部PDFライブラリパッケージの削除 3.IronPdf NuGetパッケージをインストールする 4.名前空間のインポートをFluidからIronPdfに更新してください。 5.{変数}}$"{変数}"に変換してください。 6.{% for item in collection %}<//code> を C# foreach<//code> に変換する。 7.{% if 条件 %}<//code> を C# の if<//code> ステートメントに変換する。 8.Liquid フィルタを C# メソッドに変換する (例: C# メソッド)|upcase.ToUpper()) 9.FluidParserChromePdfRendererに置き換えてください。 10.TemplateContext.SetValue()を直接C#変数に置き換える 11.外部PDFライブラリ呼び出しを削除 12.起動時にIronPDFライセンスの初期化を追加する

移行後のテスト

移行後、これらの点を検証してください:

  • PDF出力が期待値と一致していることを確認
  • すべてのテンプレートバリエーションが正しくレンダリングされることをテストする
  • 画像とスタイルが正しく表示されることを確認
  • 改ページが正しく行われることを検証する
  • さまざまなデータサイズでテスト
  • パフォーマンステスト vs Fluid + 外部ライブラリ
  • 同時実行シナリオにおけるスレッドセーフのテスト

クリーンアップタスク

  • .liquidテンプレートファイルの削除(不要になった場合)
  • Fluid関連のヘルパーコードを削除する
  • ドキュメントの更新
  • 未使用の依存関係のクリーンアップ

IronPDFに移行する主な利点

外部PDFライブラリを使ったFluid(テンプレート化)からIronPDFに移行することで、いくつかの重要な利点が得られます:

シングルパッケージ・ソリューション:2つのライブラリ依存を排除します。 IronPDFはテンプレート作成(HTML/CSS経由)とPDF生成の両方を1つのパッケージで行います。

新しい構文を覚える必要はありません:液体のテンプレート構文を学ぶ代わりに、標準のC#文字列補間と制御フローを使用してください。

スレッドセーフレンダリングChromePdfRendererは、TemplateContextとは異なりスレッドセーフで、同時PDF生成を簡素化します。

Chromiumレンダリングエンジン:業界標準のレンダリングにより、FlexboxやGridを含むCSS3の完全なサポートに加え、JavaScriptの完全な実行を保証します。

単一のエラーソース:テンプレート作成とPDF生成の段階を調整する代わりに、トラブルシューティングを行うライブラリが1つだけなので、デバッグが簡単になります。

アクティブ開発:2026年まで.NET 10とC# 14の採用が増加する中、IronPDFの定期的なアップデートは現在と将来の.NETバージョンとの互換性を保証します。

結論

Fluid(テンプレート化)は、Liquid構文を使用したコンテンツの分離と動的なテキスト作成の柔軟性を求める開発者に優れたソリューションを提供します。 ただし、ライブラリは明示的にPDFを生成しません。 このため、追加のPDFライブラリと統合する必要があり、2つのライブラリに依存することになり、複雑さ、デバッグの難しさ、メンテナンスの負担が増えます。

IronPDFは複数の依存関係を排除するオールインワンのソリューションを提供します。 NuGetパッケージの置き換え、Liquid構文のC#文字列補間への変換、IronPDFの組み込みChromiumレンダリングエンジンによる直接PDF出力などです。

IronPDFの無料トライアルで今すぐ移行を開始し、PDF生成ワークフローを簡素化しましょう。

包括的な実装ガイダンスについては、IronPDFドキュメントチュートリアルをご覧ください。

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

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

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