C#에서 NReco PDF Generator에서 IronPDF로 마이그레이션하는 방법
왜 NReco PDF Generator에서 IronPDF로 이전해야 합니까
NReco PDF Generator의 중요한 보안 문제
NReco PDF Generator는 더 이상 사용되지 않는 wkhtmltopdf 바이너리를 감싸고 있으며, 그로 인해 모든 보안 취약점을 상속받습니다. 이것은 이론적인 문제가 아닙니다—2020년에 wkhtmltopdf가 버려진 이후로 패치가 제공되지 않는 20개 이상의 문서화된 CVE가 존재합니다:
- CVE-2020-21365: 서버 측 요청 변조(SSRF)
- CVE-2022-35583: HTML 인젝션을 통한 로컬 파일 읽기
- CVE-2022-35580: 원격 코드 실행 가능성
이러한 취약점은 기초가 되는 wkhtmltopdf 프로젝트가 더 이상 유지되지 않기 때문에 패치할 수 없습니다.
추가 NReco PDF Generator 제한 사항
-
워터마크가 있는 무료 버전: 운영 환경에서 사용하려면 영업 부서에 문의해야 하는 불투명한 가격의 유료 라이센스가 필요합니다.
-
더 이상 사용되지 않는 렌더링 엔진: WebKit Qt(2012년 경)는 제한된 최신 웹 지원을 제공합니다:
- CSS Grid나 Flexbox 없음
- 최신 JavaScript(ES6+) 미지원
- 제한적인 웹 글꼴 지원
- CSS 변수나 사용자 지정 속성 미지원
-
외부 바이너리 의존성: 각 플랫폼에 대해 wkhtmltopdf 바이너리를 관리해야 함 (
wkhtmltopdf.exe,wkhtmltox.dll). -
활성 개발 없음: 래퍼는 유지보수를 받지만 기초 엔진 업데이트는 없음.
- 제한된 비동기 지원: 동기 API는 웹 응용 프로그램에서 스레드를 차단합니다.
NReco PDF Generator vsIronPDF비교
| 측면 | NReco PDF Generator | IronPDF |
|---|---|---|
| 렌더링 엔진 | WebKit Qt (2012) | Chromium (현재) |
| 보안 | 20개 이상의 CVE, 패치 없음 | 활성 보안 업데이트 |
| CSS 지원 | CSS2.1, 제한된 CSS3 | 전체 CSS3, Grid, Flexbox |
| JavaScript | 기본 ES5 | 전체 ES6+, async/await 지원 |
| 종속성 | 외부 wkhtmltopdf 바이너리 | 자급자족 |
| 비동기 지원 | 동기식만 | 완전한 async/await |
| 웹 폰트 | 제한적 | 전체 Google 폰트, @font-face |
| 라이센스 | 불투명한 가격, 영업에 문의 | 투명한 가격 |
| 무료 체험판 | 워터마크 있음 | 전체 기능 |
.NET 10 및 C# 14를 2025년과 2026년까지 도입하려는 팀을 위해 IronPDF는 활성 개발과 최신 렌더링 기능을 갖춘 미래 지향적 기초를 제공합니다.
시작하기 전에
필수 조건
- .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) |
pdf.Stream |
코드 마이그레이션 예제
예제 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는 혼란스러운 이름의 GeneratePdfFromFile() 메서드를 로컬 파일 및 URL 모두에 대해 nullable 두 번째 매개변수와 함께 사용합니다. IronPDF는 URL에 대한 전용 메서드 RenderUrlAsPdf() 및 로컬 HTML 파일에 대한 RenderHtmlFileAsPdf()를 제공합니다.
IronPDF 접근은 더 깔끔하고 직관적입니다. 비동기 웹 애플리케이션의 경우, NReco PDF Generator가 할 수 없는 스레드 차단을 피하기 위해 await renderer.RenderUrlAsPdfAsync(url)를 사용하십시오.
중요한 마이그레이션 노트
확대/축소 값 변환
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);
//IronPDFpattern:
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);
//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
Imports System.IO
' 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);
}
//IronPDFpattern (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);
}
//IronPDFpattern (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 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 제거 확인

