PDFreactor에서 IronPDF로의 마이그레이션 방법 (C#)
PDFreactor에서 IronPDF로 마이그레이션하면 Java 종속성과 서버 인프라를 제거하면서 네이티브 .NET 라이브러리를 통한 HTML-to-PDF 변환 기능을 제공합니다. 이 가이드는 Java 기반 서버 아키텍처를 .NET 애플리케이션에 원활하게 통합되는 인프로세스 라이브러리로 대체하는 전체 단계별 마이그레이션 경로를 제공합니다.
PDFreactor에서 IronPDF로 마이그레이션하는 이유
PDFreactor이해하기
PDFreactor는 다양한 플랫폼과 통합되는 강력한 HTML-to-PDF 변환 서버입니다. 상업용 솔루션으로서 PDFreactor는 HTML 및 CSS 콘텐츠를 고품질 PDF 문서로 변환하기 위해 독자적인 기술을 활용합니다. 눈에 띄는 속성 중 PDFreactor는 복잡한 레이아웃 렌더링에 적합한 다양한 CSS 속성을 지원합니다.
그러나, PDFreactor는 Java에 의존하여 비토박스 환경에서는 배포 및 통합이 복잡할 수 있는 .NET 환경에서 몇 가지 문제를 제시합니다. Java 종속성은 .NET 애플리케이션에서 추가 통합 작업이 필요하여 부가적인 오버헤드를 유발합니다.
Java 종속성 문제
PDFreactor의 아키텍처는 .NET 환경에서 여러 문제를 만듭니다:
-
Java 런타임 필수: 모든 서버에 JRE/JDK 설치가 필요합니다.
-
서버 아키텍처: 별도 서비스로 실행되어 추가 인프라가 필요합니다. 서버 기반 솔루션으로서 PDFreactor는 각 변환마다 REST API 호출이 필요합니다.
-
복잡한 배포: 주로 .NET 생태계에서 Java 종속성을 관리하면 설정이 복잡해지고 유지 관리 비용이 증가할 수 있습니다. CI/CD 파이프라인에서 Java + .NET 두 런타임을 관리해야 합니다.
-
프로세스 간 통신: REST API 또는 소켓 통신이 지연을 추가시킵니다. 모든 PDF 변환은 서버로의 HTTP 왕복이 필요합니다.
-
별도의 라이선스 관리: 라이선스는 애플리케이션이 아닌 서버 인스턴스에 귀속됩니다. Java 서비스 인스턴스에 연결된 서버당 라이선싱.
- 자원 격리: 별도의 프로세스 메모리 및 CPU 관리. 추가 서버 모니터링, 규모 조정 및 유지 관리.
PDFreactor대비IronPDF비교
| 기능/측면 | PDFreactor | IronPDF |
|---|---|---|
| 네이티브 .NET 라이브러리 | 아니요 (Java 기반) | 예 |
| 런타임 | Java (외부 서버) | 네이티브 .NET (인프로세스) |
| 아키텍처 | REST API 서비스 | NuGet 라이브러리 |
| 배포 | Java + 서버 구성 | 단일 NuGet 패키지 |
| 종속성 | JRE + HTTP 클라이언트 | 자급자족 |
| 지연 시간 | 네트워크 왕복 | 직접 메서드 호출 |
| 크로스 플랫폼 기능 | 예 (Java 의존) | 예 (번들 Chromium) |
| CSS 지원 | CSS3, CSS Paged Media에 대한 고급 지원 | 포괄적인 HTML5/CSS3 지원 |
| 배포 복잡성 | Java로 인해 더 복잡 | 쉽고, .NET과 직접 통합 |
| PDF 조작 기능 | 기본 (생성만) | 병합, 분할, 편집 및 주석 추가를 포함한 광범위한 기능 |
PDFreactor와 달리 IronPDF는 .NET 프로젝트에 외부 종속성 없이 매끄럽게 통합되도록 특별히 설계된 본래의 .NET 라이브러리로 자리잡고 있습니다. IronPDF는 번들된 Chromium 렌더링 엔진을 사용하여 몇 줄의 코드로 HTML을 PDF로 변환할 수 있습니다.
2025년 및 2026년 동안 .NET 10 및 C# 14 채택을 계획하는 팀에게 IronPDF는 Java 서버 복잡성을 제거하면서 포괄적인 PDF 생명주기 관리를 제공하는 본래의 .NET 솔루션을 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# RemovePDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# StopPDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf
# RemovePDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# StopPDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
PDFreactor (서버 기반):
// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");
// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");
' License configured on server via config file or command line
' Client connects to licensed server
Dim pdfReactor = New PDFreactor("http://pdfreactor-server:9423")
IronPDF (애플리케이션 수준):
// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
' One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"
PDFreactor사용 식별
# FindPDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS 분할 미디어rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .
# FindPDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS 분할 미디어rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .
완전한 API 참조
네임스페이스 변경
// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO
핵심 클래스 매핑
| PDFreactor | IronPDF |
|---|---|
PDFreactor |
ChromePdfRenderer |
Configuration |
ChromePdfRenderOptions |
Result |
PdfDocument |
config.Document = html |
renderer.RenderHtmlAsPdf(html) |
result.Document (byte[]) |
pdf.BinaryData |
설정 속성 매핑
| PDFreactor구성 | IronPDF RenderingOptions |
|---|---|
config.Document = html |
renderer.RenderHtmlAsPdf(html) |
config.Document = url |
renderer.RenderUrlAsPdf(url) |
config.PageFormat = PageFormat.A4 |
RenderingOptions.PaperSize = PdfPaperSize.A4 |
config.PageOrientation |
RenderingOptions.PaperOrientation |
config.PageMargins |
RenderingOptions.MarginTop/Bottom/Left/Right |
config.EnableJavaScript = true |
RenderingOptions.EnableJavaScript = true |
config.AddUserStyleSheet(css) |
HTML에 CSS 포함 |
config.Title |
pdf.MetaData.Title |
config.Encryption |
pdf.SecuritySettings |
PDFreactor에 없는 새로운 기능
| IronPDF기능 | 설명 |
|---|---|
PdfDocument.Merge() |
여러 PDF 병합 |
pdf.ApplyWatermark() |
워터마크 추가 |
pdf.ExtractAllText() |
텍스트 추출 |
pdf.Form |
양식 채우기 |
pdf.Sign() |
디지털 서명 |
코드 마이그레이션 예제
예제 1: HTML 문자열을 PDF로 변환
이전 (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Hello World</h1></body></html>";
Configuration config = new Configuration();
config.Document = html;
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("output.pdf", result.Document);
}
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Hello World</h1></body></html>";
Configuration config = new Configuration();
config.Document = html;
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("output.pdf", result.Document);
}
}
Imports RealObjects.PDFreactor
Imports System.IO
Module Program
Sub Main()
Dim pdfReactor As New PDFreactor()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim config As New Configuration()
config.Document = html
Dim result As Result = pdfReactor.Convert(config)
File.WriteAllBytes("output.pdf", result.Document)
End Sub
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string 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();
string 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 As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
근본적인 차이점은 아키텍처 패턴입니다. PDFreactor는 PDFreactor 인스턴스를 생성해야 하며(Java 서버에 연결됨), 설정 및 HTML 콘텐츠를 보관할 별도의 Configuration 객체, Convert() 호출하여 Result 객체를 반환받고, 마지막으로 File.WriteAllBytes()를 사용하여 result.Document 바이트를 파일에 작성합니다.
IronPDF는 ChromePdfRenderer를 생성하고, HTML 문자열을 사용하여 직접 RenderHtmlAsPdf()를 호출하며, 반환된 PdfDocument에 내장된 SaveAs() 메서드를 사용하여 이를 간소화합니다. 서버 연결, 구성 객체, 수동 바이트 처리 불필요. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: URL에서 PDF로 변환
이전 (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}
Imports RealObjects.PDFreactor
Imports System.IO
Class Program
Shared Sub Main()
Dim pdfReactor As New PDFreactor()
Dim config As New Configuration()
config.Document = "https://www.example.com"
Dim result As Result = pdfReactor.Convert(config)
File.WriteAllBytes("webpage.pdf", result.Document)
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
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;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
PDFreactor는 HTML 문자열과 URL에 대해 동일한 config.Document 속성을 사용하여 유형을 자동으로 결정합니다. IronPDF는 HTML 문자열을 위한 명시적 메서드 RenderHtmlAsPdf()와 URL을 위한 RenderUrlAsPdf()를 제공합니다. 이 명시적인 접근 방식은 코드 명확성과 IntelliSense 지원을 향상시킵니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: 페이지 번호가 있는 헤더와 푸터
이전 (PDFreactor):
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
Configuration config = new Configuration();
config.Document = html;
config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("document.pdf", result.Document);
}
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;
class Program
{
static void Main()
{
PDFreactorpdfReactor = new PDFreactor();
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";
Configuration config = new Configuration();
config.Document = html;
config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("document.pdf", result.Document);
}
}
Imports RealObjects.PDFreactor
Imports System.IO
Module Program
Sub Main()
Dim pdfReactor As New PDFreactor()
Dim html As String = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>"
Dim config As New Configuration()
config.Document = html
config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }")
Dim result As Result = pdfReactor.Convert(config)
File.WriteAllBytes("document.pdf", result.Document)
End Sub
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.TextHeader = new TextHeaderFooter()
{
CenterText = "Header Text"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></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.TextHeader = new TextHeaderFooter()
{
CenterText = "Header Text"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></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.TextHeader = New TextHeaderFooter() With {
.CenterText = "Header Text"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page}"
}
Dim html As String = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("document.pdf")
End Sub
End Module
이 예제는 가장 중요한 구문 차이를 보여줍니다. PDFreactor는 @page 규칙, @bottom-center 영역, counter(page)를 사용하여 AddUserStyleSheet()를 통해 주입된 페이지 번호에 CSS 분할 미디어구문을 사용합니다.
IronPDF는 TextHeaderFooter 객체가 RenderingOptions.TextHeader 및 RenderingOptions.TextFooter에 할당되는 네이티브 .NET API를 사용합니다. 페이지 번호는 CSS counter(page) 대신 {page} 플레이스홀더를 사용합니다. IronPDF는 또한 헤더/푸터 클래스에 대해 IronPdf.Rendering 네임스페이스를 가져와야 함을 주의하세요.
중요한 마이그레이션 노트
서버 필요 없음
IronPDF는 프로세스 내에서 실행됩니다—설정할 Java 서버가 필요 없음:
// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
' PDFreactor: Requires server connection
Dim pdfReactor = New PDFreactor("http://localhost:9423")
' IronPDF: No server URL needed
Dim renderer = New ChromePdfRenderer()
CSS Paged Media에서IronPDFAPI로
CSS @page 규칙을 RenderingOptions로 대체하십시오:
//PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};
//PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};
'PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
'IronPDFequivalent:
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page}"
}
페이지 번호 플레이스홀더 문법
//PDFreactorCSS: counter(page)
// IronPDF: {page}
//PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}
//PDFreactorCSS: counter(page)
// IronPDF: {page}
//PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}
'PDFreactorCSS: counter(page)
' IronPDF: {page}
'PDFreactorCSS: counter(pages)
' IronPDF: {total-pages}
결과 처리 변경
구성 + 결과 패턴은 직접 PdfDocument로 변경:
// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;
// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;
' PDFreactor: Configuration → Convert → Result → bytes
Dim result As Result = pdfReactor.Convert(config)
Dim bytes As Byte() = result.Document
File.WriteAllBytes("output.pdf", bytes)
' IronPDF: Direct PdfDocument with built-in methods
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or: Dim bytes As Byte() = pdf.BinaryData
여백 단위 변경
PDFreactor는 문자열을 사용합니다; IronPDF는 밀리미터를 사용합니다:
// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mm
// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mm
' PDFreactor: config.PageMargins.Top = "1in"
' IronPDF: renderer.RenderingOptions.MarginTop = 25.4 ' 1 inch in mm
이동 후 새로운 기능
IronPDF로 이전 후, PDFreactor가 제공할 수 없는 기능을 얻게 됩니다:
PDF 병합
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
워터마크
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
텍스트 추출
string text = pdf.ExtractAllText();
string text = pdf.ExtractAllText();
Dim text As String = pdf.ExtractAllText()
비밀번호 보호
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
기능 비교 요약
| 기능 | PDFreactor | IronPDF |
|---|---|---|
| HTML to PDF | ✓ | ✓ |
| URL을 PDF로 변환 | ✓ | ✓ |
| 헤더/푸터 | CSS 분할 미디어 | 본래의 API |
| 페이지 설정 | ✓ | ✓ |
| JavaScript 지원 | ✓ | ✓ |
| 네이티브 .NET | ✗ | ✓ |
| 프로세스 내 | ✗ | ✓ |
| PDF 병합 | ✗ | ✓ |
| PDF 분할 | ✗ | ✓ |
| 워터마크 | ✗ | ✓ |
| 텍스트 추출 | ✗ | ✓ |
| 폼 채우기 | ✗ | ✓ |
| 디지털 서명 | ✗ | ✓ |
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에서 모든PDFreactor사용 인벤토리
- 사용된 모든 CSS 분할 미디어규칙 문서화
- 모든 구성 설정(여백, 페이지 크기, JavaScript) 기록 -IronPDF라이선스 키 저장 계획 (환경 변수 권장) -IronPDF체험판 라이선스로 먼저 테스트
패키지 변경 사항
PDFreactor.NETNuGet 패키지 제거PDFreactor.Native.Windows.x64NuGet 패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf
코드 변경 사항
- 네임스페이스 가져오기 업데이트 (
using RealObjects.PDFreactor;→using IronPdf;) - 헤더/푸터 클래스를 위해
using IronPdf.Rendering;추가 PDFreactor클래스를ChromePdfRenderer로 교체Configuration객체를RenderingOptions속성으로 변환config.Document = html를renderer.RenderHtmlAsPdf(html)로 교체config.Document = url를renderer.RenderUrlAsPdf(url)로 교체File.WriteAllBytes(path, result.Document)를pdf.SaveAs(path)로 교체- CSS
@page규칙을TextFooter객체로 변환 - 페이지 번호 플레이스홀더 업데이트 (
counter(page)→{page}) - 여백 단위를 문자열에서 밀리미터로 변환
인프라 마이그레이션
- Java 런타임 요구사항 제거 -PDFreactor서버 사용 중단
- Docker/배포 구성 업데이트
- CI/CD 파이프라인을 업데이트하세요
마이그레이션 이후
- PDF 출력 품질이 기대에 부합하는지 테스트하세요
- 헤더/푸터 렌더링 검증
- 사용했다면 JavaScript 실행 확인
- 필요에 따라 새로운 기능 추가 (병합, 워터마크, 보안)

