Fluid(テンプレート)からIronPDFへの移行
Fluid は、Liquid テンプレート言語を実装する.NETライブラリであり、動的なテンプレートをレンダリングし、コンテンツをプレゼンテーション ロジックから分離する柔軟な方法を開発者に提供します。 Fluid は動的なテキスト出力を生成するのに効果的ですが、PDF 生成を直接サポートしていません。開発者は、HTML 出力を PDF ドキュメントに変換するために追加の PDF ライブラリを統合する必要があります。 この2つのライブラリによるアプローチは、多くの開発チームが排除しようとしている複雑さをもたらします。
このガイドは、外部PDFライブラリを使ったFluid(テンプレート)からIronPDFへの完全な移行経路を、この移行を評価するプロ for .NET開発者のために、ステップバイステップの手順、コード比較、実用的な例とともに提供します。
なぜFluid (Templating)からIronPDFに移行するのか
Fluid は堅牢な Liquid ベースのテンプレート エンジンですが、PDF 生成に使用すると、大幅な複雑さが生じます。
2 つのライブラリの依存関係: Fluid は HTML のみを生成します。PDF を作成するには別の PDF ライブラリ (wkhtmltopdf、PuppeteerSharp など) が必要となり、依存関係とメンテナンスの負担が 2 倍になります。
統合の複雑さ: 2 つのライブラリを調整するには、2 セットの構成、エラー処理、および更新を管理する必要があります。 何かが壊れると、デバッグが難しくなります。
Liquid 構文の学習曲線: C# にはすでに強力な文字列処理機能が組み込まれていますが、開発者は Liquid テンプレート構文 ({% %}) を学習する必要があります。
制限された PDF コントロール: PDF 出力の品質は、専用のレンダリング エンジンではなく、Fluid と組み合わせる PDF ライブラリによって決まります。
デバッグの課題:テンプレート作成段階または PDF 生成段階のいずれかでエラーが発生する可能性があり、単一の統合ソリューションを使用する場合よりもトラブルシューティングが困難になります。
スレッド セーフに関する懸念: TemplateContext はスレッド セーフではないため、同時実行アプリケーションでは慎重な管理が必要です。
IronPDFとFluid(テンプレート)の比較:機能の比較
アーキテクチャの違いを理解することは、技術的な意思決定者が移行への投資を評価するのに役立ちます:
| アスペクト | Fluid + PDF ライブラリ | IronPDF |
|---|---|---|
| 依存関係について | 2つ以上のパッケージ(Fluid + PDFライブラリ) | 単一パッケージ |
| テンプレート化する。 | リキッド構文 ({{ }}) |
C# 文字列補間または Razor |
| PDFジェネレーション。 | 外部ライブラリが必要 | 内蔵Chromiumエンジン |
| CSSサポート | PDFライブラリに依存 | フルCSS3とFlexbox/Grid |
| JavaScript(JavaScript | PDFライブラリに依存 | JavaScriptフルサポート |
| スレッドセーフティ | スレッドセーフではない TemplateContext | ChromePdfRendererはスレッドセーフです。 |
| ラーニングカーブ | Liquid + PDF ライブラリ API | HTML/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
IronPDFをインストールします:
# InstallIronPDF(all-in-one solution)
dotnet add package IronPdf
# InstallIronPDF(all-in-one solution)
dotnet add package IronPdf
ステップ 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
Imports Fluid
Imports Fluid.Values
Imports SomeExternalPdfLibrary
Imports IronPdf
Imports IronPdf.Rendering ' For RenderingOptions
ステップ 3: ライセンスの初期化
アプリケーション起動時のライセンス初期化を追加します:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
コード移行の例
基本的な 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);
}
}
Imports Fluid
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim parser As New FluidParser()
Dim template = parser.Parse("<html><body><h1>Hello {{name}}!</h1></body></html>")
Dim context As New TemplateContext()
context.SetValue("name", "World")
Dim html = Await template.RenderAsync(context)
' Fluid only generates HTML - you'd need another library to convert to PDF
File.WriteAllText("output.html", html)
End Function
End Module
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html = "<html><body><h1>Hello World!</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
Fluid では、FluidParser を作成し、テンプレート文字列を解析し、TemplateContext を作成し、各変数に対して SetValue() を呼び出し、非同期にレンダリングして HTML を取得し、ファイルに書き込む必要がありますが、これはまだ PDF ではありません。 コード内のコメントには、"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);
}
}
Imports Fluid
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim parser As New FluidParser()
Dim template = parser.Parse("
<html><body>
<h1>Invoice #{{invoiceNumber}}</h1>
<p>Date: {{date}}</p>
<p>Customer: {{customer}}</p>
<p>Total: ${{total}}</p>
</body></html>")
Dim context As New TemplateContext()
context.SetValue("invoiceNumber", "12345")
context.SetValue("date", DateTime.Now.ToShortDateString())
context.SetValue("customer", "John Doe")
context.SetValue("total", 599.99)
Dim html = Await template.RenderAsync(context)
' Fluid outputs HTML - requires additional PDF library
File.WriteAllText("invoice.html", html)
End Function
End Module
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");
}
}
Imports IronPdf
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim invoiceNumber As String = "12345"
Dim [date] As String = DateTime.Now.ToShortDateString()
Dim customer As String = "John Doe"
Dim total As Double = 599.99
Dim html As String = $"
<html><body>
<h1>Invoice #{invoiceNumber}</h1>
<p>Date: {[date]}</p>
<p>Customer: {customer}</p>
<p>Total: ${total}</p>
</body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
End Sub
End Module
Fluid は、各変数に対して Liquid の {{variable}} 構文と context.SetValue() を使用します。 コメントには、"Fluid は HTML を出力します。追加の PDF ライブラリが必要です"と明記されています。IronPDFは、構文開発者がすでに知っている標準の C# 文字列補間 ($"{variable}") を使用して、直接 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);
}
}
Imports Fluid
Imports System.Collections.Generic
Imports System.IO
Imports System.Threading.Tasks
Class Program
Shared Async Function Main() As Task
Dim parser As New FluidParser()
Dim template = parser.Parse("
<html><body>
<h1>{{title}}</h1>
<ul>
{% for item in items %}
<li>{{item}}</li>
{% endfor %}
</ul>
</body></html>")
Dim context As New TemplateContext()
context.SetValue("title", "My List")
context.SetValue("items", New String() {"Item 1", "Item 2", "Item 3"})
Dim html = Await template.RenderAsync(context)
' Fluid generates HTML only - separate PDF conversion needed
File.WriteAllText("template-output.html", html)
End Function
End Class
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");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim title As String = "My List"
Dim items As String() = {"Item 1", "Item 2", "Item 3"}
Dim html As String = $"
<html><body>
<h1>{title}</h1>
<ul>"
For Each item As String In items
html += $"<li>{item}</li>"
Next
html += "</ul></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("template-output.pdf")
End Sub
End Module
Fluid は Liquid の {% for item in items %}...{% endfor %} 構文を使用します。これは、テンプレート言語開発者が習得する必要がある構文です。 コメントには、"Fluid は HTML のみを生成するため、別途 PDF 変換が必要です"と記載されています。IronPDFは標準の C# foreach ループを使用するため、新しい構文を学習する必要はなく、直接 PDF に出力します。
Fluid APIからIronPDFへのマッピングリファレンス
このマッピングは、APIと同等のものを直接示すことで、移行を加速します:
コア クラス マッピング
| 流体クラス | IronPDF 同等物 |
|---|---|
FluidParser |
該当なし |
FluidTemplate |
該当なし |
TemplateContext |
C#オブジェクト/文字列 |
TemplateOptions |
RenderingOptions |
FluidValue |
C#ネイティブタイプ |
| 外部PDFクラス | ChromePdfRenderer |
メソッドマッピング
| 流体メソッド | IronPDF 同等物 |
|---|---|
new FluidParser() |
new ChromePdfRenderer() |
parser.Parse(source) |
該当なし |
template.RenderAsync(context) |
renderer.RenderHtmlAsPdf(html) |
context.SetValue("key", value) |
var key = value; |
リキッド構文から C# へのマッピング
| リキッド構文 | C#相当 |
|---|---|
{{ variable }} |
$"{variable}" |
{% for item in items %} |
foreach (var item in items) |
{% if condition %} |
if (condition) |
{{ x \|アップケース }} |
x.ToUpper() |
{{ x \|date: '%Y-%m-%d' }}. |
x.ToString("yyyy-MM-dd") |
{{ x \|数_with_precision: 2 }}。 |
x.ToString("F2") |
一般的な移行の問題と解決策
課題1:リキッド構文変換
Fluid: {{ variable }} および {% control %} 構文を使用します。
解決策: 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}"; }
課題 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>";
' Before (Fluid)
Dim context As New TemplateContext()
context.SetValue("customer", customerName)
' After (IronPDF)
Dim customer = customerName
Dim html = $"<p>Customer: {customer}</p>"
第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;
}
' Thread-safe usage
Private Shared ReadOnly _renderer As New ChromePdfRenderer()
Public Function GeneratePdf(html As String) As Byte()
Dim pdf = _renderer.RenderHtmlAsPdf(html)
Return pdf.BinaryData
End Function
課題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}");
}
Try
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Catch ex As Exception
' Single point of failure—easier debugging
Console.WriteLine($"PDF generation failed: {ex.Message}")
End Try
流体マイグレーション チェックリスト
マイグレーション前のタスク
コードベースを監査し、すべての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 "{{"
ファイルの場所、使用する変数、ループと条件式、外部PDFライブラリの設定など、すべてのテンプレートを文書化すること。
コード更新タスク
1.Fluid.CoreのNuGetパッケージの削除 2.外部PDFライブラリパッケージの削除 3.IronPdf NuGetパッケージをインストールする
- 名前空間のインポートを
FluidからIronPdfに更新します。 {{ variable }}を$"{variable}"に変換します。{% for item in collection %}を C#foreachに変換する{% if condition %}を C# のifステートメントに変換する 8.Liquid フィルタを C# メソッドに変換する (例:C# メソッド)| 大文字に変換→.ToUpper())FluidParserをChromePdfRendererに置き換えます。TemplateContext.SetValue()を直接 C# 変数に置き換える 11.外部PDFライブラリ呼び出しを削除 12.起動時にIronPDFライセンスの初期化を追加する
移行後のテスト
移行後、これらの点を検証してください:
- PDF出力が期待値と一致していることを確認
- すべてのテンプレートバリエーションが正しくレンダリングされることをテストする
- 画像とスタイルが正しく表示されることを確認
- 改ページが正しく行われることを検証する
- さまざまなデータサイズでテスト
- パフォーマンステスト vs Fluid + 外部ライブラリ
- 同時実行シナリオにおけるスレッドセーフのテスト
クリーンアップタスク
.liquidテンプレートファイルを削除する(不要になった場合)- Fluid関連のヘルパーコードを削除する
- ドキュメントの更新
- 未使用の依存関係のクリーンアップ
IronPDFに移行する主な利点
外部PDFライブラリを使ったFluid(テンプレート化)からIronPDFに移行することで、いくつかの重要な利点が得られます:
単一パッケージ ソリューション: 2 つのライブラリの依存関係を排除します。 IronPDFはテンプレート作成(HTML/CSS経由)とPDF生成の両方を1つのパッケージで行います。
新しい構文を学習する必要はありません: Liquid テンプレート構文を学習する代わりに、標準の C# 文字列補間と制御フローを使用します。
スレッドセーフなレンダリング: ChromePdfRenderer は、TemplateContext とは異なり、スレッドセーフであるため、同時 PDF 生成が簡素化されます。
Chromium レンダリング エンジン:業界標準のレンダリングにより、Flexbox や Grid を含む完全な CSS3 サポートと、完全なJavaScript実行が保証されます。
単一のエラー ソース:テンプレートと PDF 生成ステージ間の調整を行う代わりに、トラブルシューティングするライブラリが 1 つだけなので、デバッグが簡単になります。
積極的な開発: .NET 10 と C# 14 の採用が 2026 年まで増加するにつれて、IronPDF の定期的な更新により、現在のおよび将来 for .NETバージョンとの互換性が確保されます。

