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로 변환할 수 있습니다.
현대 .NET 버전을 도입하는 팀을 위해 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 패키지 변경 사항
# PDFreactor is NOT distributed via NuGet. The .NET wrapper ships as
# PDFreactor.dll inside <PDFreactor-install>/clients/netstandard2/bin/
# (or netframework40/bin for older .NET Framework projects).
# Remove the assembly reference from your .csproj.
# Stop PDFreactor Web Service (Java/Jetty, default port 9423)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf
# PDFreactor is NOT distributed via NuGet. The .NET wrapper ships as
# PDFreactor.dll inside <PDFreactor-install>/clients/netstandard2/bin/
# (or netframework40/bin for older .NET Framework projects).
# Remove the assembly reference from your .csproj.
# Stop PDFreactor Web Service (Java/Jetty, default port 9423)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
PDFreactor (서버 기반):
// License configured on the PDFreactor Web Service via config file or command line.
// The .NET client (RealObjects.PDFreactor.Webservice.Client) connects to that licensed service.
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423/service/rest");
// License configured on the PDFreactor Web Service via config file or command line.
// The .NET client (RealObjects.PDFreactor.Webservice.Client) connects to that licensed service.
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423/service/rest");
' License configured on the PDFreactor Web Service via config file or command line.
' The .NET client (RealObjects.PDFreactor.Webservice.Client) connects to that licensed service.
Dim pdfReactor = New PDFreactor("http://pdfreactor-server:9423/service/rest")
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사용 식별
# Find PDFreactor usage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS 분할 미디어 rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .
# Find PDFreactor usage
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 (Web Service client)
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PDFreactor (Web Service client)
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports RealObjects.PDFreactor.Webservice.Client
Imports System.IO
Imports IronPdf
Imports IronPdf.Rendering
핵심 클래스 매핑
| 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.UserStyleSheets = new List<Resource>{...} |
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):
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = 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);
}
}
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = 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.Webservice.Client
Imports System.IO
Class Program
Shared 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 Class
이후 (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 인스턴스(자바 서버에 연결되는)를 생성하고, 설정 및 HTML 콘텐츠를 보관할 별도의 Configuration 객체, Convert() 호출하여 Result 객체를 반환받은 후, 최종적으로 result.Document 바이트를 File.WriteAllBytes()을 사용하여 파일에 기록하는 과정이 필요합니다.
IronPDF는 이를 ChromePdfRenderer를 생성하고, HTML 문자열과 함께 RenderHtmlAsPdf()를 직접 호출한 후, 반환된 PdfDocument에 내장된 SaveAs() 메서드를 사용하는 것으로 단순화합니다. 서버 연결, 구성 객체, 수동 바이트 처리 불필요. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: URL에서 PDF로 변환
이전 (PDFreactor):
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = 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.Webservice.Client
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):
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = 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.UserStyleSheets = new System.Collections.Generic.List<Resource>
{
new Resource { Content = "@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }" }
};
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("document.pdf", result.Document);
}
}
// PDFreactor .NET wrapper is a Web Service client (no NuGet package).
// Reference PDFreactor.dll from <PDFreactor-install>/clients/netstandard2/bin/
// and run the PDFreactor Web Service (Java/Jetty) locally or remotely.
using RealObjects.PDFreactor.Webservice.Client;
using System.IO;
class Program
{
static void Main()
{
PDFreactor pdfReactor = 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.UserStyleSheets = new System.Collections.Generic.List<Resource>
{
new Resource { Content = "@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.Webservice.Client
Imports System.IO
Class Program
Shared 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.UserStyleSheets = New System.Collections.Generic.List(Of Resource) From {
New Resource With {
.Content = "@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 Class
이후 (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) 페이지 번호를 UserStyleSheets 목록의 Resource 항목을 통해 삽입하여 CSS 페이지 매체 구문을 사용합니다.
IronPDF는 TextHeaderFooter 객체를 RenderingOptions.TextHeader 및 RenderingOptions.TextFooter에 할당하여 사용하는 네이티브 .NET API를 사용합니다. 페이지 번호는 CSS counter(page) 대신 {page} 플레이스홀더를 사용합니다.
중요한 마이그레이션 노트
서버 필요 없음
IronPDF는 프로세스 내에서 실행됩니다—설정할 Java 서버가 필요 없음:
// PDFreactor: Requires the Web Service running on a reachable host
var pdfReactor = new PDFreactor("http://localhost:9423/service/rest");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
// PDFreactor: Requires the Web Service running on a reachable host
var pdfReactor = new PDFreactor("http://localhost:9423/service/rest");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
' PDFreactor: Requires the Web Service running on a reachable host
Dim pdfReactor = New PDFreactor("http://localhost:9423/service/rest")
' IronPDF: No server URL needed
Dim renderer = New ChromePdfRenderer()
CSS Paged Media에서IronPDF API로
CSS @page 규칙을 RenderingOptions로 교체합니다:
// PDFreactor CSS: @page { @bottom-center { content: 'Page ' counter(page); } }
// IronPDF equivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};
// PDFreactor CSS: @page { @bottom-center { content: 'Page ' counter(page); } }
// IronPDF equivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};
' PDFreactor CSS: @page { @bottom-center { content: 'Page ' counter(page); } }
' IronPDF equivalent:
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page}"
}
페이지 번호 플레이스홀더 문법
// PDFreactor CSS: counter(page)
// IronPDF: {page}
// PDFreactor CSS: counter(pages)
// IronPDF: {total-pages}
// PDFreactor CSS: counter(page)
// IronPDF: {page}
// PDFreactor CSS: counter(pages)
// IronPDF: {total-pages}
' PDFreactor CSS: counter(page)
' IronPDF: {page}
' PDFreactor CSS: 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.dll어셈블리 참조를.csproj에서 직접 제거합니다. -PDFreactor웹 서비스를 해체하세요 (Java/Jetty)IronPdfNuGet Install-Package:dotnet add package IronPdf
코드 변경 사항
- 네임스페이스 가져오기를 업데이트합니다(
using RealObjects.PDFreactor.Webservice.Client;→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 실행 확인
- 필요에 따라 새로운 기능 추가 (병합, 워터마크, 보안)

