푸터 콘텐츠로 바로가기
마이그레이션 가이드

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 제한 사항

  1. 스케일 할 때의 라이선스 마찰: 비-SaaS 단일 서버 생산 배포에 무료 SaaS, 멀티 서버 또는 재배포 시나리오에는 nrecosite.com에서 판매하는 $199 Enterprise 소스 코드 팩이 필요합니다.

  2. 더 이상 사용되지 않는 렌더링 엔진: 제한된 CSS3/JS 지원을 가진 WebKit Qt (약 2012):

    • CSS Grid나 Flexbox 없음
    • 최신 JavaScript(ES6+) 미지원
    • 제한적인 웹 글꼴 지원
    • CSS 변수나 사용자 지정 속성 미지원
  3. 외부 바이너리 종속성: 플랫폼별로 wkhtmltopdf 바이너리를 관리해야 합니다 (wkhtmltopdf.exe, wkhtmltox.dll).

  4. 유지보수 중단: NReco.PdfGenerator 1.2.1은 2023년 1월 8일에 발표되었으며 nuget.org에 더 이상 출시되지 않음; 기본 wkhtmltopdf 엔진은 더 이상 업데이트되지 않습니다.

  5. 제한된 비동기 지원: 동기 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 단일 서버 라이선스 하에 무료 시험판에 워터마크 없음

시작하기 전에

필수 조건

  1. .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
  3. 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
SHELL

또한 배포에서 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"
$vbLabelText   $csharpLabel

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" .
SHELL

완전한 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
$vbLabelText   $csharpLabel

이후 (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
$vbLabelText   $csharpLabel

기본적인 차이점은 반환 유형과 저장 패턴에 있습니다. 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
$vbLabelText   $csharpLabel

이후 (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
$vbLabelText   $csharpLabel

NReco PDF Generator는 숫자 차원 (PageWidth = 210, PageHeight = 297) 및 PageMargins 객체를 사용합니다. IronPDF는 PdfPaperSize 열거형을 사용하며 (A4, Letter, Legal과 같은 표준 크기가 포함됨) RenderingOptions 객체에서 개별 여백 속성을 사용합니다.

주요 마이그레이션 변경 사항:

  • PageHeightRenderingOptions.PaperSize = PdfPaperSize.A4
  • new 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
$vbLabelText   $csharpLabel

이후 (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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

플레이스홀더 구문 업데이트

모든 헤더/풋터 플레이스홀더를 업데이트해야 합니다:

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
}
$vbLabelText   $csharpLabel

반환 타입 변경

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
$vbLabelText   $csharpLabel

스레드 안전성과 재사용 가능성

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
$vbLabelText   $csharpLabel

비동기 지원 (새로운 기능)

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
$vbLabelText   $csharpLabel

문제 해결

이슈 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()
$vbLabelText   $csharpLabel

문제 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
$vbLabelText   $csharpLabel

문제 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
$vbLabelText   $csharpLabel

문제 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
}
$vbLabelText   $csharpLabel

마이그레이션 체크리스트

사전 마이그레이션

  • 코드베이스에 있는 모든 NReco.PdfGenerator 사용량 목록 작성
  • 모든 CustomWkHtmlArgsCustomWkHtmlPageArgs 값을 문서 작성
  • 플레이스홀더가 포함된 모든 헤더/풋터 HTML 템플릿을 나열하십시오
  • 비동기 요구 사항(web 컨트롤러, 서비스)을 식별하십시오
  • 확대 및 마진 설정을 검토하십시오
  • 비교를 위해 기존 PDF 출력을 백업하십시오 -IronPDF라이센스 키를 받으세요

패키지 변경 사항

  • NReco.PdfGenerator NuGet 패키지 제거
  • IronPdf NuGet Install-Package: dotnet add package IronPdf
  • 네임스페이스 가져오기를 using NReco.PdfGenerator;에서 using IronPdf;로 업데이트

코드 변경 사항

  • 시작 시 라이선스 키 구성 추가
  • HtmlToPdfConverterChromePdfRenderer로 교체
  • 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 제거 확인

참고해 주세요NReco와 wkhtmltopdf는 각 소유자의 등록 상표입니다. 이 사이트는 NReco 또는 wkhtmltopdf와 관련이 없으며, 이에 의해 승인되거나 후원받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해