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

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

  1. 워터마크가 있는 무료 버전: 운영 환경에서 사용하려면 영업 부서에 문의해야 하는 불투명한 가격의 유료 라이센스가 필요합니다.

  2. 더 이상 사용되지 않는 렌더링 엔진: WebKit Qt(2012년 경)는 제한된 최신 웹 지원을 제공합니다:

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

  4. 활성 개발 없음: 래퍼는 유지보수를 받지만 기초 엔진 업데이트는 없음.

  5. 제한된 비동기 지원: 동기 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는 활성 개발과 최신 렌더링 기능을 갖춘 미래 지향적 기초를 제공합니다.


시작하기 전에

필수 조건

  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) 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
$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는 혼란스러운 이름의 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)
$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);

//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
$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);
}

//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
$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 제거 확인

커티스 차우
기술 문서 작성자

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

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

아이언 서포트 팀

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