C#에서 NReco PDF Generator에서 IronPDF로 마이그레이션하는 방법
왜 NReco PDF Generator에서 IronPDF로 이전해야 합니까
NReco PDF Generator의 중요한 보안 문제
NReco PDF Generator는 wkhtmltopdf 바이너리를 래핑하며, 이는 알려진 보안 취약성을 상속받습니다. wkhtmltopdf 프로젝트의 마지막 안정 릴리스는 0.12.6 (2020년 6월)이며, 상류 리포지토리는 2023년 1월 2일에 아카이브화되었으므로 더 이상 패치 제공되지 않음:
- CVE-2020-21365: 디렉토리 트래버셜 / 로컬 파일 읽기 через 특수 제작된 HTML (동일 출처 정책 약점)
- CVE-2022-35583: 서버 측 요청 위조 (SSRF) - 주입된
<iframe>을 통해 0.12.6에서 발생 (CVSS 9.8)
추가NReco PDF Generator 제한 사항
-
스케일 할 때의 라이선스 마찰: 비-SaaS 단일 서버 생산 배포에 무료 SaaS, 멀티 서버 또는 재배포 시나리오에는 nrecosite.com에서 판매하는 $199 Enterprise 소스 코드 팩이 필요합니다.
-
더 이상 사용되지 않는 렌더링 엔진: 제한된 CSS3/JS 지원을 가진 WebKit Qt (약 2012):
- CSS Grid나 Flexbox 없음
- 최신 JavaScript(ES6+) 미지원
- 제한적인 웹 글꼴 지원
- CSS 변수나 사용자 지정 속성 미지원
-
외부 바이너리 종속성: 플랫폼별로 wkhtmltopdf 바이너리를 관리해야 합니다 (
wkhtmltopdf.exe,wkhtmltox.dll). -
유지보수 중단: NReco.PdfGenerator 1.2.1은 2023년 1월 8일에 발표되었으며 nuget.org에 더 이상 출시되지 않음; 기본 wkhtmltopdf 엔진은 더 이상 업데이트되지 않습니다.
- 제한된 비동기 지원: 동기 API는 웹 응용 프로그램에서 스레드를 차단합니다.
NReco PDF Generator vsIronPDF비교
| 측면 | NReco PDF Generator | IronPDF |
|---|---|---|
| 렌더링 엔진 | WebKit Qt (2012) | Chromium (현재) |
| 보안 | 여러 개의 패치되지 않은 CVE (예: CVE-2020-21365, CVE-2022-35583); 엔진은 2023년 1월 2일에 보관됨 | 활성 보안 업데이트 |
| CSS 지원 | CSS2.1, 제한된 CSS3 | 전체 CSS3, Grid, Flexbox |
| JavaScript | 기본 ES5 | 전체 ES6+, async/await 지원 |
| 종속성 | 외부 wkhtmltopdf 바이너리 | 자급자족 |
| 비동기 지원 | 동기식만 | 완전한 async/await |
| 웹 폰트 | 제한적 | 전체 Google 폰트, @font-face |
| 라이센스 | 비 SaaS 단일 서버에서는 무료; SaaS / 멀티 서버용 $199 Enterprise 팩 | 투명한 상업 가격 |
| 무료 등급 | 비 SaaS 단일 서버 라이선스 하에 무료 | 시험판에 워터마크 없음 |
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf
또한 배포에서 wkhtmltopdf 바이너리 제거:
wkhtmltopdf.exe,wkhtmltox.dll프로젝트에서 삭제- wkhtmltopdf 설치 스크립트 제거
- 플랫폼별 바이너리 폴더 삭제
라이선스 구성
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 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"
NReco PDF Generator 사용 식별
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .
완전한 API 참조
핵심 클래스 매핑
| NReco PDF Generator | IronPDF |
|---|---|
HtmlToPdfConverter |
ChromePdfRenderer |
PageMargins |
개별 여백 속성 |
PageOrientation |
PdfPaperOrientation |
PageSize |
PdfPaperSize |
렌더링 방법 매핑
| NReco PDF Generator | IronPDF |
|---|---|
GeneratePdf(html) |
RenderHtmlAsPdf(html) |
GeneratePdfFromFile(url, output) |
RenderUrlAsPdf(url) |
GeneratePdfFromFile(htmlPath, output) |
RenderHtmlFileAsPdf(path) |
| (비동기 지원 안 함) | RenderHtmlAsPdfAsync(html) |
| (비동기 지원 안 함) | RenderUrlAsPdfAsync(url) |
페이지 구성 매핑
| NReco PDF Generator | IronPDF |
|---|---|
PageWidth = 210 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
PageHeight = 297 |
RenderingOptions.SetCustomPaperSizeinMilimeters(w, h) |
Orientation = PageOrientation.Landscape |
RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
Size = PageSize.A4 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
여백 매핑
| NReco PDF Generator | IronPDF |
|---|---|
Margins.Top = 10 |
RenderingOptions.MarginTop = 10 |
Margins.Bottom = 10 |
RenderingOptions.MarginBottom = 10 |
Margins.Left = 10 |
RenderingOptions.MarginLeft = 10 |
Margins.Right = 10 |
RenderingOptions.MarginRight = 10 |
new PageMargins { ... } |
개별 속성 |
헤더/푸터 플레이스홀더 매핑
| NReco PDF Generator (wkhtmltopdf) | IronPDF |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
출력 처리 매핑
| NReco PDF Generator | IronPDF |
|---|---|
byte[] pdfBytes = GeneratePdf(html) |
PdfDocument pdf = RenderHtmlAsPdf(html) |
File.WriteAllBytes(path, bytes) |
pdf.SaveAs(path) |
return pdfBytes |
return pdf.BinaryData |
new MemoryStream(pdfBytes) |
new MemoryStream(pdf.BinaryData) |
코드 마이그레이션 예제
예제 1: 기본 HTML에서 PDF로
이전 (NReco PDF Generator):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("output.pdf", pdfBytes)
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
기본적인 차이점은 반환 유형과 저장 패턴에 있습니다. NReco PDF Generator의 HtmlToPdfConverter.GeneratePdf()는 byte[]를 반환하며, 이를 File.WriteAllBytes()를 사용하여 수동으로 디스크에 작성해야 합니다. IronPDF의 ChromePdfRenderer.RenderHtmlAsPdf()는 내장 SaveAs() 메서드를 가진 PdfDocument 객체를 반환합니다.
이 객체 지향 접근 방식은 추가적인 이점을 제공합니다: 저장 전에 PDF를 조작(워터마크 추가, 문서 병합, 보안 추가)할 수 있습니다. 기존 코드와의 호환성을 위해 원시 바이트가 필요한 경우, pdf.BinaryData을 사용하십시오. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예제 2: 여백이 있는 맞춤 페이지 크기
이전 (NReco PDF Generator):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
htmlToPdf.PageWidth = 210
htmlToPdf.PageHeight = 297
htmlToPdf.Margins = New PageMargins With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("custom-size.pdf", pdfBytes)
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("custom-size.pdf")
End Sub
End Class
NReco PDF Generator는 숫자 차원 (PageWidth = 210, PageHeight = 297) 및 PageMargins 객체를 사용합니다. IronPDF는 PdfPaperSize 열거형을 사용하며 (A4, Letter, Legal과 같은 표준 크기가 포함됨) RenderingOptions 객체에서 개별 여백 속성을 사용합니다.
주요 마이그레이션 변경 사항:
PageHeight→RenderingOptions.PaperSize = PdfPaperSize.A4new PageMargins { Top = 10, ... }→ Individual properties:RenderingOptions.MarginTop = 10
열거형에 포함되지 않은 맞춤 종이 크기의 경우, RenderingOptions.SetCustomPaperSizeinMilimeters(width, height)을 사용하십시오. 페이지 구성 옵션에 대해 자세히 알아보십시오.
예제 3: URL을 PDF로 변환하기
이전 (NReco PDF Generator):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf As New HtmlToPdfConverter()
Dim pdfBytes As Byte() = htmlToPdf.GeneratePdfFromFile("https://www.example.com", Nothing)
File.WriteAllBytes("webpage.pdf", pdfBytes)
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
NReco PDF Generator는 혼동스럽게도 로컬 파일과 URL 모두에 대해 GeneratePdfFromFile() 메서드를 사용하며, 두 번째 매개변수는 null 허용입니다. IronPDF는 전용 메서드를 제공합니다: URL용 RenderUrlAsPdf() 및 로컬 HTML 파일용 RenderHtmlFileAsPdf().
IronPDF 접근 방식은 더 깔끔하고 직관적입니다. 비동기 웹 애플리케이션의 경우, await renderer.RenderUrlAsPdfAsync(url)을 사용하여 스레드 차단을 피하십시오. 이는 NReco PDF Generator가 단순히 할 수 없는 것입니다.
중요한 마이그레이션 노트
확대/축소 값 변환
NReco PDF Generator는 float 값(0.0-2.0)을 사용하지만 IronPDF는 백분율 정수를 사용합니다:
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);
' NReco PDF Generator: Zoom = 0.9F (90%)
' IronPDF: Zoom = 90
' Conversion formula:
Dim ironPdfZoom As Integer = CInt(nrecoZoom * 100)
플레이스홀더 구문 업데이트
모든 헤더/풋터 플레이스홀더를 업데이트해야 합니다:
| NReco PDF Generator | IronPDF |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[title] |
{html-title} |
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
Imports NReco.PdfGenerator
Imports IronPdf
' NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>"
' IronPDF:
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div>Page {page} of {total-pages}</div>",
.MaxHeight = 20
}
반환 타입 변경
NReco PDF Generator는 byte[]를 직접 반환합니다; IronPDF는 PdfDocument를 반환합니다:
//NReco PDF Generator pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
//NReco PDF Generator pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
' NReco PDF Generator pattern:
Dim pdfBytes As Byte() = converter.GeneratePdf(html)
File.WriteAllBytes("output.pdf", pdfBytes)
' IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
스레드 안전성과 재사용 가능성
NReco PDF Generator는 일반적으로 호출 당 새로운 변환기를 생성합니다. IronPDF의 ChromePdfRenderer는 스레드 안전하며 재사용 가능합니다:
//NReco PDF Generator pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
//IronPDF pattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
//NReco PDF Generator pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
//IronPDF pattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
Imports NReco.PdfGenerator
Imports IronPdf
' NReco PDF Generator pattern (creates new each time):
Public Function Generate(html As String) As Byte()
Dim converter As New HtmlToPdfConverter()
Return converter.GeneratePdf(html)
End Function
' IronPDF pattern (reuse renderer, thread-safe):
Private ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
비동기 지원 (새로운 기능)
IronPDF는 NReco PDF Generator가 제공할 수 없는 async/await 패턴을 지원합니다:
// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
Imports System.Threading.Tasks
' NReco PDF Generator: No async support available
' IronPDF: Full async support
Public Async Function GenerateAsync(html As String) As Task(Of Byte())
Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
문제 해결
이슈 1: HtmlToPdfConverter를 찾을 수 없음
문제: IronPDF에는 HtmlToPdfConverter 클래스가 존재하지 않습니다.
해결책: ChromePdfRenderer을 사용하십시오:
// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
' NReco PDF Generator
Dim converter As New HtmlToPdfConverter()
' IronPDF
Dim renderer As New ChromePdfRenderer()
문제 2: GeneratePdf가 잘못된 유형을 반환함
문제: 코드는 byte[]을 기대하지만 PdfDocument을 받습니다.
해결책: .BinaryData 속성에 접근하십시오:
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
' NReco PDF Generator
Dim pdfBytes As Byte() = converter.GeneratePdf(html)
' IronPDF
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
문제 3: PageMargins 객체를 찾을 수 없음
문제: IronPDF에는 PageMargins 클래스가 존재하지 않습니다.
해결책: 개별 마진 속성을 사용하십시오:
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
' NReco PDF Generator
converter.Margins = New PageMargins With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
' IronPDF
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
문제 4: 페이지 번호가 나타나지 않음
문제: [page] 및 [topage] 자리 표시자가 작동하지 않습니다.
솔루션: IronPDF의 플레이스홀더 구문으로 업데이트하십시오:
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};
Imports NReco.PdfGenerator
Imports IronPdf
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>"
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div>Page {page} of {total-pages}</div>",
.MaxHeight = 20
}
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에 있는 모든
NReco.PdfGenerator사용량 목록 작성 - 모든
CustomWkHtmlArgs및CustomWkHtmlPageArgs값을 문서 작성 - 플레이스홀더가 포함된 모든 헤더/풋터 HTML 템플릿을 나열하십시오
- 비동기 요구 사항(web 컨트롤러, 서비스)을 식별하십시오
- 확대 및 마진 설정을 검토하십시오
- 비교를 위해 기존 PDF 출력을 백업하십시오 -IronPDF라이센스 키를 받으세요
패키지 변경 사항
NReco.PdfGeneratorNuGet 패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf- 네임스페이스 가져오기를
using NReco.PdfGenerator;에서using IronPdf;로 업데이트
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
HtmlToPdfConverter을ChromePdfRenderer로 교체GeneratePdf(html)을RenderHtmlAsPdf(html)로 교체GeneratePdfFromFile(url, null)을RenderUrlAsPdf(url)로 교체PageMargins객체를 개별 여백 속성으로 변환- 확대 값을 float에서 백분율로 업데이트하십시오
- 자리 표시자 구문 업데이트:
[page]→{page},[topage]→{total-pages} File.WriteAllBytes()을pdf.SaveAs()로 교체- 유익한 경우 동기 호출을 비동기로 변환하십시오
마이그레이션 이후
- 프로젝트/배포에서 wkhtmltopdf 바이너리를 제거하십시오
- wkhtmltopdf 설치를 제거하도록 Docker 파일을 업데이트하십시오
- PDF 출력 비교 회귀 테스트 실행
- 머리글/바닥글 플레이스홀더가 올바르게 렌더링되는지 확인
- 모든 대상 플랫폼(Windows, Linux, macOS)에서 테스트
- CI/CD 파이프라인을 업데이트하여 wkhtmltopdf 단계를 제거
- 보안 검사를 업데이트하여 CVE 제거 확인

