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월). 성숙도, 기능 및 지원이 부족합니다. 마이그레이션해야 하는 주요 이유:
-
Pre-1.0 기능 세트: PeachPDF에는 내장된 디지털 서명,PDF/A준수, OCR, 양식 채우기, 또는 페이지 수준의 헤더/푸터 API가 없습니다.
-
JavaScript 엔진 없음: PeachPDF는 브라우저가 아닌,
PeachPDF.PdfSharpCore에 기반한 레이아웃 렌더러입니다; 스크립트와 복잡한 Grid/Flexbox 레이아웃이 실행되지 않습니다. -
net8.0만: 패키지는net8.0을 대상으로 합니다; 이전 .NET Framework / .NET 6 프로젝트는 업그레이드하거나 다른 라이브러리를 선택해야 합니다. -
작은 커뮤니티: 단일 GitHub 유지 관리자, 제한된 문서, 제한적인 예제.
- 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 버전 전반에 걸쳐 장기적인 안정성을 지원합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- 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
라이선스 구성
// 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"
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" .
완전한 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
핵심 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
이후 (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
이 예제는 두 라이브러리 간의 기본 차이를 보여줍니다. PeachPDF는 PdfGenerator (엔진)을 PdfGenerateConfig (설정)과 분리하고 비동기 GeneratePdf 메서드를 제공하며, Save 메서드가 Stream에 쓰는 문서를 반환합니다. IronPDF는 ChromePdfRenderer를 RenderHtmlAsPdf()와 함께 사용하며, 내장 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
이후 (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
PeachPDF에는 일급 URL-to-PDF 헬퍼가 없습니다; NetworkAdapter를 HttpClientNetworkAdapter로 설정하고 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
이후 (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
이 예제는 중요한 구조적 차이점을 보여줍니다. PeachPDF는 PdfGenerator 또는 PdfGenerateConfig에 헤더/푸터 API를 제공하지 않으며, 따라서 페이지 Chrome은 CSS 위치 지정 방식을 통해 소스 HTML 안에 있어야 합니다. IronPDF는 페이지 Chrome을 문서 콘텐츠와 분리하여 RenderingOptions.HtmlHeader와 RenderingOptions.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()
비동기 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
헤더/푸터 속성 변경
// 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>"
}
메서드 이름 변경
| 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
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")
비밀번호 보호
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")
디지털 서명
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")
비동기 작업
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")
기능 비교 요약
| 기능 | 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)
이슈 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체험판 라이선스로 먼저 테스트
패키지 변경 사항
PeachPDFNuGet 패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf
코드 변경 사항
- 네임스페이스 가져오기 업데이트 (
using PeachPDF;→using IronPdf;) - 헤더/푸터 기능을 위한
using IronPdf.Rendering;추가 PdfGenerator+PdfGenerateConfig을ChromePdfRenderer로 대체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 출력이 기대와 일치하는지 확인
- 페이지 번호와 함께 헤더/푸터 렌더링 테스트
- 필요에 따라 새 기능(보안, 워터마크, 병합) 추가

