Fluid (템플릿)에서 IronPDF로 마이그레이션
Fluid는 Liquid 템플릿 언어를 구현한 .NET 라이브러리로, 개발자에게 동적 템플릿을 렌더링하고 콘텐츠와 프레젠테이션 로직을 분리하는 유연한 방법을 제공합니다. Fluid는 동적 텍스트 출력을 생성하는 데 효과적이지만, PDF 생성의 직접적인 지원은 제공하지 않습니다. 개발자는 HTML 출력을 PDF 문서로 변환하기 위해 추가적인 PDF 라이브러리를 통합해야 합니다. 이 두 라이브러리 접근 방식은 많은 개발 팀이 제거하고자 하는 복잡성을 도입합니다.
이 가이드는 Fluid(템플릿)와 외부 PDF 라이브러리에서 IronPDF로의 완전한 이주 경로를 제공합니다. 이는 단계별 설명서, 코드 비교, 그리고 이 전환을 평가하는 전문 .NET 개발자를 위한 실용적인 예제를 포함합니다.
왜 Fluid(템플릿)에서 IronPDF로 전환해야 하는가
Fluid는 견고한 Liquid 기반의 템플릿 엔진이지만 PDF 생성을 위해 사용한다면 상당한 복잡성을 도입합니다:
이중 라이브러리 의존성: Fluid는 HTML만 생성합니다. PDF를 만들기 위해 별도의 PDF 라이브러리(wkhtmltopdf, PuppeteerSharp 등)가 필요하여 의존성과 유지 관리 부담이 두 배로 늘어납니다.
통합 복잡성: 두 개의 라이브러리를 조정하려면 두 세트의 구성, 오류 처리, 업데이트를 관리해야 합니다. 무언가가 고장 나면 디버깅이 더 어려워집니다.
Liquid 구문 학습 곡선: 개발자는 C#에 이미 강력한 문자열 처리 기능이 내장되어 있음에도 불구하고 Liquid 템플릿 구문 ({{ }}, {% %})을 배워야 합니다.
제한된 PDF 제어: PDF 출력 품질은 Fluid와 짝지어 선택한 PDF 라이브러리에 따라 달라지며, 전용 렌더링 엔진에 달려 있지 않습니다.
디버깅 문제: 오류는 템플릿 생성 단계 또는 PDF 생성 단계에서 발생할 수 있어 단일 통합 솔루션에 비해 문제 해결이 더 어렵습니다.
스레드 안전성 문제: TemplateContext은 스레드 안전하지 않으며 동시 애플리케이션에서 주의 깊은 관리가 필요합니다.
IronPDFvs Fluid(템플릿): 기능 비교
구조적 차이를 이해하면 기술 결정을 내리는데 이주 투자를 평가하는데 도움이 됩니다:
| 측면 | Fluid + PDF 라이브러리 | IronPDF |
|---|---|---|
| 종속성 | 2+ 패키지 (Fluid + PDF 라이브러리) | 단일 패키지 |
| 템플릿화 | Liquid 구문 ({{ }}) |
C# 문자열 보간 또는 Razor |
| PDF 생성 | 외부 라이브러리 필요 | 내장 Chromium 엔진 |
| CSS 지원 | PDF 라이브러리에 따라 다름 | 전체 CSS3와 Flexbox/Grid 제공 |
| JavaScript | PDF 라이브러리에 따라 다름 | 전체 JavaScript 지원 |
| 스레드 안전성 | TemplateContext는 스레드 안전성 없음 | ChromePdfRenderer는 스레드 안전성 있음 |
| 학습 곡선 | Liquid + PDF 라이브러리 API | HTML/CSS (웹 표준) |
| 오류 처리 | 두 가지 오류 소스 | 단일 오류 소스 |
빠른 시작: 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로
가장 기본적인 작업이 이 접근 방식 간의 주요 차이를 보여줍니다.
Fluid 접근법:
// 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 to PDF 변환 가이드를 참조하십시오.
동적 데이터가 포함된 인보이스 템플릿
여러 변수를 가진 문서 템플릿은 템플릿 패턴 차이를 명확하게 보여줍니다.
Fluid 접근법:
// 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는 각 변수에 대해 context.SetValue()와 함께 Liquid의 {{variable}} 구문을 사용합니다. 주석은 명시적으로 "Fluid는 HTML을 출력합니다 - 추가적인 PDF 라이브러리가 필요합니다."라고 기재되어 있습니다. IronPDF는 개발자가 이미 알고 있는 표준 C# 문자열 보간법 ($"{variable}")을 사용하여 PDF로 직접 출력합니다.
더 많은 문서 생성 패턴을 보려면 IronPDF 튜토리얼을 탐색하십시오.
반복문이 포함된 동적 데이터
컬렉션과 반복문을 가진 템플릿은 제어 흐름의 차이를 보여줍니다.
Fluid 접근법:
// 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; |
Liquid 문법과 C# 매핑
| Liquid 구문 | C# 등가물 |
|---|---|
{{ variable }} |
$"{variable}" |
{% for item in items %} |
foreach (var item in items) |
{% if condition %} |
if (condition) |
{{ x \|upcase }} |
x.ToUpper() |
{{ x \|date: '%Y-%m-%d' }} |
x.ToString("yyyy-MM-dd") |
{{ x \|number_with_precision: 2 }} |
x.ToString("F2") |
일반적인 마이그레이션 문제와 해결책
문제 1: Liquid 문법 변환
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: 두 단계 오류 처리
플루이드: 오류는 템플릿 단계 또는 PDF 생성 단계에서 발생할 수 있음.
해결책: IronPDF는 단일 오류 소스를 가짐:
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
플루이드 마이그레이션 체크리스트
이동 전 작업
모든 플루이드 사용을 식별하기 위해 코드베이스 감사:
# 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 라이브러리 구성.
코드 업데이트 작업
- Fluid.Core NuGet 패키지 제거
- 외부 PDF 라이브러리 패키지 제거
- IronPdf NuGet Install-Package
- 네임스페이스 임포트를
Fluid에서IronPdf로 업데이트합니다. {{ variable }}를$"{variable}"로 변환합니다.{% for item in collection %}를 C#foreach로 변환합니다.{% if condition %}를 C#if문으로 변환합니다.- Liquid 필터를 C# 메서드로 변환 (예:
|upcase→.ToUpper()) FluidParser을ChromePdfRenderer로 교체합니다.TemplateContext.SetValue()을 직접적인 C# 변수로 교체합니다.- 외부 PDF 라이브러리 호출 제거
- 시작 시IronPDF라이선스 초기화 추가
마이그레이션 후 테스트
마이그레이션 후 다음 측면을 검증:
- PDF 출력이 기대와 일치하는지 확인
- 모든 템플릿 변형이 정확하게 렌더링되는지 테스트
- 이미지와 스타일링이 제대로 표시되는지 확인
- 페이지 구분이 제대로 발생하는지 검증
- 다양한 데이터 크기로 테스트
- 플루이드 + 외부 라이브러리 대비 성능 테스트
- 동시 시나리오에서 스레드 안전성 테스트
정리 작업
.liquid템플릿 파일을 삭제합니다 (더 이상 필요하지 않은 경우)- 플루이드 관련 헬퍼 코드 제거
- 문서 업데이트
- 사용하지 않는 종속성 정리
IronPDF로 마이그레이션할 때의 주요 이점
외부 PDF 라이브러리와 Fluid(템플릿)에서 IronPDF로 이동하면 여러 중요한 이점을 제공합니다:
단일 패키지 솔루션: 두 개의 라이브러리 종속성을 제거합니다. IronPDF는 하나의 패키지에서 템플릿(HTML/CSS 통해) 및 PDF 생성을 처리합니다.
신규 구문 학습 불필요: Liquid 템플릿 구문을 학습하지 않고 표준 C# 문자열 보간 및 제어 흐름 사용.
스레드 안전 렌더링: ChromePdfRenderer은 TemplateContext와 달리 스레드 안전하여 동시 PDF 생성이 간단해집니다.
Chromium 렌더링 엔진: 업계 표준 렌더링은 Flexbox 및 Grid를 포함한 전체 CSS3 지원과 JavaScript의 완전한 실행을 보장합니다.
단일 오류 소스: 디버깅이 템플릿 및 PDF 생성 단계 간의 조정 대신 한 라이브러리만 있는 경우 더 간단해집니다.
활발한 개발: .NET 10 및 C# 14의 채택이 2026년까지 증가함에 따라 IronPDF의 정기 업데이트는 현재 및 미래의 .NET 버전과의 호환성을 보장합니다.

