using IronPdf;
// Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = true;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
// Export to a file or Stream
pdf.SaveAs("output.pdf");
// Advanced Example with HTML Assets
// Load external html assets: Images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
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# 코드를 사용하여 문서를 처음부터 생성해야 하는 시나리오에서 뛰어납니다.
커뮤니티 티어는 개인, 비영리 단체, FOSS 프로젝트 및 연간 총 수익이 100만 달러 미만인 조직에 MIT 조건 하에서 무료입니다. 이 임계값을 초과하는 경우 QuestPDF는 $999(영구적으로 최대 10명의 개발자)에서 시작하는 Professional 라이선스와 $2,999(영구적으로 조직 전반)의 Enterprise 라이선스를 제공하며, 장기 계획에 고려해야 합니다.
핵심 문제: 코어 라이브러리에 HTML 엔진 없음
QuestPDF는 때때로 HTML-to-PDF 변환을 위해 추천되지만, 코어 라이브러리는 HTML을 렌더링하지 않습니다. 커뮤니티에서 유지 관리되는 QuestPDF.HTML 확장자는 HTML/CSS의 제한된 부분을 다루며, 핵심 엔진은 프로그래밍 방식으로만 작동하고 실제 브라우저 엔진을 실행하지 않습니다. 이미 HTML/CSS 템플릿을 보유한 팀은 일반적으로 유창한 API에서 이를 재구축해야 합니다.
기능
QuestPDF
IronPDF
HTML-to-PDF (코어)
지원되지 않음 (유연한 API만)
전체 지원
HTML-to-PDF (확장)
부분적으로 QuestPDF.HTML (제한된 부분)
전체 지원
CSS 스타일링
확장을 통한 제한적 지원
전체 CSS3
기존 템플릿
처음부터 다시 만들어야 함
HTML/CSS 자산 재사용
디자인 도구 호환성
None
어떤 웹 디자인 도구나 사용 가능
학습 곡선
새로운 유연한 C# API
웹 기술 이전
레이아웃 미리보기
동반 앱
어떤 브라우저에서든 미리보기 가능
PDF 조작
병합 / 추출 / 오버레이 / 암호화 (문서 작업 API, 2024.12.0+)
병합, 분할, 편집, 서명
IronPDF는QuestPDF코어에 포함되지 않은 네이티브 HTML-to-PDF 렌더링을 제공하여 C# 코드에서 문서를 수동으로 재구성할 필요를 제거합니다. 병합, 분할, 편집, 보안, 디지털 서명 같은 PDF 조작 기능도 다루는데, QuestPDF의 문서 작업 API(2024.12.0+)는 병합, 페이지 추출, 오버레이/언더레이, 첨부 파일 및 암호화를 다루지만, 기존 페이지 콘텐츠 편집, OCR, 디지털 서명은 다루지 않습니다.
QuestPDF라이센스 모델
QuestPDF의 커뮤니티 라이선스(MIT 조건)는 개인, 비영리 단체, FOSS 프로젝트 및 연간 총 수익이 100만 달러 미만인 조직에게 무료입니다. 이 임계값을 초과하는 경우, $999(영구적으로 최대 10명의 개발자)의 Professional 라이선스나 조직 전반을 대상으로 하는 Enterprise 라이선스가 필요합니다. 트리거는 좌석 수가 아닌 조직의 수익이기 때문에, 이는 하류 클라이언트 대화를 변경할 수 있으며, 자신의 라이선스도 변경할 수 있습니다.
IronPDF는 수익 감사를 하지 않고, 클라이언트 라이선스 요구 사항이 없으며, 예측 가능한 비용을 가진 개발자별 상업용 라이선스를 제공합니다.
최신 .NET 버전을 채택하는 팀에게는 IronPDF가 수익 기반 트리거 없이 개발자별 라이선스를 제공하며, 기존 웹 개발 기술을 활용하는 표준 HTML/CSS 접근 방식을 제공합니다.
// 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"
$vbLabelText $csharpLabel
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" .
SHELL
완전한 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
$vbLabelText $csharpLabel
핵심 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
.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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
이 예제는 패러다임 차이를 보여줍니다. QuestPDF는 Document.Create(), container.Page(), page.Content().Column(), column.Item().Text()과 같은 유창한 API를 배우는 것이 요구되며, .FontSize(20).Bold()와 같은 메서드 체인을 통해 스타일링을 합니다. 또한 QuestPDF.Settings.License = LicenseType.Community와 함께 라이선스 유형을 설정해야 합니다.
IronPDF는 모든 웹 개발자가 아는 표준 HTML을 사용합니다: 제목에는 를, 문단에는 를 사용합니다. 새로운 레이아웃 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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
QuestPDF는 레이아웃에 .Column()와 .Item()를 사용하고, 간격에는 .PaddingTop(20)를 사용합니다. IronPDF는 표준 HTML을 사용합니다: 제목에는 를, 문단에는 를, 간격에는 를, 굵은 텍스트에는 를 사용합니다.
진정한 이점: 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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
QuestPDF는 page.Header()와 page.Footer()를 사용하며, .AlignCenter()와 .CurrentPageNumber()와 같은 유창한 메서드를 사용합니다. IronPDF는 TextHeaderFooter 객체를 사용하며, 속성으로 CenterText와 FontSize를 사용합니다. {page} 자리 표시자는 현재 페이지 번호를 자동으로 삽입합니다.
중요한 마이그레이션 노트
패러다임 전환
핵심적인 변화는 사용자 지정 C# 유창한 레이아웃 API에서 표준 HTML/CSS로의 이동입니다:
// QuestPDF: Fluent C# layout 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: Fluent C# layout 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: Fluent VB.NET layout 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)
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")
$vbLabelText $csharpLabel
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")
$vbLabelText $csharpLabel
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")
$vbLabelText $csharpLabel
기존 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")
Document.Create() 패턴을 ChromePdfRenderer + HTML로 변환
.Column() / .Row()를 CSS Flexbox로 대체
.Table()을 HTML
요소로 대체
.Text().Bold().FontSize(24)을 <h1 style='...'>로 변환
page.Header() / page.Footer()을 TextHeaderFooter로 대체
.CurrentPageNumber()을 {page} 자리 표시자로 대체
.GeneratePdf()을 pdf.SaveAs()로 변환
애플리케이션 시작 시 라이선스 초기화 추가
마이그레이션 이후
PDF 출력의 시각적 비교
올바른 페이지 구분을 위한 다중 페이지 문서 테스트
필요에 따라 새 기능 추가(보안, 병합, URL-to-PDF)
참고해 주세요QuestPDF는 해당 소유자의 상표입니다. 이 사이트는 Codeux Software 또는QuestPDF유지보수자와 관련이 없으며, 그들로부터 승인받거나 후원받지 않았습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.
커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.
커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.