QuestPDF에서 IronPDF로의 마이그레이션 방법 (C#)
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against QuestPDF on pricing, HTML support, and licensing.
QuestPDF에서 IronPDF로 마이그레이션은 귀하의 PDF 생성 워크플로를 독점적인 C# 유창한 API에서 포괄적인 PDF 조작 기능을 갖춘 표준 HTML/CSS 기반 접근 방식으로 변환합니다. 이 가이드는 기존 웹 기술을 활용하고, HTML 템플릿을 재사용하며, QuestPDF가 제공할 수 없는 기능을 얻을 수 있는 완전한 단계별 마이그레이션 경로를 제공합니다.
QuestPDF에서 IronPDF로 마이그레이션하는 이유
QuestPDF이해하기
QuestPDF는 C#에서 프로그래밍 방식으로 PDF를 생성하기 위해 특수하게 제작된 현대적인 유창한 API입니다. 포괄적인 HTML-to-PDF 변환 기능을 제공하는 몇몇 동료들과 달리, QuestPDF는 프로그래밍 레이아웃 API 기능에 제한됩니다. QuestPDF는 개발자가 HTML에 의존하지 않고 C# 코드를 사용하여 문서를 처음부터 생성해야 하는 시나리오에서 뛰어납니다.
이 라이브러리는 매출이 100만 달러 미만인 기업에게 무료로 제공되지만, 이 매출 수준을 입증해야 하는 요구 사항이 있으며, 이는 일부에게 준수 부담이 될 수 있습니다. 이 임계값을 초과하는 사용자는 장기적인 계획에 QuestPDF를 잠재적인 솔루션으로 평가할 때 고려되어야 할 라이센스를 구매해야 합니다.
핵심 문제: HTML 지원 없음
QuestPDF는 종종 HTML-to-PDF 변환을 위해 추천되지만, HTML을 전혀 지원하지 않습니다. 개발자 포럼에서 크게 홍보되었음에도 불구하고, QuestPDF는 웹 기술을 활용하는 대신 완전히 새로운 DSL을 배워야 하는 독점적인 레이아웃 언어를 사용합니다.
| 기능 | QuestPDF | IronPDF |
|---|---|---|
| HTML-에서-PDF | 지원되지 않음 | 지원됨 |
| CSS 스타일링 | 지원되지 않음 | 전체 CSS3 |
| 기존 템플릿 | 처음부터 다시 만들어야 함 | HTML/CSS 자산 재사용 |
| 디자인 도구 호환성 | 없음 | 어떤 웹 디자인 도구나 사용 가능 |
| 학습 곡선 | 새로운 프로프라이어터리 DSL | 웹 기술 이전 |
| 레이아웃 미리보기 | IDE 플러그인 필요 | 어떤 브라우저에서든 미리보기 가능 |
| PDF 조작 | 없음 | 병합, 분할, 편집 |
IronPDF는 QuestPDF가 완전히 제공하지 않는 네이티브 HTML-to-PDF 렌더링을 제공하여 C# 코드에서 문서를 수동으로 재구성할 필요가 없습니다. 병합, 분할, 편집, 보안 등 QuestPDF가 수행할 수 없는 포괄적인 PDF 조작 기능을 포함합니다.
QuestPDF라이센스 모델
QuestPDF의 '커뮤니티 라이센스'는 귀하의 회사가 연간 총 수익이 100만 달러 미만인 경우에만 무료입니다. 귀하의 고객(개발자인 귀하뿐만 아니라)은 수익 한도를 초과할 경우 라이센스를 구매해야 할 수도 있습니다. 단순한 개발자당 상업적 라이센스와 달리, QuestPDF의 모델은 수익 공개와 준수 추적을 요구합니다.
IronPDF는 간단한 라이센싱을 제공합니다: 개발자당 라이센스 하나, 수익 감사 없음, 고객 라이센스 요구사항 없음, 명확하고 예측 가능한 비용.
.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 패키지 변경 사항
# Remove QuestPDF
dotnet remove package QuestPDF
# Add IronPDF
dotnet add package IronPdf
# Remove QuestPDF
dotnet remove package QuestPDF
# Add IronPDF
dotnet add package IronPdf
라이선스 구성
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
QuestPDF사용 찾기
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
완전한 API 참조
네임스페이스 변경
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
Imports IronPdf
핵심 API 매핑
| QuestPDF 개념 | IronPDF 동등 |
|---|---|
Document.Create() |
new ChromePdfRenderer() |
.Page() |
RenderHtmlAsPdf() |
.Text() |
HTML <p>, <h1>, <span> |
.Bold() |
CSS font-weight: bold |
.FontSize(24) |
CSS font-size: 24px |
.Image() |
HTML <img src="..."> |
.Table() |
HTML <table> |
.Column() |
CSSdisplay: flex; flex-direction: column |
.Row() |
CSSdisplay: flex; flex-direction: row |
PageSizes.A4 |
RenderingOptions.PaperSize |
.Margin() |
RenderingOptions.Margin* |
.GeneratePdf() |
pdf.SaveAs() |
| 해당 없음 | PdfDocument.Merge() |
| 해당 없음 | PdfDocument.FromFile() |
| 해당 없음 | pdf.SecuritySettings |
코드 마이그레이션 예제
예제 1: 기본 문서 생성 (HTML-to-PDF)
이전 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("Hello World").FontSize(20).Bold()
column.Item().Text("This is a paragraph of text.")
End Sub)
End Sub)
End Sub).GeneratePdf("output.pdf")
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
이 예시는 근본적인 패러다임 차이를 보여줍니다. QuestPDF는 유창한 API를 배우는 것을 요구합니다: Document.Create(), container.Page(), page.Content().Column(), column.Item().Text(), .FontSize(20).Bold()과 같은 메소드 체이닝을 통해 스타일링을 합니다. 또한 QuestPDF.Settings.License = LicenseType.Community로 라이센스 유형을 설정해야 합니다.
IronPDF는 모든 웹 개발자가 아는 표준 HTML을 사용합니다: 제목에 <h1>, 단락에 <p>를 사용합니다. 배우기 위한 독점 DSL은 필요 없습니다. IronPDF의 접근법은 현대 .NET 애플리케이션과의 더 나은 통합과 더 나은 문법을 제공합니다. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: 송장 생성
이전 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("INVOICE").FontSize(24).Bold()
column.Item().Text("Invoice #: 12345").FontSize(12)
column.Item().PaddingTop(20)
column.Item().Text("Customer: John Doe")
column.Item().Text("Total: $100.00").Bold()
End Sub)
End Sub)
End Sub).GeneratePdf("invoice.pdf")
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("invoice.pdf")
End Sub
End Class
QuestPDF는 레이아웃에 .Column()와 .Item()를 사용하며, 간격에 .PaddingTop(20)를 사용합니다. IronPDF는 표준 HTML을 사용합니다: 제목에 <h1>, 단락에 <p>, 간격에 <br/>, 굵은 텍스트에 <strong>를 사용합니다.
진정한 이점: IronPDF를 사용하면 디자이너가 HTML 템플릿을 독립적으로 생성하고 수정할 수 있습니다. QuestPDF를 사용하면 모든 디자인 변경에 C# 개발자가 코드를 수정해야 합니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: 페이지 번호가 있는 헤더와 푸터
이전 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Header().Text("Document Header").FontSize(14).Bold()
page.Content().Text("Main content of the document.")
page.Footer().AlignCenter().Text(Sub(text)
text.Span("Page ")
text.CurrentPageNumber()
End Sub)
End Sub)
End Sub).GeneratePdf("document.pdf")
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<p>Main content of the document.</p>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.Header = New TextHeaderFooter() With {
.CenterText = "Document Header",
.FontSize = 14
}
pdf.Footer = New TextHeaderFooter() With {
.CenterText = "Page {page}"
}
pdf.SaveAs("document.pdf")
End Sub
End Class
QuestPDF는 page.Header()와 page.Footer()를 사용하며 .AlignCenter() 및 .CurrentPageNumber()과 같은 유창한 메소드를 사용합니다. IronPDF는 TextHeaderFooter 객체를 사용하며, CenterText 및 FontSize와 같은 속성을 가집니다. {page} 플레이스홀더는 현재 페이지 번호를 자동으로 삽입합니다.
중요한 마이그레이션 노트
패러다임 전환
근본적인 변화는 독점적인 C# DSL에서 표준 HTML/CSS로의 이동입니다:
// QuestPDF: Proprietary fluent API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// QuestPDF: Proprietary fluent API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
' QuestPDF: Proprietary fluent API
container.Page(Sub(page)
page.Content().Column(Sub(column)
column.Item().Text("Invoice").Bold().FontSize(24)
column.Item().Row(Sub(row)
row.RelativeItem().Text("Customer:")
row.RelativeItem().Text("Acme Corp")
End Sub)
End Sub)
End Sub)
' IronPDF: Standard HTML/CSS
Dim html As String = "
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
레이아웃 패턴 변환
| QuestPDF패턴 | HTML/CSS 상응 |
|---|---|
.Column() |
display: flex; flex-direction: column |
.Row() |
display: flex; flex-direction: row |
.RelativeItem() |
flex: 1 |
.Table() |
<table> 요소 |
.PaddingTop(20) |
padding-top: 20px 또는 <br/> |
.AlignCenter() |
text-align: center |
.FontSize(24) |
font-size: 24px |
.Bold() |
font-weight: bold 또는 <strong> |
페이지 설정 변환
// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
' QuestPDF
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
' IronPDF
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20 ' mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
이동 후 새로운 기능
IronPDF로 마이그레이션 후, QuestPDF가 제공하지 않는 기능을 얻습니다:
PDF 병합
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
Dim cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>")
Dim content = renderer.RenderHtmlAsPdf(reportHtml)
Dim existing = PdfDocument.FromFile("appendix.pdf")
Dim merged = PdfDocument.Merge(cover, content, existing)
merged.SaveAs("complete.pdf")
PDF 보안
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "reader"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SaveAs("protected.pdf")
URL에서 PDF로
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/report")
pdf.SaveAs("webpage.pdf")
기존 PDF 로드 및 편집
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
Dim pdf = PdfDocument.FromFile("existing.pdf")
' Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf")
기능 비교 요약
| 기능 | QuestPDF | IronPDF |
|---|---|---|
| HTML-에서-PDF | 지원되지 않음 | 주요 기능 |
| 학습 곡선 | 독점 DSL | 표준 웹 기술 |
| 템플릿 미리보기 | 플러그인 필요 | 모든 브라우저 |
| 디자인 협업 | 개발자 전용 | 디자이너 + 개발자 |
| 기존 자산 | 다시 빌드 필요 | HTML/CSS 재사용 |
| PDF 조작 | 지원되지 않음 | 지원됨 |
| 보안/서명 | 지원되지 않음 | 지원됨 |
| 라이센스 모델 | 수익 기반 | 개발자 당 |
| 클라이언트 영향 | 라이선스 필요할 수 있음 | 없음 |
| 부트스트랩/테일윈드 | 지원되지 않음 | 지원됨 |
| URL을 PDF로 | 지원되지 않음 | 지원됨 |
마이그레이션 체크리스트
사전 마이그레이션
- 모든QuestPDF문서 템플릿 식별하기 (
Document.Create,.GeneratePdf) - 사용된 DSL 패턴 문서화하기 (
.Column(),.Row(),.Table(),.Text()) - 스타일링 메서드를 CSS 등가로 매핑
- ironpdf.com에서IronPDF라이선스 키 획득
패키지 변경 사항
QuestPDFNuGet 패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf
코드 변경 사항
- 네임스페이스 가져오기 업데이트
QuestPDF.Settings.License = LicenseType.Community제거Document.Create()패턴을ChromePdfRenderer+ HTML로 변환하기.Column()/.Row()를 CSS Flexbox로 대체하기.Table()를HTML<table>요소로 대체하기.Text().Bold().FontSize(24)를<h1 style='...'>로 변환하기page.Header()/page.Footer()를TextHeaderFooter로 대체하기.CurrentPageNumber()를{page}플레이스홀더로 대체하기.GeneratePdf()를pdf.SaveAs()로 변환하기- 애플리케이션 시작 시 라이선스 초기화 추가
마이그레이션 이후
- PDF 출력의 시각적 비교
- 올바른 페이지 구분을 위한 다중 페이지 문서 테스트
- 필요에 따라 새 기능 추가(보안, 병합, URL-to-PDF)

