Syncfusion PDF에서 IronPDF로의 마이그레이션 방법 (C#)
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Syncfusion PDF on pricing, HTML support, and licensing.
Syncfusion PDF Framework에서 IronPDF로 마이그레이션하면 좌표 기반 그래픽 API가 포함된 대규모 스위트에서 단독으로 HTML/CSS 우선의 현대적인 Chromium 렌더링 라이브러리로 PDF 생성 워크플로가 변환됩니다. 이 가이드는 스위트 전용 라이선싱, 복잡한 배포 요구 사항 및 좌표 기반 포지셔닝을 제거하는 완전한 단계별 마이그레이션 경로를 제공합니다.
SyncfusionPDF에서 IronPDF로의 마이그레이션 이유
Syncfusion PDFFramework 이해
Syncfusion PDF Framework는 C#을 사용하여 PDF 문서를 생성, 편집 및 보안하는 광범위한 기능을 제공하는 포괄적인 라이브러리입니다. Syncfusion의 Essential Studio의 일부로 제공되며, 여러 플랫폼에 걸쳐 천 개 이상의 구성 요소를 포함합니다.
그러나 가장 큰 단점 중 하나는 단독 제품으로 구매할 수 없다는 것입니다; 개발자는 모든Syncfusion구성 요소의 전체 스위트를 구매해야 합니다. 이 요구 사항은 PDF 기능에만 관심이 있는 팀에게 번거로울 수 있으며, 특히 이 번들에 해당 프로젝트에 필요하지 않은 도구가 포함될 수 있습니다.
번들 라이선싱 문제
Syncfusion의 라이선스 모델은 PDF 기능만 필요한 팀에게 큰 도전을 제기합니다:
- 스위트 전용 구매: PDF 라이브러리를 단독으로 구매할 수 없음 - 전체 Essential Studio를 구입해야 함
- 커뮤니티 라이선스 제한: 무료 계층은 <$1M 수입과 <5명의 개발자가 모두 필요함
- 복잡한 배포 라이선싱: 웹, 데스크탑, 서버 배포를 위한 다른 라이선스
- 연간 갱신 필요: 연간 비용이 있는 구독 모델
- 개발자 1인당 가격: 팀 규모에 따라 비용이 선형적으로 증가
- 스위트 과다: 필요하지 않을 수 있는 1000개 이상의 구성 요소가 포함됨
Syncfusion PDFvsIronPDF비교
| 측면 | Syncfusion PDF | IronPDF |
|---|---|---|
| 구매 모델 | Suite 번들만 | 독립형 |
| 라이선스 | 복잡한 티어 | 개발자별 간단한 |
| 커뮤니티 제한 | <$1M AND <5 devs | 무료 체험판 후 라이선스 |
| 배포 | 여러 라이선스 유형 | 하나의 라이선스가 모든 것을 다룸 |
| API 스타일 | 좌표 기반 그래픽 | HTML/CSS 우선 |
| HTML 지원 | BlinkBinaries 필요 | 기본 Chromium |
| CSS 지원 | 제한적 | CSS3/플렉스박스/그리드를 완벽히 지원 |
| 종속성 | 다중 패키지 | 단일 NuGet |
| Suite 요구 사항 | 예 (전체 Suite) | 아니요 |
| PDF에 초점 | 광범위한; 더 큰 Suite의 일부 | 좁은; PDF 중심 |
IronPDF는 PDF 기능을 단독 제품으로 제공하여 보다 집중된 접근 방식을 제공합니다. 이 차이는 비용 고려사항과 통합의 용이성 양쪽에 중요한 영향을 미칩니다.
.NET 10 및 C# 14 도입을 2025년과 2026년까지 계획하는 팀의 경우, IronPDF의 단독 라이선싱 및 HTML/CSS 우선 접근 방식은 스위트 종속성 없이 유연성을 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# RemoveSyncfusionpackages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing
# Install IronPDF
dotnet add package IronPdf
# RemoveSyncfusionpackages
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.HtmlToPdfConverter.Net.Windows
dotnet remove package Syncfusion.Licensing
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
Syncfusion:
// Must register before anySyncfusioncalls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
// Must register before anySyncfusioncalls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY");
' Must register before any Syncfusion calls
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR-SYNCFUSION-KEY")
IronPDF:
// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
// One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY";
' One-time at startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-KEY"
완전한 API 참조
네임스페이스 변경
// Before:SyncfusionPDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before:SyncfusionPDF
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Parsing;
using Syncfusion.HtmlConverter;
using Syncfusion.Drawing;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
핵심 API 매핑
| Syncfusion | IronPDF |
|---|---|
PdfDocument |
ChromePdfRenderer |
PdfLoadedDocument |
PdfDocument.FromFile() |
HtmlToPdfConverter |
ChromePdfRenderer |
graphics.DrawString() |
HTML 텍스트 요소 |
graphics.DrawImage() |
<img> 태그 |
PdfGrid |
HTML <table> |
PdfStandardFont |
CSS font-family |
PdfBrushes.Black |
CSS color: black |
document.Security |
pdf.SecuritySettings |
PdfTextExtractor |
pdf.ExtractAllText() |
ImportPageRange() |
PdfDocument.Merge() |
document.Save(stream) |
pdf.SaveAs(path) |
document.Close(true) |
필요 없음 |
코드 마이그레이션 예제
예제 1: HTML/URL에서 PDF 변환
이전 (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;
class Program
{
static void Main()
{
// Initialize HTML to PDF converter
HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();
// Convert URL to PDF
PdfDocument document = htmlConverter.Convert("https://www.example.com");
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.HtmlConverter;
using Syncfusion.Pdf;
using System.IO;
class Program
{
static void Main()
{
// Initialize HTML to PDF converter
HtmlToPdfConverter htmlConverter = new HtmlToPdfConverter();
// Convert URL to PDF
PdfDocument document = htmlConverter.Convert("https://www.example.com");
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
Imports Syncfusion.HtmlConverter
Imports Syncfusion.Pdf
Imports System.IO
Module Program
Sub Main()
' Initialize HTML to PDF converter
Dim htmlConverter As New HtmlToPdfConverter()
' Convert URL to PDF
Dim document As PdfDocument = htmlConverter.Convert("https://www.example.com")
' Save the document
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save the PDF
pdf.SaveAs("Output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from a URL
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save the PDF
pdf.SaveAs("Output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
' Create a PDF from a URL
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
' Save the PDF
pdf.SaveAs("Output.pdf")
End Sub
End Class
이 예제는 기본 API 차이를 보여줍니다.SyncfusionPDF는 HtmlToPdfConverter 인스턴스를 필요로 하고, Convert()를 호출하여 PdfDocument를 반환한 다음, FileStream을 수동으로 생성하고, 문서와 스트림을 저장하고 닫아야 합니다.
IronPDF는 세 줄의 코드로 ChromePdfRenderer와 RenderUrlAsPdf()을 사용합니다. IronPDF는 자동으로 정리를 처리하며, FileStream 관리나 Close() 호출이 필요 없습니다. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: 텍스트에서 PDF 생성
이전 (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;
class Program
{
static void Main()
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Add a page
PdfPage page = document.Pages.Add();
// Create a font
PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);
// Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Drawing;
using System.IO;
class Program
{
static void Main()
{
// Create a new PDF document
PdfDocument document = new PdfDocument();
// Add a page
PdfPage page = document.Pages.Add();
// Create a font
PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 12);
// Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, new PointF(10, 10));
// Save the document
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
}
}
Imports Syncfusion.Pdf
Imports Syncfusion.Pdf.Graphics
Imports Syncfusion.Drawing
Imports System.IO
Module Program
Sub Main()
' Create a new PDF document
Dim document As New PdfDocument()
' Add a page
Dim page As PdfPage = document.Pages.Add()
' Create a font
Dim font As PdfFont = New PdfStandardFont(PdfFontFamily.Helvetica, 12)
' Draw text
page.Graphics.DrawString("Hello, World!", font, PdfBrushes.Black, New PointF(10, 10))
' Save the document
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
// Save the document
pdf.SaveAs("Output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
// Save the document
pdf.SaveAs("Output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello, World!</h1>")
' Save the document
pdf.SaveAs("Output.pdf")
End Sub
End Class
Syncfusion PDF는 좌표 기반 그래픽 모델을 사용합니다. 당신은 PdfDocument을 만들어 PdfPage을 추가하고, PdfFontFamily.Helvetica와 함께 PdfFont을 생성한 후, 명시적인 좌표(new PointF(10, 10)), 폰트, 브러시(PdfBrushes.Black)를 사용하여 page.Graphics.DrawString()을 호출합니다. 결국, FileStream 생성 및 폐기를 관리합니다.
IronPDF는 HTML/CSS 우선 접근 방식을 사용합니다. Instead of coordinates, you write <h1>Hello, World!</h1> and let CSS handle positioning, fonts, and colors. 이 접근 방식은 더 간단하고 더 유지 관리하기 쉬우며, 개발자가 이미 보유하고 있는 기술을 활용합니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: PDF 문서 병합
이전 (Syncfusion PDF):
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;
class Program
{
static void Main()
{
// Load the first PDF document
FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);
// Load the second PDF document
FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);
// Merge the documents
PdfDocument finalDocument = new PdfDocument();
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);
// Save the merged document
FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
finalDocument.Save(outputStream);
// Close all documents
finalDocument.Close(true);
loadedDocument1.Close(true);
loadedDocument2.Close(true);
stream1.Close();
stream2.Close();
outputStream.Close();
}
}
// NuGet: Install-Package Syncfusion.Pdf.Net.Core
using Syncfusion.Pdf;
using Syncfusion.Pdf.Parsing;
using System.IO;
class Program
{
static void Main()
{
// Load the first PDF document
FileStream stream1 = new FileStream("Document1.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument1 = new PdfLoadedDocument(stream1);
// Load the second PDF document
FileStream stream2 = new FileStream("Document2.pdf", FileMode.Open, FileAccess.Read);
PdfLoadedDocument loadedDocument2 = new PdfLoadedDocument(stream2);
// Merge the documents
PdfDocument finalDocument = new PdfDocument();
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1);
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1);
// Save the merged document
FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
finalDocument.Save(outputStream);
// Close all documents
finalDocument.Close(true);
loadedDocument1.Close(true);
loadedDocument2.Close(true);
stream1.Close();
stream2.Close();
outputStream.Close();
}
}
Imports Syncfusion.Pdf
Imports Syncfusion.Pdf.Parsing
Imports System.IO
Class Program
Shared Sub Main()
' Load the first PDF document
Dim stream1 As New FileStream("Document1.pdf", FileMode.Open, FileAccess.Read)
Dim loadedDocument1 As New PdfLoadedDocument(stream1)
' Load the second PDF document
Dim stream2 As New FileStream("Document2.pdf", FileMode.Open, FileAccess.Read)
Dim loadedDocument2 As New PdfLoadedDocument(stream2)
' Merge the documents
Dim finalDocument As New PdfDocument()
finalDocument.ImportPageRange(loadedDocument1, 0, loadedDocument1.Pages.Count - 1)
finalDocument.ImportPageRange(loadedDocument2, 0, loadedDocument2.Pages.Count - 1)
' Save the merged document
Dim outputStream As New FileStream("Merged.pdf", FileMode.Create)
finalDocument.Save(outputStream)
' Close all documents
finalDocument.Close(True)
loadedDocument1.Close(True)
loadedDocument2.Close(True)
stream1.Close()
stream2.Close()
outputStream.Close()
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("Document1.pdf");
var pdf2 = PdfDocument.FromFile("Document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
// Save the merged document
merged.SaveAs("Merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("Document1.pdf");
var pdf2 = PdfDocument.FromFile("Document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
// Save the merged document
merged.SaveAs("Merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
' Load PDF documents
Dim pdf1 = PdfDocument.FromFile("Document1.pdf")
Dim pdf2 = PdfDocument.FromFile("Document2.pdf")
' Merge PDFs
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
' Save the merged document
merged.SaveAs("Merged.pdf")
End Sub
End Class
PDF를 병합하는 데 있어서의 차이점은 극적입니다.SyncfusionPDF는 각 입력 문서에 대해 FileStream 객체를 생성하고, PdfLoadedDocument로 로드한 다음, 새로운 PdfDocument을 생성하고, 각 소스에 대해 시작 및 종료 인덱스로 ImportPageRange()을 호출하고 출력 FileStream을 생성한 뒤, 여섯 개의 별도 객체 (finalDocument, loadedDocument1, loadedDocument2, stream1, stream2, outputStream)를 닫아야 합니다.
IronPDF는 PdfDocument.FromFile()을 사용하여 각 PDF를 로드하고, 문서 목록을 수용하는 정적 PdfDocument.Merge() 메서드를 사용합니다. 스트림 관리도 없고, 수동 페이지 범위 계산도 없고, 닫기 호출도 없습니다.
API 철학의 주요 차이점
좌표 기반과 HTML/CSS 우선 방식
Syncfusion PDF는 전통적인 PDF 라이브러리에서 상속된 좌표 기반 그래픽 모델을 사용합니다:
// Syncfusion:수동positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
// Syncfusion:수동positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, new PointF(100, 200));
page.Graphics.DrawRectangle(brush, new RectangleF(50, 50, 200, 100));
' Syncfusion:수동positioning
page.Graphics.DrawString("Text", font, PdfBrushes.Black, New PointF(100, 200))
page.Graphics.DrawRectangle(brush, New RectangleF(50, 50, 200, 100))
IronPDF는 레이아웃을 위해 HTML/CSS를 사용합니다:
// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: CSS-based positioning
var html = @"
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: CSS-based positioning
Dim html As String = "
<div style='margin: 50px; padding: 20px; border: 1px solid black;'>
<p style='color: black;'>Text</p>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
HTML/CSS 접근 방식은 웹 개발자에게 더 직관적이고, 유지 관리가 더 쉬우며, 다른 페이지 크기에서 일관된 결과를 제공합니다.
스트림 관리와 자동 정리
Syncfusion PDF는 명시적인 스트림 및 문서 폐기를 요구합니다:
// Syncfusion:수동cleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
// Syncfusion:수동cleanup
FileStream fileStream = new FileStream("Output.pdf", FileMode.Create);
document.Save(fileStream);
document.Close(true);
fileStream.Close();
' Syncfusion:수동cleanup
Dim fileStream As New FileStream("Output.pdf", FileMode.Create)
document.Save(fileStream)
document.Close(True)
fileStream.Close()
IronPDF는 자동으로 정리를 처리합니다:
// IronPDF:자동cleanup
pdf.SaveAs("Output.pdf");
// IronPDF:자동cleanup
pdf.SaveAs("Output.pdf");
' IronPDF:자동cleanup
pdf.SaveAs("Output.pdf")
기능 비교
| 기능 | Syncfusion PDF | IronPDF |
|---|---|---|
| 단독 구매 | 아니요 (Suite만) | 예 |
| 라이선스 | 커뮤니티 제한이 있는 상업용 | 단순화된 상업용 |
| HTML to PDF | BlinkBinaries 필요 | 기본 Chromium |
| CSS3 지원 | 제한적 | 완전함 (플렉스박스, 그리드) |
| API 스타일 | 좌표 기반 그래픽 | HTML/CSS 우선 |
| 스트림 관리 | 수동 | 자동 |
| 종속성 | 다중 패키지 | 단일 NuGet |
| 배포 복잡성 | 잠재적으로 복잡함 | 직관적 |
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에서 모든Syncfusion PDF사용 내역 목록 작성
- 라이센스 비용 및 배포 요건 문서화
PdfGrid,PdfGraphics,HtmlToPdfConverter사용법 식별- ironpdf.com에서IronPDF라이선스 키 획득
코드 업데이트
-Syncfusion패키지 제거 (Syncfusion.Pdf.Net.Core, Syncfusion.HtmlToPdfConverter.Net.Windows, Syncfusion.Licensing)
IronPdfNuGet Install-Package- 네임스페이스 가져오기 업데이트 (
using Syncfusion.Pdf;→using IronPdf;) Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense()을IronPdf.License.LicenseKey = "..."로 대체HtmlToPdfConverter.Convert()을(를)ChromePdfRenderer.RenderUrlAsPdf()또는RenderHtmlAsPdf()으로 대체PdfDocument+Pages.Add()+Graphics.DrawString()을ChromePdfRenderer.RenderHtmlAsPdf()로 대체PdfLoadedDocument을(를)PdfDocument.FromFile()로 대체ImportPageRange()을(를)PdfDocument.Merge()로 대체document.Save(stream)을(를)pdf.SaveAs(path)로 대체- 모든
document.Close(true)및stream.Close()호출 제거 PdfGrid을HTML<table>요소로 대체PdfStandardFont을 CSSfont-family로 대체PdfBrushes을 CSScolor속성으로 대체
테스트
- PDF 출력의 시각적 비교
- CSS 렌더링 개선 확인 (플렉스박스, 그리드가 이제 작동)
- 텍스트 추출 테스트
- 병합 및 분할 테스트
- 성능 비교

