Adobe PDF Library SDK에서 IronPDF로 마이그레이션하는 방법
Datalogics를 통해 제공되는 Adobe PDF Library SDK는 고급 기능을 갖춘 정통 Adobe PDF 엔진을 제공합니다. 그러나 높은 라이선스 비용, 복잡한 네이티브 SDK 통합 및 저수준 API 설계는 많은 개발 팀에게 비실용적입니다. 이 가이드는 Adobe PDF Library SDK에서 현대적이고 비용 효율적인 .NET PDF 라이브러리인 IronPDF로의 단계별 마이그레이션 경로를 제공합니다. .NET Framework 4.6.2에서 .NET 9 및 이후 버전을 지원합니다.
Adobe PDF Library SDK에서 벗어나는 것을 고려해야 하는 이유는 무엇입니까?
Adobe PDF Library SDK는 정통 Adobe PDF 엔진을 제공하지만 여러 요소들로 인해 개발 팀은 PDF 생성 및 조작 요구사항에 대한 대안을 모색하게 됩니다.
높은 라이선스 비용
Adobe PDF Library SDK는 연간 $10,000에서 $50,000+의 기업 수준 가격에서 운영됩니다. 이 비용 구조는 엔진의 모든 기능이 필수적이지 않은 소규모 및 중견 기업, 스타트업, 개별 개발자 및 프로젝트에 SDK를 비현실적으로 만듭니다.
복잡한 네이티브 SDK 통합
Adobe PDF Library SDK는 플랫폼별 바이너리가 필요한 네이티브 C++ 코드로 구축됩니다. 개발자는 메모리를 신중하게 관리하고 명시적 초기화 및 종료 패턴을 처리하며 복잡한 설정 절차를 거쳐야 합니다. 이는 상당한 개발 오버헤드를 추가하고 CI/CD 파이프라인을 복잡하게 만듭니다.
저수준 API 설계
Adobe PDF Library SDK로 PDF를 생성하는 것은 페이지, 콘텐츠 스트림, 텍스트 실행 및 폰트를 프로그래밍 방식으로 구성하는 것을 포함합니다. HTML 콘텐츠 렌더링과 같은 간단한 작업도 좌표 계산, 글꼴 포함 및 수동 콘텐츠 요소 관리가 포함된 다단계 작업이 됩니다.
라이브러리 수명주기 관리 오버헤드
모든 작업에서는 Library.Initialize() 및 Library.Terminate() 블록에서 코드를 감싸고 COM 객체를 신중하게 처리해야 합니다. 정리 단계를 잊으면 리소스 누출 및 애플리케이션 불안정성이 발생합니다.
일반적인 프로젝트에 과도함
주로 HTML-대-PDF 변환, 기본 문서 조작 또는 보고서 생성을 필요로 하는 애플리케이션에 대해 전체 Adobe PDF 엔진은 과도한 엔지니어링을 나타내며, 더 간단한 솔루션이 동등한 결과를 제공합니다.
Adobe PDF Library SDK와 IronPDF: 주요 차이점
이러한 라이브러리 간의 근본적인 아키텍처 차이를 이해하면 효과적인 마이그레이션 전략을 계획하는 데 도움이 됩니다.
| 측면 | Adobe PDF Library SDK | IronPDF |
|---|---|---|
| 가격 | $10K-$50K+/년 Enterprise | 개발자당 저렴한 라이센싱 |
| 설치 | 네이티브 DLL, 플랫폼별 | 간단한 NuGet 패키지 |
| 문서 생성 | 저수준 페이지/콘텐츠 구성 | HTML/CSS 렌더링 |
| 초기화 | Terminate() 필요 |
자동 |
| 좌표계 | 포스트스크립트 포인트, 좌하단 원점 | CSS 기반 레이아웃 |
| 폰트 처리 | 수동 임베딩 필요 | 자동 |
| 메모리 관리 | COM 객체의 수동 디스포설 | 표준 IDisposable 패턴 |
| 비동기 지원 | 사용 불가 | 완전한 async/await 지원 |
이전 준비
필수 조건
마이그레이션을 시작하기 전에 환경이 이러한 요구 사항을 충족하는지 확인하십시오:
- .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 또는 JetBrains Rider
- NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)
Adobe PDF Library SDK사용 감사
해당 솔루션 디렉토리에서 이러한 명령어를 실행하여 모든Adobe PDF Library SDK참조를 식별하십시오:
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
예상해야 할 주요 변경사항
| 카테고리 | Adobe PDF Library SDK | IronPDF | 마이그레이션 조치 |
|---|---|---|---|
| 초기화 | Library.Initialize() / Terminate() |
자동 | 수명주기 코드를 제거하십시오 |
| 문서 생성 | 페이지 구성과 new Document() |
ChromePdfRenderer |
HTML 렌더링 사용 |
| 좌표 시스템 | 포스트스크립트 포인트, 좌하단 원점 | CSS 기반 레이아웃 | HTML/CSS 사용 |
| 폰트 처리 | 수동 Font 생성 및 삽입 |
자동 | 폰트 코드를 제거하십시오 |
| 메모리 관리 | COM 객체의 수동 디스포설 | 표준 IDisposable | using 문 사용 |
| 페이지 구성 | CreatePage(), AddContent() |
HTML에서 자동 | 상당히 간소화 |
단계별 마이그레이션 프로세스
1단계: NuGet 패키지 업데이트
Adobe PDF Library SDK 패키지를 제거하고 IronPDF를 설치하십시오:
# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET
# Install IronPDF
dotnet add package IronPdf
# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET
# Install IronPDF
dotnet add package IronPdf
2단계: 라이선스 키 구성
Adobe의 라이선스를 IronPDF의 코드 기반 라이선스 키로 교체하십시오:
// Replace Adobe's Library.LicenseKey withIronPDFlicense
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
// Replace Adobe's Library.LicenseKey withIronPDFlicense
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
' Replace Adobe's Library.LicenseKey with IronPDF license
' Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' Verify license status
Dim isLicensed As Boolean = IronPdf.License.IsLicensed
3단계: 네임스페이스 참조 업데이트
솔루션 전체에서 전역 찾기 및 대체를 수행하세요:
| 찾기 | 바꾸기 |
|---|---|
using Datalogics.PDFL; |
using IronPdf; |
using Datalogics.PDFL.Document; |
using IronPdf; |
using Datalogics.PDFL.Page; |
using IronPdf; |
using Datalogics.PDFL.Content; |
using IronPdf; |
4단계: 라이브러리 라이프사이클 코드 제거
가장 중요한 간소화 중 하나는 초기화 및 종료 패턴을 제거하는 것입니다:
//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
// PDF operations
}
finally
{
Library.Terminate(); // Must always terminate
}
//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
//Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize();
try
{
// PDF operations
}
finally
{
Library.Terminate(); // Must always terminate
}
//IronPDF- Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
'Adobe PDF Library SDK- REMOVE THIS PATTERN
Library.Initialize()
Try
' PDF operations
Finally
Library.Terminate() ' Must always terminate
End Try
'IronPDF- Just use directly
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
완전한 API 마이그레이션 참조
라이브러리 라이프사이클 메서드
| Adobe 방법 | IronPDF 동등 |
|---|---|
Library.Initialize() |
필요 없음 |
Library.Terminate() |
필요 없음 |
Library.LicenseKey = "KEY" |
IronPdf.License.LicenseKey = "KEY" |
using (Library lib = new Library()) |
필요 없음 |
문서 생성 방법
| Adobe 방법 | IronPDF 메소드 |
|---|---|
new Document() |
new ChromePdfRenderer() |
new Document(path) |
PdfDocument.FromFile(path) |
doc.CreatePage(index, rect) |
HTML에서 자동 |
doc.Save(SaveFlags.Full, path) |
pdf.SaveAs(path) |
doc.NumPages |
pdf.PageCount |
doc.GetPage(index) |
pdf.Pages[index] |
doc.InsertPages(...) |
PdfDocument.Merge() |
콘텐츠 생성 (주요 패러다임 변화)
Adobe PDF Library SDK는 저수준 콘텐츠 구성을 요구합니다. IronPDF는 HTML/CSS를 사용합니다:
| Adobe 방법 | IronPDF 메소드 |
|---|---|
new Text() |
HTML <p>, <h1> 등 사용 |
text.AddRun(textRun) |
HTML을 사용합니다. |
new TextRun(text, font, size, point) |
CSS 스타일링 |
new Font(name, flags) |
CSS font-family |
new Image(path) |
HTML <img> 태그 |
content.AddElement(...) |
HTML 콘텐츠 |
page.UpdateContent() |
필요 없음 |
워터마크 및 보안 메서드
| Adobe 방법 | IronPDF 메소드 |
|---|---|
new Watermark(doc, textParams, wmParams) |
pdf.ApplyWatermark(html) |
WatermarkParams.Opacity |
CSS opacity |
new EncryptionHandler(user, owner, perms) |
pdf.SecuritySettings |
PermissionFlags.PrintDoc |
AllowUserPrinting |
텍스트 추출
| Adobe 방법 | IronPDF 메소드 |
|---|---|
new WordFinder(doc, config) |
pdf.ExtractAllText() |
wordFinder.GetWordList() |
pdf.Pages[i].Text |
| 복잡한 단어/문자 반복 | 단일 메서드 호출 |
코드 마이그레이션 예제
HTML을 PDF로 변환
콘텐츠를 PDF로 변환할 때 가장 극적인 간소화가 발생합니다. Adobe PDF Library SDK는 수동 페이지 구성, 폰트 임베딩, 좌표 위치 지정을 요구합니다.
Adobe PDF Library SDK 구현:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeHtmlToPdf
{
static void Main()
{
using (Library lib = new Library())
{
// Adobe PDF Library requires complex setup with HTML conversion parameters
HTMLConversionParameters htmlParams = new HTMLConversionParameters();
htmlParams.PaperSize = PaperSize.Letter;
htmlParams.Orientation = Orientation.Portrait;
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF
Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
doc.Save(SaveFlags.Full, "output.pdf");
doc.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeHtmlToPdf
{
static void Main()
{
using (Library lib = new Library())
{
// Adobe PDF Library requires complex setup with HTML conversion parameters
HTMLConversionParameters htmlParams = new HTMLConversionParameters();
htmlParams.PaperSize = PaperSize.Letter;
htmlParams.Orientation = Orientation.Portrait;
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF
Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
doc.Save(SaveFlags.Full, "output.pdf");
doc.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeHtmlToPdf
Shared Sub Main()
Using lib As New Library()
' Adobe PDF Library requires complex setup with HTML conversion parameters
Dim htmlParams As New HTMLConversionParameters()
htmlParams.PaperSize = PaperSize.Letter
htmlParams.Orientation = Orientation.Portrait
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' Convert HTML to PDF
Dim doc As Document = Document.CreateFromHTML(htmlContent, htmlParams)
doc.Save(SaveFlags.Full, "output.pdf")
doc.Dispose()
End Using
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF with simple API
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfHtmlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// Convert HTML to PDF with simple API
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class IronPdfHtmlToPdf
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' Convert HTML to PDF with simple API
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF는 라이브러리 라이프사이클 래퍼, 변환 매개 변수 객체 및 명시적 폐기를 제거합니다. ChromePdfRenderer는 픽셀 단위로 정확한 CSS 및 JavaScript 지원을 위한 크로뮴 기반 엔진을 사용합니다. 고급 시나리오에 대해서는 HTML to PDF 문서를 참조하세요.
여러 PDF 병합
PDF 병합은 API 복잡도 차이를 명확하게 보여줍니다.
Adobe PDF Library SDK 구현:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeMergePdfs
{
static void Main()
{
using (Library lib = new Library())
{
// Open first PDF document
Document doc1 = new Document("document1.pdf");
Document doc2 = new Document("document2.pdf");
// Insert pages from second document into first
PageInsertParams insertParams = new PageInsertParams();
insertParams.InsertFlags = PageInsertFlags.None;
for (int i = 0; i < doc2.NumPages; i++)
{
Page page = doc2.GetPage(i);
doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
}
doc1.Save(SaveFlags.Full, "merged.pdf");
doc1.Dispose();
doc2.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeMergePdfs
{
static void Main()
{
using (Library lib = new Library())
{
// Open first PDF document
Document doc1 = new Document("document1.pdf");
Document doc2 = new Document("document2.pdf");
// Insert pages from second document into first
PageInsertParams insertParams = new PageInsertParams();
insertParams.InsertFlags = PageInsertFlags.None;
for (int i = 0; i < doc2.NumPages; i++)
{
Page page = doc2.GetPage(i);
doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
}
doc1.Save(SaveFlags.Full, "merged.pdf");
doc1.Dispose();
doc2.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeMergePdfs
Shared Sub Main()
Using lib As New Library()
' Open first PDF document
Dim doc1 As New Document("document1.pdf")
Dim doc2 As New Document("document2.pdf")
' Insert pages from second document into first
Dim insertParams As New PageInsertParams()
insertParams.InsertFlags = PageInsertFlags.None
For i As Integer = 0 To doc2.NumPages - 1
Dim page As Page = doc2.GetPage(i)
doc1.InsertPage(doc1.NumPages - 1, page, insertParams)
Next
doc1.Save(SaveFlags.Full, "merged.pdf")
doc1.Dispose()
doc2.Dispose()
End Using
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfMergePdfs
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs with simple method
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfMergePdfs
{
static void Main()
{
// Load PDF documents
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs with simple method
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Class IronPdfMergePdfs
Shared Sub Main()
' Load PDF documents
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
' Merge PDFs with simple method
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Adobe의 접근법은 삽입 매개 변수와 함께 페이지별 반복을 요구합니다. IronPDF는 여러 문서를 받을 수 있는 단일 Merge 메서드를 제공합니다.
워터마크 추가
워터마크는 IronPDF가 스타일링 유연성을 위해 HTML/CSS를 활용하는 방법을 보여줍니다.
Adobe PDF Library SDK 구현:
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeAddWatermark
{
static void Main()
{
using (Library lib = new Library())
{
Document doc = new Document("input.pdf");
// Create watermark with complex API
WatermarkParams watermarkParams = new WatermarkParams();
watermarkParams.Opacity = 0.5;
watermarkParams.Rotation = 45.0;
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;
WatermarkTextParams textParams = new WatermarkTextParams();
textParams.Text = "CONFIDENTIAL";
Watermark watermark = new Watermark(doc, textParams, watermarkParams);
doc.Save(SaveFlags.Full, "watermarked.pdf");
doc.Dispose();
}
}
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;
class AdobeAddWatermark
{
static void Main()
{
using (Library lib = new Library())
{
Document doc = new Document("input.pdf");
// Create watermark with complex API
WatermarkParams watermarkParams = new WatermarkParams();
watermarkParams.Opacity = 0.5;
watermarkParams.Rotation = 45.0;
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;
WatermarkTextParams textParams = new WatermarkTextParams();
textParams.Text = "CONFIDENTIAL";
Watermark watermark = new Watermark(doc, textParams, watermarkParams);
doc.Save(SaveFlags.Full, "watermarked.pdf");
doc.Dispose();
}
}
}
Imports Datalogics.PDFL
Imports System
Class AdobeAddWatermark
Shared Sub Main()
Using lib As New Library()
Dim doc As New Document("input.pdf")
' Create watermark with complex API
Dim watermarkParams As New WatermarkParams()
watermarkParams.Opacity = 0.5
watermarkParams.Rotation = 45.0
watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center
watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center
Dim textParams As New WatermarkTextParams()
textParams.Text = "CONFIDENTIAL"
Dim watermark As New Watermark(doc, textParams, watermarkParams)
doc.Save(SaveFlags.Full, "watermarked.pdf")
doc.Dispose()
End Using
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class IronPdfAddWatermark
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
// Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class IronPdfAddWatermark
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
// Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class IronPdfAddWatermark
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
' Apply text watermark with simple API
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
rotation:=45,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
IronPDF의 HTML 기반 워터마킹은 CSS 스타일링을 통해 완전한 디자인 제어를 제공하여 별도의 매개 변수 객체가 필요하지 않습니다.
암호 보호 및 암호화
Adobe PDF Library SDK 구현:
using Datalogics.PDFL;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
PermissionFlags permissions =
PermissionFlags.PrintDoc |
PermissionFlags.PrintFidelity;
EncryptionHandler encHandler = new EncryptionHandler(
password, // User password
password, // Owner password
permissions,
EncryptionMethod.AES256);
doc.SetEncryptionHandler(encHandler);
doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
}
}
finally
{
Library.Terminate();
}
}
using Datalogics.PDFL;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
PermissionFlags permissions =
PermissionFlags.PrintDoc |
PermissionFlags.PrintFidelity;
EncryptionHandler encHandler = new EncryptionHandler(
password, // User password
password, // Owner password
permissions,
EncryptionMethod.AES256);
doc.SetEncryptionHandler(encHandler);
doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
}
}
finally
{
Library.Terminate();
}
}
Imports Datalogics.PDFL
Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
Library.Initialize()
Try
Using doc As New Document(inputPath)
Dim permissions As PermissionFlags = PermissionFlags.PrintDoc Or PermissionFlags.PrintFidelity
Dim encHandler As New EncryptionHandler(
password, ' User password
password, ' Owner password
permissions,
EncryptionMethod.AES256)
doc.SetEncryptionHandler(encHandler)
doc.Save(SaveFlags.Full Or SaveFlags.Encrypted, outputPath)
End Using
Finally
Library.Terminate()
End Try
End Sub
IronPDF 구현:
using IronPdf;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.SecuritySettings.UserPassword = password;
pdf.SecuritySettings.OwnerPassword = password;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs(outputPath);
}
using IronPdf;
public void ProtectPdf(string inputPath, string outputPath, string password)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.SecuritySettings.UserPassword = password;
pdf.SecuritySettings.OwnerPassword = password;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub ProtectPdf(inputPath As String, outputPath As String, password As String)
Using pdf = PdfDocument.FromFile(inputPath)
pdf.SecuritySettings.UserPassword = password
pdf.SecuritySettings.OwnerPassword = password
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs(outputPath)
End Using
End Sub
IronPDF는 비트 연산 권한 플래그 및 암호화 핸들러 객체 대신 강력히 형식화된 속성을 사용합니다.
텍스트 추출
Adobe PDF Library SDK 구현:
using Datalogics.PDFL;
public string ExtractText(string pdfPath)
{
string extractedText = "";
Library.Initialize();
try
{
using (Document doc = new Document(pdfPath))
{
WordFinderConfig config = new WordFinderConfig();
config.IgnoreCharGaps = true;
for (int i = 0; i < doc.NumPages; i++)
{
using (WordFinder wordFinder = new WordFinder(doc, i, config))
{
IList<Word> words = wordFinder.GetWordList();
foreach (Word word in words)
{
extractedText += word.Text + " ";
}
extractedText += "\n";
}
}
}
}
finally
{
Library.Terminate();
}
return extractedText;
}
using Datalogics.PDFL;
public string ExtractText(string pdfPath)
{
string extractedText = "";
Library.Initialize();
try
{
using (Document doc = new Document(pdfPath))
{
WordFinderConfig config = new WordFinderConfig();
config.IgnoreCharGaps = true;
for (int i = 0; i < doc.NumPages; i++)
{
using (WordFinder wordFinder = new WordFinder(doc, i, config))
{
IList<Word> words = wordFinder.GetWordList();
foreach (Word word in words)
{
extractedText += word.Text + " ";
}
extractedText += "\n";
}
}
}
}
finally
{
Library.Terminate();
}
return extractedText;
}
Imports Datalogics.PDFL
Public Function ExtractText(ByVal pdfPath As String) As String
Dim extractedText As String = ""
Library.Initialize()
Try
Using doc As New Document(pdfPath)
Dim config As New WordFinderConfig()
config.IgnoreCharGaps = True
For i As Integer = 0 To doc.NumPages - 1
Using wordFinder As New WordFinder(doc, i, config)
Dim words As IList(Of Word) = wordFinder.GetWordList()
For Each word As Word In words
extractedText &= word.Text & " "
Next
extractedText &= vbLf
End Using
Next
End Using
Finally
Library.Terminate()
End Try
Return extractedText
End Function
IronPDF 구현:
using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}
Imports IronPdf
Public Function ExtractText(pdfPath As String) As String
Using pdf = PdfDocument.FromFile(pdfPath)
Return pdf.ExtractAllText()
End Using
End Function
Adobe의 단어별 반복이 IronPDF로 단일 메서드 호출이 됩니다.
머리말과 바닥글
Adobe PDF Library SDK 구현:
using Datalogics.PDFL;
public void AddHeaderFooter(string inputPath, string outputPath)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
Font font = new Font("Helvetica", FontCreateFlags.None);
for (int i = 0; i < doc.NumPages; i++)
{
using (Page page = doc.GetPage(i))
{
Content content = page.Content;
// Add header
Text header = new Text();
header.AddRun(new TextRun("Document Header",
font, 10, new Point(72, page.MediaBox.Top - 36)));
content.AddElement(header);
// Add footer with page number
Text footer = new Text();
footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
font, 10, new Point(72, 36)));
content.AddElement(footer);
page.UpdateContent();
}
}
doc.Save(SaveFlags.Full, outputPath);
}
}
finally
{
Library.Terminate();
}
}
using Datalogics.PDFL;
public void AddHeaderFooter(string inputPath, string outputPath)
{
Library.Initialize();
try
{
using (Document doc = new Document(inputPath))
{
Font font = new Font("Helvetica", FontCreateFlags.None);
for (int i = 0; i < doc.NumPages; i++)
{
using (Page page = doc.GetPage(i))
{
Content content = page.Content;
// Add header
Text header = new Text();
header.AddRun(new TextRun("Document Header",
font, 10, new Point(72, page.MediaBox.Top - 36)));
content.AddElement(header);
// Add footer with page number
Text footer = new Text();
footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
font, 10, new Point(72, 36)));
content.AddElement(footer);
page.UpdateContent();
}
}
doc.Save(SaveFlags.Full, outputPath);
}
}
finally
{
Library.Terminate();
}
}
Imports Datalogics.PDFL
Public Sub AddHeaderFooter(inputPath As String, outputPath As String)
Library.Initialize()
Try
Using doc As New Document(inputPath)
Dim font As New Font("Helvetica", FontCreateFlags.None)
For i As Integer = 0 To doc.NumPages - 1
Using page As Page = doc.GetPage(i)
Dim content As Content = page.Content
' Add header
Dim header As New Text()
header.AddRun(New TextRun("Document Header", font, 10, New Point(72, page.MediaBox.Top - 36)))
content.AddElement(header)
' Add footer with page number
Dim footer As New Text()
footer.AddRun(New TextRun($"Page {i + 1} of {doc.NumPages}", font, 10, New Point(72, 36)))
content.AddElement(footer)
page.UpdateContent()
End Using
Next
doc.Save(SaveFlags.Full, outputPath)
End Using
Finally
Library.Terminate()
End Try
End Sub
IronPDF 구현:
using IronPdf;
public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Header",
FontSize = 10,
FontFamily = "Helvetica"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10,
FontFamily = "Helvetica"
};
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Header",
FontSize = 10,
FontFamily = "Helvetica"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10,
FontFamily = "Helvetica"
};
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub CreatePdfWithHeaderFooter(html As String, outputPath As String)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Document Header",
.FontSize = 10,
.FontFamily = "Helvetica"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10,
.FontFamily = "Helvetica"
}
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
End Using
End Sub
IronPDF는 페이지 반복을 자동으로 처리하며 {page} 및 {total-pages}와 같은 자리 표시자 토큰을 지원합니다. 보다 고급 레이아웃에 대해서는 머리말과 바닥글 문서를 참조하세요.
URL을 PDF로 변환
Adobe PDF Library SDK는 내장된 URL 렌더링 기능이 부족합니다. IronPDF는 기본 지원을 제공합니다:
using IronPdf;
public void ConvertUrlToPdf(string url, string outputPath)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs(outputPath);
}
using IronPdf;
public void ConvertUrlToPdf(string url, string outputPath)
{
var renderer = new ChromePdfRenderer();
using var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs(outputPath);
}
Imports IronPdf
Public Sub ConvertUrlToPdf(url As String, outputPath As String)
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs(outputPath)
End Using
End Sub
완전한 URL 변환 옵션에 대해서는 URL to PDF 문서를 참조하세요.
ASP.NET Core 통합
Adobe PDF Library SDK의 정적 초기화 패턴은 종속성 주입과의 마찰을 만듭니다. IronPDF는 현대의 .NET 아키텍처와 자연스럽게 통합됩니다.
Adobe 패턴 (DI에 문제 있음):
public class AdobePdfService
{
public byte[] Generate(string content)
{
Library.Initialize();
try
{
//복잡한 문서construction...
return bytes;
}
finally
{
Library.Terminate();
}
}
}
public class AdobePdfService
{
public byte[] Generate(string content)
{
Library.Initialize();
try
{
//복잡한 문서construction...
return bytes;
}
finally
{
Library.Terminate();
}
}
}
Public Class AdobePdfService
Public Function Generate(content As String) As Byte()
Library.Initialize()
Try
'복잡한 문서construction...
Return bytes
Finally
Library.Terminate()
End Try
End Function
End Class
IronPDF 패턴 (DI 친화적):
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
}
// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
}
// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
Imports System.Threading.Tasks
Public Interface IPdfService
Function GeneratePdfAsync(html As String) As Task(Of Byte())
End Interface
Public Class IronPdfService
Implements IPdfService
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer()
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
End Sub
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte()) Implements IPdfService.GeneratePdfAsync
Using pdf = Await _renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Using
End Function
End Class
' Register in Program.vb (.NET 6+):
builder.Services.AddSingleton(Of IPdfService, IronPdfService)()
비동기 지원
Adobe PDF Library SDK는 비동기 작업을 지원하지 않습니다. IronPDF는 확장 가능한 웹 응용 프로그램에 필수적인 완전한 async/await 기능을 제공합니다:
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class ReportController
Inherits Controller
Public Async Function GenerateReport() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
End Class
성능 최적화
메모리 사용량 비교
| 시나리오 | Adobe PDF Library SDK | IronPDF |
|---|---|---|
| 간단한 PDF | ~100 MB | ~50 MB |
| 복잡한 문서 | ~200 MB | ~80 MB |
| 배치 (100 PDFs) | 높음 (기본 메모리) | ~100 MB |
최적화 팁
렌더러 인스턴스를 재사용하세요:
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}
' Good: Reuse renderer for batch operations
Dim renderer = New ChromePdfRenderer()
For Each html In htmlList
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs($"output_{i}.pdf")
End Using
Next
웹 애플리케이션에서 비동기를 사용하세요:
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class ReportController
Inherits Controller
Public Async Function GenerateReport() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
End Class
일반적인 마이그레이션 문제 해결
문제: 좌표 기반 위치 지정이 작동하지 않음
Adobe는 PostScript 포인트 좌표를 사용합니다. IronPDF는 CSS 포지셔닝을 사용합니다:
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));
// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));
// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
' Adobe: Point-based
New TextRun("Hello", font, 12, New Point(100, 700))
' IronPDF: CSS-based
Dim html As String = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>"
문제: 페이지 크기 차이
Adobe는 PostScript 포인트를 사용합니다. IronPDF는 열거형(enum) 또는 사용자 지정 치수를 사용합니다:
// Adobe: Points
Rect(0, 0, 612, 792) // Letter
// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
// Adobe: Points
Rect(0, 0, 612, 792) // Letter
// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
' Adobe: Points
Rect(0, 0, 612, 792) ' Letter
' IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
' Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11)
문제: 글꼴을 찾을 수 없음
Adobe는 수동 글꼴 임베딩이 필요합니다. IronPDF는 글꼴을 자동으로 처리합니다:
// IronPDF: Use web fonts if needed
string html = @"
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>";
// IronPDF: Use web fonts if needed
string html = @"
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>";
' IronPDF: Use web fonts if needed
Dim html As String = "
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body { font-family: 'Roboto', sans-serif; }
</style>"
문제: SaveFlags 사용 불가
Adobe는 저장 플래그 조합을 사용합니다. IronPDF는 직접 저장을 사용합니다:
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);
//IronPDF- full save is default
pdf.SaveAs(path);
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);
//IronPDF- full save is default
pdf.SaveAs(path);
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- 모든 기존 단위 및 통합 테스트 실행
- 이전 버전과 PDF 출력을 시각적으로 비교
- 스테이징 환경에서 모든 PDF 워크플로 테스트
- 라이선스가 올바르게 작동하는지 확인하십시오 (
IronPdf.License.IsLicensed) - 이전 구현과의 성능 벤치마크
- Adobe 라이선스 구성 제거
- CI/CD 파이프라인 종속성 업데이트
- 프로젝트에서 모든 Adobe PDF 라이브러리 DLL 제거
- 개발 팀을 위한 새로운 패턴 문서화
PDF 인프라의 미래 대비
.NET 10의 접근과 C# 14의 새로운 언어 기능 도입으로, 활성 개발이 진행 중인 .NET PDF 라이브러리를 선택하는 것은 발전하는 런타임 기능에 대한 호환성을 보장합니다. IronPDF의 최신 .NET 버전 지원 약속은 프로젝트가 2025년 및 2026년으로 확장됨에 따라 이주 투자에 이익을 줍니다.
추가 리소스
Adobe PDF Library SDK에서 IronPDF로의 마이그레이션은 PDF 생성 코드베이스를 크게 단순화하면서 라이선스 비용을 크게 절감합니다. 저수준 페이지 구성에서 HTML/CSS 렌더링으로의 전환은 수백 줄의 좌표 계산, 글꼴 관리, 라이프사이클 처리 코드를 제거합니다. 현대 .NET 애플리케이션을 구축하는 팀을 위해 IronPDF는 현대적인 개발 워크플로에 맞춰 설계된 개발자 친화적 API로 동등한 기능을 제공합니다.

