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

PeachPDF에서 IronPDF로의 마이그레이션 방법 (C#)

PeachPDF에서 IronPDF로의 마이그레이션은 포괄적인 기능, 활발한 개발, 전문적인 지원을 갖춘 Enterprise급 PDF 생성에 대한 접근을 제공합니다. 이 가이드는 PeachPDF의 pre-1.0 비동기 HTML-to-PDF 워크플로에서 Chromium 렌더링, 보안 설정 및 문서 조작 API를 갖춘 완전한 PDF 솔루션으로의 단계별 마이그레이션 경로를 제공합니다.

PeachPDF에서 IronPDF로 마이그레이션해야 하는 이유

PeachPDF이해

PeachPDF는 HTML을 PDF로 변환해야 하는 개발자를 위한 .NET 생태계의 비교적 새로운 구성원입니다. 라이브러리로서 PeachPDF는 순수 .NET 구현을 약속하며, 외부 프로세스에 의존하지 않아 .NET을 지원하는 플랫폼 간에 원활하게 통합될 수 있습니다. 이 특성은 PeachPDF를 가볍고 관리되는 라이브러리 솔루션을 찾고 있는 프로젝트에 매력적인 선택으로 만듭니다.

잠재력에도 불구하고 PeachPDF는 여전히 개발 중이며, 흥미로운 가능성과 주목할 만한 제약을 모두 강조합니다. PeachPDF는 순수 .NET Core로 다양한 환경에서 간단한 배포를 약속하기 때문에 매력적입니다. 그러나 이는 제한된 채택으로도 이어지며, 더 작은 사용자 기반과 커뮤니티 기반 지원을 의미합니다.

PeachPDF의 한계

PeachPDF는 jhaygood86에 의해 BSD-3-Clause 라이선스로 출시된, 단일 유지보수자에 의한 아직 1.0 이전 .NET 라이브러리입니다 (최신 0.7.26, 2025년 10월). 성숙도, 기능 및 지원이 부족합니다. 마이그레이션해야 하는 주요 이유:

  1. Pre-1.0 기능 세트: PeachPDF에는 내장된 디지털 서명,PDF/A준수, OCR, 양식 채우기, 또는 페이지 수준의 헤더/푸터 API가 없습니다.

  2. JavaScript 엔진 없음: PeachPDF는 브라우저가 아닌, PeachPDF.PdfSharpCore에 기반한 레이아웃 렌더러입니다; 스크립트와 복잡한 Grid/Flexbox 레이아웃이 실행되지 않습니다.

  3. net8.0만: 패키지는 net8.0을 대상으로 합니다; 이전 .NET Framework / .NET 6 프로젝트는 업그레이드하거나 다른 라이브러리를 선택해야 합니다.

  4. 작은 커뮤니티: 단일 GitHub 유지 관리자, 제한된 문서, 제한적인 예제.

  5. Enterprise 지원 없음: 상업적 지원이나 SLA 옵션이 없습니다.

PeachPDF대IronPDF비교

기능/특성 PeachPDF IronPDF
구현 순수 관리형 .NET (PeachPDF.PdfSharpCore + SixLabors 사용) 내장 Chromium 런타임과 함께 관리
라이선스 BSD-3-Clause 상업적
타겟 프레임워크 net8.0 .NET Framework 4.6.2+, .NET 6/7/8
사용자 기반 소규모 (1.0 이전, 0.7.26 2025년 10월 출시 예정) 대형
지원 커뮤니티 주도 (단일 유지보수자, jhaygood86) 전용 지원이 있는 전문적
HTML 렌더링 PDFSharpCore 기반의 HTML+CSS 레이아웃 엔진 전체 Chromium
CSS 지원 HTML+CSS 하위집합, 웹 폰트, @font-face 전체 CSS3
JavaScript 실행되지 않음 전체 ES2024
디지털 서명 아니요
PDF/A 준수 아니요
문서화 제한적 (단일 README) 광범위함
개발 상태 1.0 이전 (0.7.26, 2025년 10월) 성숙하고 안정적인 릴리스

IronPDF는 HTML-PDF 변환뿐만 아니라 OCR, 워터마크 작업 및 기타 고급 기능을 지원하는 광범위한 기능으로 두각을 나타냅니다. 전문적 지원 구조가 개발자가 겪는 문제에 대한 신속한 해결 경로를 제공합니다.

현대적인 .NET을 도입하는 팀에게는 IronPDF가 전체적인 기능과 적극적인 유지 관리를 제공하여 현재의 .NET 버전 전반에 걸쳐 장기적인 안정성을 지원합니다.


시작하기 전에

필수 조건

  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 PeachPDF
dotnet remove package PeachPDF

# Install IronPDF
dotnet add package IronPdf
# Remove PeachPDF
dotnet remove package PeachPDF

# Install IronPDF
dotnet add package IronPdf
SHELL

라이선스 구성

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

PeachPDF사용 식별

# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "PdfGenerator\|PdfGenerateConfig\|GeneratePdf" --include="*.cs" .
# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "PdfGenerator\|PdfGenerateConfig\|GeneratePdf" --include="*.cs" .
SHELL

완전한 API 참조

네임스페이스 변경

// Before: PeachPDF
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PeachPDF
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO
Imports System.Threading.Tasks
$vbLabelText   $csharpLabel

핵심 API 매핑

PeachPDF IronPDF
new PdfGenerator() new ChromePdfRenderer()
await generator.GeneratePdf(html, config) renderer.RenderHtmlAsPdf(html)
document.Save(stream) pdf.SaveAs(path)
document.Save(memStream) 이후 memStream.ToArray() pdf.BinaryData
new PdfGenerateConfig { NetworkAdapter = new HttpClientNetworkAdapter(...) } renderer.RenderUrlAsPdf(url)
config.PageSize, config.PageOrientation renderer.RenderingOptions.PaperSize, .PaperOrientation
소스 HTML에 포함 (CSS position: fixed) RenderingOptions.HtmlHeader / HtmlFooter
지원되지 않음 PdfDocument.FromFile(path)
지원되지 않음 PdfDocument.Merge(pdfs) / pdf.AppendPdf(...)

코드 마이그레이션 예제

예제 1: HTML 문자열을 PDF로 변환

이전 (PeachPDF):

using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            PageOrientation = PageOrientation.Portrait
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("output.pdf");
        document.Save(stream);
    }
}
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            PageOrientation = PageOrientation.Portrait
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("output.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.PdfSharpCore
Imports System.IO
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"

        Dim config As New PdfGenerateConfig With {
            .PageSize = PageSize.Letter,
            .PageOrientation = PageOrientation.Portrait
        }

        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(html, config)

        Using stream As FileStream = File.Create("output.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

이 예제는 두 라이브러리 간의 기본 차이를 보여줍니다. PeachPDF는 PdfGenerator (엔진)을 PdfGenerateConfig (설정)과 분리하고 비동기 GeneratePdf 메서드를 제공하며, Save 메서드가 Stream에 쓰는 문서를 반환합니다. IronPDF는 ChromePdfRendererRenderHtmlAsPdf()와 함께 사용하며, 내장 SaveAs() 메서드를 가진 PdfDocument 객체를 반환합니다.

IronPDF 접근 방식의 실질적 장점: PdfDocument 객체는 저장하기 전에 워터마크 추가, 병합, 보안 설정을 포함한 추가 조작이 가능하며 SaveAs 파일 경로를 직접 받아 중간 FileStream가 필요 없습니다. HTML에서 PDF로의 문서를 참조하여 더 많은 예제를 확인하세요.

예제 2: URL에서 PDF로 변환

이전 (PeachPDF):

// PeachPDF has no ConvertUrl-style helper; URL fetching is wired via
// HttpClientNetworkAdapter and passing null HTML so the engine fetches the page.
using PeachPDF;
using PeachPDF.Network;
using PeachPDF.PdfSharpCore;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var http = new HttpClient();

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            NetworkAdapter = new HttpClientNetworkAdapter(http, new Uri("https://www.example.com"))
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(null, config);

        using var stream = File.Create("webpage.pdf");
        document.Save(stream);
    }
}
// PeachPDF has no ConvertUrl-style helper; URL fetching is wired via
// HttpClientNetworkAdapter and passing null HTML so the engine fetches the page.
using PeachPDF;
using PeachPDF.Network;
using PeachPDF.PdfSharpCore;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var http = new HttpClient();

        var config = new PdfGenerateConfig
        {
            PageSize = PageSize.Letter,
            NetworkAdapter = new HttpClientNetworkAdapter(http, new Uri("https://www.example.com"))
        };

        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(null, config);

        using var stream = File.Create("webpage.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.Network
Imports PeachPDF.PdfSharpCore
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim http As New HttpClient()

        Dim config As New PdfGenerateConfig With {
            .PageSize = PageSize.Letter,
            .NetworkAdapter = New HttpClientNetworkAdapter(http, New Uri("https://www.example.com"))
        }

        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(Nothing, config)

        Using stream = File.Create("webpage.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim url = "https://www.example.com"
        Dim pdf = renderer.RenderUrlAsPdf(url)
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PeachPDF에는 일급 URL-to-PDF 헬퍼가 없습니다; NetworkAdapterHttpClientNetworkAdapter로 설정하고 null HTML을 전달하여 엔진이 페이지를 검색하도록 합니다. IronPDF는 RenderUrlAsPdf(url)를 직접 제공합니다. PeachPDF는 JavaScript를 실행하지 않기 때문에 싱글 페이지 앱과 동적 콘텐츠가 네트워크 어댑터 경로를 통해 일반적으로 올바르게 렌더링되지 않습니다; IronPDF의 Chromium 엔진은 현대 CSS 및 JavaScript를 처리합니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.

예제 3: 헤더와 푸터 추가

이전 (PeachPDF):

// PeachPDF v0.7.x has no header/footer API. The closest approach is
// to embed the header/footer markup directly inside the source HTML
// using CSS positioning.
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = @"
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>";

        var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("document.pdf");
        document.Save(stream);
    }
}
// PeachPDF v0.7.x has no header/footer API. The closest approach is
// to embed the header/footer markup directly inside the source HTML
// using CSS positioning.
using PeachPDF;
using PeachPDF.PdfSharpCore;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = @"
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>";

        var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
        var generator = new PdfGenerator();
        var document = await generator.GeneratePdf(html, config);

        using var stream = File.Create("document.pdf");
        document.Save(stream);
    }
}
Imports PeachPDF
Imports PeachPDF.PdfSharpCore
Imports System.IO
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim html As String = "
            <html><head><style>
              .header { position: fixed; top: 0; left: 0; right: 0; text-align:center; }
              .footer { position: fixed; bottom: 0; left: 0; right: 0; text-align:center; }
            </style></head>
            <body>
              <div class='header'>My Header</div>
              <h1>Document Content</h1>
              <div class='footer'>Footer text</div>
            </body></html>"

        Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
        Dim generator As New PdfGenerator()
        Dim document = Await generator.GeneratePdf(html, config)

        Using stream = File.Create("document.pdf")
            document.Save(stream)
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
        renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
        var html = "<html><body><h1>Document Content</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("document.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Module Program
    Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {.HtmlFragment = "<div style='text-align:center'>My Header</div>"}
        renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {.HtmlFragment = "<div style='text-align:center'>Page {page}</div>"}
        Dim html As String = "<html><body><h1>Document Content</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("document.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

이 예제는 중요한 구조적 차이점을 보여줍니다. PeachPDF는 PdfGenerator 또는 PdfGenerateConfig에 헤더/푸터 API를 제공하지 않으며, 따라서 페이지 Chrome은 CSS 위치 지정 방식을 통해 소스 HTML 안에 있어야 합니다. IronPDF는 페이지 Chrome을 문서 콘텐츠와 분리하여 RenderingOptions.HtmlHeaderRenderingOptions.HtmlFooter에 할당된 HtmlHeaderFooter 객체를 사용합니다.

IronPDF 접근 방식은 헤더/푸터 크기를 제어하기 위한 MaxHeight와 같은 속성을 제공하며 페이지 번호 매김을 위한 {page}{total-pages} 플레이스홀더를 지원합니다.

IronPDF에 필요한 추가 네임스페이스 주의: HtmlHeaderFooter 클래스에 using IronPdf.Rendering;가 필요합니다.


중요한 마이그레이션 노트

Generator/Renderer 클래스 변경

PeachPDF는 PdfGenerator + PdfGenerateConfig 쌍을 사용합니다; IronPDF는 단일 ChromePdfRenderer를 사용합니다:

// PeachPDF
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();

// IronPDF
var renderer = new ChromePdfRenderer();
// PeachPDF
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();

// IronPDF
var renderer = new ChromePdfRenderer();
' PeachPDF
Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
Dim generator As New PdfGenerator()

' IronPDF
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

비동기 vs 동기, 및 반환 유형

PeachPDF의 GeneratePdf는 비동기 전용이며, Save 메서드에 Stream을 사용하는 문서를 반환합니다. IronPDF의 RenderHtmlAsPdf는 동기식이며 (비동기 변형 RenderHtmlAsPdfAsync도 사용 가능) PdfDocument을 반환합니다:

// PeachPDF: async, save to a Stream
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create("output.pdf");
document.Save(fs);

// IronPDF: synchronous PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
// PeachPDF: async, save to a Stream
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create("output.pdf");
document.Save(fs);

// IronPDF: synchronous PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;
Imports System.IO

' PeachPDF: async, save to a Stream
Dim document = Await generator.GeneratePdf(html, config)
Using fs As FileStream = File.Create("output.pdf")
    document.Save(fs)
End Using

' IronPDF: synchronous PdfDocument object
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or get bytes: Dim bytes As Byte() = pdf.BinaryData
$vbLabelText   $csharpLabel

헤더/푸터 속성 변경

// PeachPDF: no header/footer API -- embed in source HTML
// (e.g. via CSS position:fixed)

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Footer</div>"
};
// PeachPDF: no header/footer API -- embed in source HTML
// (e.g. via CSS position:fixed)

// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
    HtmlFragment = "<div>Footer</div>"
};
' PeachPDF: no header/footer API -- embed in source HTML
' (e.g. via CSS position:fixed)

' IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div>Header</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div>Footer</div>"
}
$vbLabelText   $csharpLabel

메서드 이름 변경

PeachPDF IronPDF
await generator.GeneratePdf(html, config) renderer.RenderHtmlAsPdf(html)
NetworkAdapter = new HttpClientNetworkAdapter(...) + GeneratePdf(null, config) renderer.RenderUrlAsPdf(url)
document.Save(stream) pdf.SaveAs(path)

이동 후 새로운 기능

IronPDF로 마이그레이션한 후 PeachPDF가 제공할 수 없는 기능을 얻게 됩니다:

PDF 병합

var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
CONVERTER NOT RUNNING
$vbLabelText   $csharpLabel

HTML을 사용한 워터마크

var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>")
pdf.SaveAs("watermarked.pdf")
$vbLabelText   $csharpLabel

비밀번호 보호

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;

pdf.SaveAs("protected.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>")

pdf.SecuritySettings.OwnerPassword = "owner123"
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint

pdf.SaveAs("protected.pdf")
$vbLabelText   $csharpLabel

디지털 서명

using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
using IronPdf.Signing;

var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningReason = "Document Approval",
    SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
Imports IronPdf.Signing

Dim pdf = PdfDocument.FromFile("document.pdf")
Dim signature = New PdfSignature("certificate.pfx", "password") With {
    .SigningReason = "Document Approval",
    .SigningLocation = "New York"
}
pdf.Sign(signature)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

비동기 작업

var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>")
pdf.SaveAs("async_output.pdf")
$vbLabelText   $csharpLabel

기능 비교 요약

기능 PeachPDF IronPDF
HTML to PDF PdfSharpCore 기반 레이아웃 전체 Chromium
URL을 PDF로 변환 HttpClientNetworkAdapter를 통해 (JS 없음)
CSS Grid/Flexbox 부분적 / 보장되지 않음
JavaScript 실행되지 않음 전체 ES2024
PDF 병합 아니요 (HTML->PDF 전용)
PDF 분할 아니요
워터마크 HTML을 통한 수동 전체 HTML
헤더/푸터 HTML/CSS를 통한 수동 전체 HTML
디지털 서명 아니요
PDF/A 아니요
폼 채우기 아니요
텍스트 추출 아니요
이미지 추출 아니요
비동기 지원 비동기 전용 API
크로스 플랫폼 net8.0 (윈도우 / 리눅스 / macOS)

일반적인 마이그레이션 문제

문제 1: 다른 API 패턴

문제: PeachPDF는 PdfGenerator (엔진)과 PdfGenerateConfig (설정)을 분리하며 비동기 방식입니다; IronPDF는 하나의 ChromePdfRenderer 만 사용하며, 동기적으로 PdfDocument을 반환합니다.

해결책:

// PeachPDF pattern (async, stream-out)
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create(path);
document.Save(fs);

// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
// PeachPDF pattern (async, stream-out)
var config = new PdfGenerateConfig { PageSize = PageSize.Letter };
var generator = new PdfGenerator();
var document = await generator.GeneratePdf(html, config);
using var fs = File.Create(path);
document.Save(fs);

// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);
Imports System.IO

' PeachPDF pattern (async, stream-out)
Dim config As New PdfGenerateConfig With {.PageSize = PageSize.Letter}
Dim generator As New PdfGenerator()
Dim document = Await generator.GeneratePdf(html, config)
Using fs As FileStream = File.Create(path)
    document.Save(fs)
End Using

' IronPDF pattern
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(path)
$vbLabelText   $csharpLabel

이슈 2: 스트림을 대상으로 저장, 경로가 아님

문제: PeachPDF의 document.Save(stream)Stream만 받습니다; IronPDF의 pdf.SaveAs(path)는 경로 문자열을 받습니다.

해결책: pdf.SaveAs("file.pdf")를 IronPDF에서 직접 사용하고, FileStream을 열지 마십시오.

이슈 3: 기존 PDF 작업 없음

문제: PeachPDF는 HTML-to-PDF 전용입니다; 기존 PDF를 로드, 병합, 분할, 편집할 수 없습니다.

해결책: 해당 작업을 IronPDF의 PdfDocument.FromFile, PdfDocument.Merge, pdf.AppendPdf으로 대체하십시오.


마이그레이션 체크리스트

사전 마이그레이션

  • 코드베이스에서PeachPDF사용을 감사하라
  • 사용자 정의 구성 문서화
  • 모든 헤더/푸터 구현을 기록
  • ironpdf.com에서IronPDF라이선스 키 획득 -IronPDF체험판 라이선스로 먼저 테스트

패키지 변경 사항

  • PeachPDF NuGet 패키지 제거
  • IronPdf NuGet Install-Package: dotnet add package IronPdf

코드 변경 사항

  • 네임스페이스 가져오기 업데이트 (using PeachPDF;using IronPdf;)
  • 헤더/푸터 기능을 위한 using IronPdf.Rendering; 추가
  • PdfGenerator + PdfGenerateConfigChromePdfRenderer로 대체
  • await generator.GeneratePdf(html, config)renderer.RenderHtmlAsPdf(html)으로 대체 (또는 비동기를 유지하려면 RenderHtmlAsPdfAsync 사용)
  • HttpClientNetworkAdapter + GeneratePdf(null, config)renderer.RenderUrlAsPdf(url)로 대체
  • document.Save(stream)pdf.SaveAs(path)로 대체
  • HTML 내장형 헤더/푸터를 HtmlFooter 객체로 대체
  • 애플리케이션 시작 시 라이선스 초기화 추가

마이그레이션 이후

  • HTML 렌더링 품질 테스트
  • PDF 출력이 기대와 일치하는지 확인
  • 페이지 번호와 함께 헤더/푸터 렌더링 테스트
  • 필요에 따라 새 기능(보안, 워터마크, 병합) 추가

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

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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