PrinceXML에서 IronPDF로의 마이그레이션 방법 (C#)
PrinceXML에서 IronPDF로 마이그레이션하면 PDF 생성 워크플로가 외부 명령 줄 프로세스에서 고유의 .NET 라이브러리로 변환됩니다. 이 가이드는 프로세스 관리 오버헤드를 제거하고, 배포를 단순화하며, PDF 생성 외에도 광범위한 PDF 조작 기능을 제공하는 완전한 단계별 마이그레이션 경로를 제공합니다.
왜 PrinceXML에서 IronPDF로 마이그레이션해야 하는가
PrinceXML이해하기
PrinceXML은 CSS 페이지드 미디어 사양에 대한 전용 지원을 통해 HTML 콘텐츠를 인쇄 수준의 PDF 문서로 변환하는 데 탁월한 정교한 도구입니다. 이 특수화는 PrinceXML이 상세 인쇄 스타일링이 필요한 출판 또는 법률 문서와 같은 산업에 매우 유용한 특성인 의도된 인쇄 디자인에 대한 높은 충실도로 문서를 렌더링할 수 있게 해줍니다.
그러나 PrinceXML은 .NET 라이브러리가 아니며 별도의 명령줄 도구로 작동하여 순수 .NET 솔루션을 선호하는 환경에서 통합이 복잡해질 수 있습니다. 별도의 서버 프로세스에 의존하기 때문에 추가적인 시스템 리소스 관리가 필요하고 프로젝트 배포의 복잡성이 증가할 수 있습니다.
외부 프로세스 문제
PrinceXML은 .NET 애플리케이션에 심각한 아키텍처적 문제를 일으킬 수 있는 별도의 명령줄 실행 파일로 작동합니다:
-
프로세스 관리 부담: 외부 프로세스를 생성, 모니터링 및 종료해야 합니다.
-
순수 .NET 통합 없음: stdin/stdout 또는 임시 파일을 통해 통신해야 합니다.
-
배포 복잡성: 모든 서버에 Prince 설치가 필요합니다.
-
서버당 라이선스: 각 배포마다 별도의 라이선스가 필요합니다 ($495+).
-
오류 처리의 어려움: 오류 감지를 위해 텍스트 출력을 구문 분석해야 합니다.
-
비동기/대기 없음: 차단 호출 또는 복잡한 비동기 래퍼가 필요합니다.
- 경로 종속성: Prince 실행 파일을 PATH 또는 절대 경로에서 찾을 수 있어야 합니다.
PrinceXMLvsIronPDF비교
| 측면 | PrinceXML | IronPDF |
|---|---|---|
| 아키텍처 | 외부 프로세스 | .NET 네이티브 라이브러리 |
| 통합 | 명령줄 | 직접 API |
| 배포 | 모든 서버에 설치 | 단일 NuGet 패키지 |
| 오류 처리 | 텍스트 출력 구문 분석 | .NET 예외 |
| 비동기 지원 | 수동 래퍼 | 네이티브 async/await |
| PDF 조작 | 생성 전용 | 전체 조작 (합병, 분할, 편집) |
| 라이선스 | 서버당 ($495+) | 개발자당 |
| 업데이트 | 수동 재설치 | NuGet 업데이트 |
| 디버깅 | 어려움 | 전체 디버거 지원 |
| 디지털 서명 | 아니요 | 예 |
| 양식 | 아니요 | 예 |
| Docker 지원 | 복잡함 | 간단함 |
| 클라우드 기능 | 어려움 | 쉬움 |
IronPDF는 .NET 본래의 기능을 갖춘 대안을 제공하여 단순한 HTML-to-PDF 변환 이상의 고급 PDF 조작 작업(예: 편집, 병합, 디지털 서명 등)을 포함합니다. IronPDF의 API는 단순성과 사용의 용이성을 위해 설계되어 개발자가 최소한의 보일러플레이트 코드로 변환 및 조작을 수행할 수 있도록 합니다.
팀이 2025년 및 2026년 동안 .NET 10 및 C# 14를 채택할 계획이라면, IronPDF의 원활한 배포는 외부 종속성이나 서버 프로세스를 필요로 하지 않으며, 따라서 .NET Framework에의 통합 부담을 덜어줍니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Install IronPDF
dotnet add package IronPdf
# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
# Install IronPDF
dotnet add package IronPdf
# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
라이선스 구성
// 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"
PrinceXML사용 검색
# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
완전한 API 참조
네임스페이스 변경
// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;
// After: IronPDF
using IronPdf;
// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;
// After: IronPDF
using IronPdf;
' Before: PrinceXML
Imports PrinceXMLWrapper
Imports System.Diagnostics
Imports System.IO
' After: IronPDF
Imports IronPdf
명령줄에서 메소드 매핑
| Prince 명령 | IronPDF 동등 |
|---|---|
prince input.html -o output.pdf |
renderer.RenderHtmlFileAsPdf("input.html").SaveAs("output.pdf") |
prince --style=custom.css input.html |
HTML에 CSS를 포함하거나 RenderingOptions 사용 |
prince --javascript |
renderer.RenderingOptions.EnableJavaScript = true |
prince --no-javascript |
renderer.RenderingOptions.EnableJavaScript = false |
prince --page-size=Letter |
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter |
prince --page-margin=1in |
renderer.RenderingOptions.MarginTop = 72 (72 포인트 = 1인치) |
prince --encrypt |
pdf.SecuritySettings.OwnerPassword = "..." |
prince --user-password=pw |
pdf.SecuritySettings.UserPassword = "pw" |
prince --disallow-print |
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint |
prince --disallow-copy |
pdf.SecuritySettings.AllowUserCopyPasteContent = false |
prince --baseurl=http://... |
renderer.RenderingOptions.BaseUrl = new Uri("http://...") |
prince --media=print |
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print |
prince --media=screen |
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen |
CSS @page에서 RenderingOptions 매핑
| CSS @page 속성 | IronPDF 동등 |
|---|---|
size: A4 |
PaperSize = PdfPaperSize.A4 |
size: Letter |
PaperSize = PdfPaperSize.Letter |
size:A4landscape |
PaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape |
margin: 2cm |
MarginTop/Bottom/Left/Right = 56 |
margin-top: 1in |
MarginTop = 72 |
@top-center { content: "..." } |
중앙에 정렬된 div와 함께 HtmlHeader |
@bottom-right { content: counter(page) } |
{page} 자리표시자와 함께 HtmlFooter |
페이지 크기 변환
| 크기 | 포인트 | 밀리미터 |
|---|---|---|
| 레터 | 612 x 792 | 216 x 279 |
| A4 | 595 x 842 | 210 x 297 |
| 리걸 | 612 x 1008 | 216 x 356 |
| 1 인치 | 72 | 25.4 |
| 1 cm | 28.35 | 10 |
코드 마이그레이션 예제
예제 1: HTML 파일에서 PDF로 변환
이전 (PrinceXML):
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
class Program
{
static void Main()
{
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.Convert("input.html", "output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
class Program
{
static void Main()
{
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.Convert("input.html", "output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports PrinceXMLWrapper
Imports System
Module Program
Sub Main()
Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
prince.Convert("input.html", "output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
이 예제는 근본적인 아키텍처 차이를 보여줍니다. PrinceXML은 실행 파일의 전체 경로 ("C:\\Program Files\\Prince\\engine\\bin\\prince.exe")로 Prince 객체를 인스턴스화한 다음, 입력 및 출력 경로를 사용하여 Convert()을 호출해야 합니다.
IronPDF는 경로 종속성을 완전히 제거합니다: ChromePdfRenderer을 생성하고 HTML 파일 경로와 함께 RenderHtmlFileAsPdf()을 호출한 다음, 결과를 기록하기 위해 SaveAs()을 사용하세요. 실행 파일 경로 없음, 프로세스 관리 없음, 경로 종속성 없음. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: 옵션을 사용한 URL에서 PDF로 변환
이전 (PrinceXML):
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
class Program
{
static void Main()
{
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.SetJavaScript(true);
prince.SetEncrypt(true);
prince.SetPDFTitle("Website Export");
prince.Convert("https://example.com", "webpage.pdf");
Console.WriteLine("URL converted to PDF");
}
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
class Program
{
static void Main()
{
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.SetJavaScript(true);
prince.SetEncrypt(true);
prince.SetPDFTitle("Website Export");
prince.Convert("https://example.com", "webpage.pdf");
Console.WriteLine("URL converted to PDF");
}
}
Imports PrinceXMLWrapper
Imports System
Class Program
Shared Sub Main()
Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
prince.SetJavaScript(True)
prince.SetEncrypt(True)
prince.SetPDFTitle("Website Export")
prince.Convert("https://example.com", "webpage.pdf")
Console.WriteLine("URL converted to PDF")
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.PdfTitle = "Website Export";
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.Encrypt("password");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("URL converted to PDF");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.PdfTitle = "Website Export";
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.Encrypt("password");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("URL converted to PDF");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.PdfTitle = "Website Export"
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.Encrypt("password")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("URL converted to PDF")
End Sub
End Class
이 예제는PrinceXML옵션이IronPDF속성에 매핑되는 방법을 보여줍니다. PrinceXML은 변환 전에 setter 메소드(SetJavaScript(), SetEncrypt(), SetPDFTitle())를 사용합니다. IronPDF는 RenderingOptions 속성을 사전 렌더링 설정에 사용하고, 후속 렌더링 메소드들은 PdfDocument 객체의 Encrypt()와 같은 메소드를 사용합니다.
주요 매핑:
prince.SetJavaScript(true)→renderer.RenderingOptions.EnableJavaScript = trueprince.SetPDFTitle("...")→renderer.RenderingOptions.PdfTitle = "..."prince.SetEncrypt(true)→pdf.Encrypt("password")(IronPDF는 비밀번호를 요구합니다)
더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: HTML 문자열을 PDF로 변환
이전 (PrinceXML):
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;
class Program
{
static void Main()
{
string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
File.WriteAllText("temp.html", html);
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.Convert("temp.html", "styled-output.pdf");
Console.WriteLine("Styled PDF created");
}
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;
class Program
{
static void Main()
{
string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
File.WriteAllText("temp.html", html);
Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
prince.Convert("temp.html", "styled-output.pdf");
Console.WriteLine("Styled PDF created");
}
}
Imports PrinceXMLWrapper
Imports System
Imports System.IO
Module Program
Sub Main()
Dim html As String = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>"
File.WriteAllText("temp.html", html)
Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
prince.Convert("temp.html", "styled-output.pdf")
Console.WriteLine("Styled PDF created")
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("styled-output.pdf");
Console.WriteLine("Styled PDF created");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("styled-output.pdf");
Console.WriteLine("Styled PDF created");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim html As String = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("styled-output.pdf")
Console.WriteLine("Styled PDF created")
End Sub
End Class
이 예는 중요한 차이를 강조합니다: PrinceXML은 파일 입력이 필요하므로 변환 전에 임시 파일(File.WriteAllText("temp.html", html))을 생성해야 합니다. IronPDF의 RenderHtmlAsPdf()은 HTML 문자열을 직접 수용합니다 - 임시 파일 없음, 정리 코드 없음, 디스크 I/O 오버헤드 없음.
CSS 페이징 미디어 마이그레이션
PrinceXML의 CSS 페이징 미디어 지원은 강력하지만, 다른 곳에서는 작동하지 않는 Prince 전용 CSS로 공급업체 종속성을 야기합니다:
PrinceXML CSS:
@page {
size: A4;
margin: 2cm;
@top-center {
content: "Document Title";
}
@bottom-right {
content: counter(page);
}
}
/* Prince-specific extensions */
prince-pdf-page-label: "Chapter " counter(chapter);
prince-pdf-destination: attr(id);
IronPDF C# (동등한 기능):
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56; // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
MaxHeight = 40
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56; // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
MaxHeight = 40
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 56 ' ~2cm
renderer.RenderingOptions.MarginBottom = 56
renderer.RenderingOptions.MarginLeft = 56
renderer.RenderingOptions.MarginRight = 56
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
.MaxHeight = 40
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
일반적인 CSS 마이그레이션 문제
문제 1: CSS @page가 작동하지 않음
IronPDF는 Chromium을 사용하며, 이 Chromium은 제한된 @page 지원을 가집니다. CSS 규칙을 RenderingOptions로 변환하십시오.
문제 2: 페이지 여백 상자 누락
CSS 마진 상자(@top-center, @bottom-right)는 Prince에 특화되어 있습니다. 대신 HtmlFooter을 사용하세요.
문제 3: string-set/content 작동하지 않음
string-set CSS 속성은 Prince에 특화되어 있습니다. <title> 태그에서 {html-title} 자리표시자를 사용하세요:
<title>Chapter 1: Introduction</title>
<title>Chapter 1: Introduction</title>
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div>{html-title}</div>"
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div>{html-title}</div>"
};
문제 4: counter(pages) 잘못됨
CSS 카운터 대신 IronPDF의 {total-pages} 자리표시자를 사용하세요.
성능 비교
| 작업 | PrinceXML | IronPDF |
|---|---|---|
| 간단한 HTML | ~400ms | ~300ms |
| 복잡한 CSS | ~600ms | ~400ms |
| JavaScript 페이지 | 제한적 | ~500ms |
| 대용량 문서 | ~1500ms | ~1000ms |
| 동시(10) | ~4000ms | ~1500ms |
| 시작 비용 | ~200ms | ~50ms |
이동 후 새로운 기능
IronPDF로 마이그레이션 후, PrinceXML이 제공할 수 없는 기능을 얻을 수 있습니다:
PDF 병합
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
Dim pdf1 = PdfDocument.FromFile("chapter1.pdf")
Dim pdf2 = PdfDocument.FromFile("chapter2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("complete_book.pdf")
워터마크
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
디지털 서명
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
양식 채우기
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
Dim pdf = PdfDocument.FromFile("form.pdf")
pdf.Form.GetFieldByName("Name").Value = "John Doe"
pdf.SaveAs("filled_form.pdf")
기능 비교 요약
| 기능 | PrinceXML | IronPDF |
|---|---|---|
| 네이티브 .NET | 아니요 | 예 |
| 외부 프로세스 | 필요함 | 아니요 |
| 비동기 지원 | 수동 래핑 | 네이티브 async/await |
| CSS 분할 미디어 | 지원됨 | RenderingOptions 통해 |
| CSS 그리드 | 예 | 예 |
| 플렉스박스 | 예 | 예 |
| JavaScript | 제한적 | 전체 ES2024 |
| 생성 | 예 | 예 |
| 병합 | 아니요 | 예 |
| 분할 | 아니요 | 예 |
| 편집 | 아니요 | 예 |
| 워터마크 | CSS 전용 | HTML/CSS + API |
| 디지털 서명 | 아니요 | 예 |
| PDF/A | 예 | 예 |
| 암호화 | 예 | 예 |
| 양식 | 아니요 | 예 |
| NuGet 패키지 | 아니요 | 예 |
| 서버 설치 | 필요함 | 아니요 |
마이그레이션 체크리스트
사전 마이그레이션
- 모든 Prince 명령줄 호출을 식별합니다
- 사용된 CSS @page 규칙을 문서화합니다
- Prince에 특화된 CSS 속성 목록 (
prince-*,string-set) - 어떤 PrinceJavaScript함수든지 메모합니다
- 사용된 PDF 기능을 식별합니다 (암호화, 메타데이터)
- ironpdf.com에서IronPDF라이선스 키 획득
코드 변경 사항
PrinceXMLWrapperNuGet 패키지 제거IronPdfNuGet Install-Package- 네임스페이스 가져오기 업데이트
Prince인스턴스화를ChromePdfRenderer으로 대체prince.Convert()을RenderHtmlFileAsPdf()또는RenderHtmlAsPdf()으로 대체- setter 메소드를
RenderingOptions속성으로 변환 - @page CSS를
RenderingOptions으로 마이그레이션 - 마진 상자를
HtmlFooter으로 대체 - CSS 카운터를
{total-pages}자리표시자로 변환 - HTML 문자열의 임시 파일 처리를 제거합니다
- 애플리케이션 시작 시 라이선스 초기화 추가
마이그레이션 이후
- HTML 파일 변환을 테스트합니다
- HTML 문자열 변환을 테스트합니다
- URL 변환을 테스트합니다
- 페이지 크기 일치를 확인합니다
- 여백 일치를 확인합니다
- 머리글과 바닥글을 테스트합니다
- 페이지 번호를 확인합니다
- 암호화/보안을 테스트합니다
- 서버에서 Prince 설치를 제거합니다
- 배포 스크립트 업데이트

