C#에서 DynamicPDF에서 IronPDF로 마이그레이션하는 방법
DynamicPDF에서 IronPDF로 마이그레이션해야 하는 이유는?
DynamicPDF의 제품 분할이 마이그레이션의 주요 요인입니다. 라이선스 모델을 이해하는 것은 현재 구현의 실제 비용을 평가하는 데 필수적입니다.
제품 분할 문제
DynamicPDF는 개별 제품과 개별 라이선스로 판매됩니다:
- DynamicPDF Generator: 처음부터 PDF 생성
- DynamicPDF Merger: 기존 PDF 병합, 분할 및 조작(별도 구매)
- DynamicPDF Core Suite: Generator와 Merger 결합
- DynamicPDF ReportWriter: 보고서 생성
- DynamicPDF HTML Converter: HTML을 PDF로 변환(별도 추가 기능)
- DynamicPDF Print Manager: 프로그래밍 방식으로 PDF 인쇄
완전한 PDF 솔루션을 위해서는 DynamicPDF로 3-5개의 개별 라이선스가 필요합니다. IronPDF는 모든 것을 한 패키지에 포함시킵니다.
아키텍처 비교
| 측면 | DynamicPDF | IronPDF |
|---|---|---|
| 제품 모델 | 단편화된 (5개 이상의 제품) | 모든 기능 통합된 라이브러리 |
| 라이선스 | 여러 라이선스 필요 | 단일 라이선스 |
| HTML to PDF | 별도 애드온 구매 필요 | 내장, Chromium 기반 |
| CSS 지원 | 제한됨 (애드온 요구) | 전체 CSS3와 Flexbox/Grid 제공 |
| API 스타일 | 좌표 기반 포지셔닝 | HTML/CSS + 조작 API |
| 학습 곡선 | 가파름 (여러 API) | 완만함 (웹 기술) |
| 최신 .NET | .NET Standard 2.0 | .NET 6/7/8/9+ 네이티브 |
주요 마이그레이션 혜택
- 단일 패키지: 하나의 NuGet 패키지가 3-5개의DynamicPDF패키지를 대체함
- 현대적 렌더링: Chromium 엔진 대 레거시 렌더링
- 웹 기술: 좌표 기반 위치 지정 대신 HTML/CSS 사용
- 간편한 API: 코드가 적고, 읽기 쉽고, 유지 보수가 간편함
- 추가 구매 없음: HTML, 병합, 보안 모두 포함
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 또는 VS Code와 C# 확장
- NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)
DynamicPDF사용 감사
해결책 디렉토리에서 이 명령을 실행하여 모든DynamicPDF참조를 식별합니다:
# Find allDynamicPDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
# Find allDynamicPDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic
찾을 일반 패키지:
ceTe.DynamicPDF.CoreSuite.NETceTe.DynamicPDF.Generator.NETceTe.DynamicPDF.Merger.NETceTe.DynamicPDF.HtmlConverter.NET
패러다임 변화 이해
DynamicPDF에서 IronPDF로 마이그레이션할 때 가장 큰 변화는 문서 생성에 대한 기본적인 접근 방식입니다. DynamicPDF는 특정 X,Y 좌표에 요소를 배치하는 좌표 기반 위치 지정을 사용합니다. IronPDF는 웹 기술을 사용하여 디자인하는 HTML/CSS 렌더링을 사용합니다.
이 패러다임 전환은 Label, TextArea 및 Table2 요소를 HTML 등가물로 변환하는 것을 의미합니다. 이는 일반적으로 더 읽기 쉽고 유지 관리하기 쉬운 코드로 이어집니다.
단계별 마이그레이션 프로세스
1단계: NuGet 패키지 업데이트
모든DynamicPDF패키지를 제거하고 IronPDF를 설치합니다:
# RemoveDynamicPDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf
# RemoveDynamicPDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf
2단계: 네임스페이스 참조 업데이트
DynamicPDF 네임스페이스를 IronPDF로 대체합니다:
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;
Imports IronPdf
3단계: 라이선스 구성
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
완전한 API 마이그레이션 참조
핵심 클래스 매핑
| DynamicPDF클래스 | IronPDF 동등 |
|---|---|
Document |
ChromePdfRenderer |
Document |
PdfDocument |
Page |
페이지 나눔이 있는 HTML <div> |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
페이지 요소를 HTML에 매핑하기
| DynamicPDF PageElement | IronPDF/HTML 동등한 요소 |
|---|---|
Label |
<p>, <span>, <div> |
TextArea |
CSS와 함께 <div>, <p> |
Image |
<img> 태그 |
Table2 |
HTML <table> |
PageNumberingLabel |
{page} / {total-pages} 플레이스홀더 |
주요 API 매핑
| DynamicPDF | IronPDF |
|---|---|
Document + Page |
ChromePdfRenderer |
Label, TextArea |
HTML <p>, <div> |
Table2 |
HTML <table> |
MergeDocument |
PdfDocument.Merge() |
HtmlConverter |
ChromePdfRenderer |
document.Draw() |
pdf.SaveAs() / pdf.BinaryData |
PageNumberingLabel %%CP%% |
{page} 플레이스홀더 |
코드 마이그레이션 예제
HTML을 PDF로 변환
HTML에서 PDF로의 변환은 IronPDF의 내장된 Chromium 렌더링과 달리 별도의 HtmlConverter 애드온이 필요한 DynamicPDF의 요구 사항을 보여줍니다.
DynamicPDF 구현:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim converter As New HtmlConverter(html)
converter.Convert("output.pdf")
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF의 ChromePdfRenderer는 별도의 애드온 구매 없이도 전체 CSS3 지원과 Chromium 기반 렌더링을 제공합니다. 더 많은 옵션을 보려면 HTML to PDF 문서를 참조하세요.
여러 PDF 병합
PDF 병합은 Merger 제품 라이선스가 필요한 DynamicPDF의 MergeDocument 클래스와 IronPDF의 내장된 정적 Merge 메서드 간의 차이점을 보여줍니다.
DynamicPDF 구현:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger
Class Program
Shared Sub Main()
Dim document As New MergeDocument("document1.pdf")
document.Append("document2.pdf")
document.Draw("merged.pdf")
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
IronPDF의 정적 Merge 메서드는 여러 PdfDocument 객체를 직접 수락합니다. 더 많은 옵션은 PDF 병합 문서를 참조하십시오.
PDF에 텍스트 추가
텍스트 배치는 DynamicPDF의 좌표 기반 Label 요소에서 IronPDF의 HTML 기반 TextStamper로의 패러다임 전환을 보여줍니다.
DynamicPDF 구현:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Class Program
Shared Sub Main()
Dim document As New Document()
Dim page As New Page(PageSize.Letter)
Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
page.Elements.Add(label)
document.Pages.Add(page)
document.Draw("output.pdf")
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper As New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalAlignment = VerticalAlignment.Top
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF의 TextStamper는 좌표 기반 배치 대신 정렬 기반의 위치 설정을 제공하여 레이아웃이 다른 페이지 크기에서도 더 적응 가능합니다. 더 많은 옵션은 워터마크 및 스탬핑 문서를 참조하세요.
전체 문서 생성 예제
이 종합 예제는 복수의 요소를 가진DynamicPDF문서를 IronPDF의 HTML 접근 방식으로 변환하는 방법을 보여줍니다.
DynamicPDF 구현:
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger
' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)
Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")
' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")
IronPDF 구현:
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' All features in one library
Dim html As String = "
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>"
Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)
' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")
중요한 마이그레이션 노트
좌표 기반에서 HTML/CSS 위치 지정으로 전환
근본적인 패러다임 전환은 X,Y 좌표 위치를 CSS 기반 레이아웃으로 변환해야 합니다:
//DynamicPDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
//DynamicPDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
' DynamicPDF- coordinate-based
Dim label = New Label("Hello World", 100, 200, 300, 50)
' IronPDF- CSS positioning (if absolute positioning needed)
Dim html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>"
' IronPDF- preferred approach (flow-based)
html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>"
페이지 번호 매기기 구문
DynamicPDF와 IronPDF는 페이지 번호를 위한 서로 다른 placeholder 구문을 사용합니다:
//DynamicPDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
//DynamicPDFplaceholders
"Page %%CP%% of %%TP%%"
//IronPDFplaceholders
"Page {page} of {total-pages}"
'DynamicPDFplaceholders
"Page %%CP%% of %%TP%%"
'IronPDFplaceholders
"Page {page} of {total-pages}"
머리말과 바닥글
DynamicPDF Template 요소를IronPDFHtmlHeaderFooter로 변환:
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
'IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
더 많은 헤더/푸터 옵션은 헤더 및 푸터 문서를 참조하세요.
보안 설정
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
'IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"
포괄적인 보안 옵션은 암호화 문서를 참조하십시오.
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- 생성된 PDF의 시각적 비교
- 텍스트 위치 및 레이아웃 확인
- 표 렌더링 및 오버플로우 테스트
- 모든 페이지의 헤더/푸터 확인
- 양식 채우기 기능 테스트
- 보안/암호화 확인
- 성능 벤치마킹
- 사용하지 않는DynamicPDF라이선스 파일 제거
- 문서 업데이트
PDF 인프라의 미래 대비
.NET 10이 다가오고 C# 14가 새로운 언어 기능을 도입함에 따라, 현대 .NET 패턴을 수용하는 PDF 라이브러리를 선택하면 장기적인 호환성을 보장합니다. IronPDF의 .NET 6/7/8/9+에 대한 네이티브 지원은 프로젝트가 2025년과 2026년까지 확장됨에 따라 명확한 길을 제공합니다—여러 제품 라이선스를 관리하거나 분리된 API를 탐색하는 복잡성 없이 말이죠.
추가 리소스
DynamicPDF에서 IronPDF로의 이전은 여러 제품 라이선스를 관리하는 복잡성을 제거하면서 현대적인 Chromium 기반 렌더링과 전체 CSS3 지원을 제공합니다. 좌표 기반 위치 지정에서 HTML/CSS 디자인으로의 전환은 일반적으로 더 유지보수가 용이한 코드로 이어지며, 익숙한 웹 기술을 활용합니다.

