C#을 사용하여 HTML과 JavaScript를 이용해 PDF로 변환하는 방법
DynamicPDF에서 IronPDF로 마이그레이션해야 하는 이유는?
DynamicPDF의 제품 분할은 일반적인 마이그레이션 동인이 됩니다. 라이센스 모델을 이해하면 현재 구현의 진정한 비용을 평가하는 데 도움이 됩니다.
제품 분할 문제
DynamicPDF (ceTe Software)는 PDF 기능을 별도로 라이센스 된 패키지로 제공합니다:
- DynamicPDF Core Suite (
ceTe.DynamicPDF.CoreSuite.NET, v12.43.0): Bundles Generator, Merger, and ReportWriter - DynamicPDF HTML Converter (
ceTe.DynamicPDF.HtmlConverter.NET, v3.3.0): HTML-to-PDF 별도 애드온 - DynamicPDF Converter (
ceTe.DynamicPDF.Converter.NET, v3.32.0): 오피스 및 50개 이상의 파일 형식 변환 - DynamicPDF PrintManager (
ceTe.DynamicPDF.Printing.NET): 프로그램적인 인쇄 - DynamicPDF Rasterizer (
ceTe.DynamicPDF.Rasterizer.NET): PDF-to-image - DynamicPDF Viewer (
ceTe.DynamicPDF.Viewer.NET): WinForms/WPF 뷰어 컨트롤
Generator, Merger 및 ReportWriter는 Core Suite에 통합되지만, HTML 렌더링, 비트맵화, 인쇄 및 보기에는 각각 별도의 구입이 필요합니다. IronPDF는 이러한 기능을 단일 라이브러리 및 라이선스로 번들합니다.
아키텍처 비교
| 측면 | DynamicPDF | IronPDF |
|---|---|---|
| 제품 모델 | 단편화된 (5개 이상의 제품) | 모든 기능 통합된 라이브러리 |
| 라이선스 | 여러 라이선스 필요 | 단일 라이선스 |
| HTML to PDF | 별도 애드온 구매 필요 | 내장, Chromium 기반 |
| CSS 지원 | 제한됨 (애드온 요구) | 전체 CSS3와 Flexbox/Grid 제공 |
| API 스타일 | 좌표 기반 포지셔닝 | HTML/CSS + 조작 API |
| 학습 곡선 | 가파름 (여러 API) | 완만함 (웹 기술) |
| 최신 .NET | .NET Standard 2.0 / .NET 6 / .NET 8 / .NET Framework 4.6.2 | .NET 6/7/8/9+ 네이티브 |
주요 마이그레이션 혜택
- 단일 패키지: 하나의 NuGet 패키지가 3-5개의DynamicPDF패키지를 대체함
- 현대적 렌더링: Chromium 엔진 대 레거시 렌더링
- 웹 기술: 좌표 기반 위치 지정 대신 HTML/CSS 사용
- 간편한 API: 코드가 적고, 읽기 쉽고, 유지 보수가 간편함
- 추가 구매 없음: HTML, 병합, 보안 모두 포함
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+ or .NET 6/7/8/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
찾을 일반 패키지:
ceTe.DynamicPDF.CoreSuite.NET(Generator + Merger + ReportWriter)ceTe.DynamicPDF.HtmlConverter.NET(HTML-to-PDF 애드온)ceTe.DynamicPDF.Converter.NET(Office / 다중 형식을 PDF로)ceTe.DynamicPDF.Rasterizer.NET,ceTe.DynamicPDF.Printing.NET,ceTe.DynamicPDF.Viewer.NET
패러다임 변화 이해
DynamicPDF에서 IronPDF로 마이그레이션할 때 가장 큰 변화는 문서 생성에 대한 기본적인 접근 방식입니다. DynamicPDF는 특정 X,Y 좌표에 요소를 배치하는 좌표 기반 위치 지정을 사용합니다. IronPDF는 웹 기술을 사용하여 디자인하는 HTML/CSS 렌더링을 사용합니다.
이 패러다임 변화는 Label, TextArea, Table2 요소를 HTML에 상응하는 요소로 변환하는 것을 의미하며, 이는 일반적으로 더 읽기 쉽고 유지 관리하기 쉬운 코드로 이어집니다.
단계별 마이그레이션 프로세스
1단계: NuGet 패키지 업데이트
실제로 설치된DynamicPDF패키지를 제거하고 IronPDF를 추가합니다.
# RemoveDynamicPDFpackages (only those you actually have)
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
dotnet remove package ceTe.DynamicPDF.Converter.NET
dotnet remove package ceTe.DynamicPDF.Rasterizer.NET
dotnet remove package ceTe.DynamicPDF.Printing.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;Imports IronPdf3단계: 라이선스 구성
// 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 | <div>, <p> CSS와 함께 |
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.Converter.NET
// HTML-to-PDF is a separate add-on; CoreSuite alone does not include it.
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 ClassIronPDF 구현:
// 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 ClassIronPDF의 ChromePdfRenderer는 전체 CSS3 지원을 갖춘 Chromium 기반 렌더링을 제공하며, 별도의 애드온 구매가 필요하지 않습니다. 더 많은 옵션을 보려면 HTML to PDF 문서를 참조하세요.
여러 PDF 병합
PDF 병합은 IronPDF의 내장 정적 Merge 메서드와 DynamicPDF의 MergeDocument 클래스(병합 제품 라이선스가 필요함) 간의 차이를 보여줍니다.
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");
}
}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 ClassIronPDF 구현:
// 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 ClassIronPDF의 정적 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");
}
}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 ClassIronPDF 구현:
// 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 ClassIronPDF의 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");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");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
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%%"
//IronPDF placeholders
"Page {page} of {total-pages}"
머리말과 바닥글
DynamicPDF Template 요소를IronPDFHtmlHeaderFooter로 변환:
//IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};'IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}더 많은 헤더/푸터 옵션은 헤더 및 푸터 문서를 참조하세요.
보안 설정
//IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";'IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"포괄적인 보안 옵션은 암호화 문서를 참조하십시오.
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- 생성된 PDF의 시각적 비교
- 텍스트 위치 및 레이아웃 확인
- 표 렌더링 및 오버플로우 테스트
- 모든 페이지의 헤더/푸터 확인
- 양식 채우기 기능 테스트
- 보안/암호화 확인
- 성능 벤치마킹
- 사용하지 않는DynamicPDF라이선스 파일 제거
- 문서 업데이트
추가 리소스
DynamicPDF에서 IronPDF로의 마이그레이션은 여러 제품 라이선스를 단일 라이브러리로 통합하고 좌표 기반 위치 결정을 Chromium에서 HTML/CSS 렌더링으로 대체합니다. 웹 기술에 이미 익숙한 팀은 일반적으로 생성된 코드를 더 쉽게 유지할 수 있다고 느낍니다.

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.