C#에서 Aspose.PDF에서 IronPDF로 마이그레이션하는 방법
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Aspose PDF on pricing, HTML support, and licensing.
Aspose.PDF에서 마이그레이션해야 하는 이유는 무엇인가요?
Aspose.PDF는 Enterprise급 기능을 제공하지만 PDF 생성 요구에 맞는 현대적인 대안을 찾기 위해 여러 요소가 개발 팀을 이끌고 있습니다.
비용 비교
Aspose.PDF는 연간 갱신으로 시간이 지남에 따라 상당히 누적되는 전통적인 Enterprise 라이선스 모델을 사용합니다:
| 측면 | Aspose.PDF | IronPDF |
|---|---|---|
| 시작 가격 | $1,199/개발자/년 | $749 일회성 (Lite) |
| 라이선스 모델 | 연간 구독 + 갱신 | 영구 라이선스 |
| OEM 라이선스 | $5,997+ 추가 비용 | 더 높은 티어에 포함됨 |
| 지원 | 추가 비용 티어 | 포함됨 |
| 총 3년 비용 | $3,597+ per 개발자 | $749 (한 번) |
HTML 렌더링 엔진 비교
Aspose.PDF는 현대 웹 표준에서 어려움을 겪고 있는 Flying Saucer CSS 엔진을 사용합니다. IronPDF는 전체 크로미엄 렌더링 엔진을 활용합니다:
| 기능 | Aspose.PDF (Flying Saucer) | IronPDF (Chromium) |
|---|---|---|
| CSS3 지원 | 제한적 (오래된 CSS) | 전체 CSS3 |
| 플렉스박스/그리드 | 지원되지 않음 | 지원됨 |
| JavaScript | 매우 제한적 | 지원됨 |
| 웹 폰트 | 부분적 | 완전함 |
| 모던 HTML5 | 제한적 | 완전함 |
| 렌더링 품질 | 변하기 쉬운 | 픽셀 완벽함 |
문서화된 성능 문제
사용자는 두 라이브러리 간의 성능 차이가 크다고 보고했습니다:
| 미터법 | Aspose.PDF | IronPDF |
|---|---|---|
| HTML 렌더링 | 문서화된 성능 저하 (일부 경우 30배 느림) | 최적화된 Chromium 엔진 |
| 대용량 문서 | 보고된 메모리 문제 | 효율적인 스트리밍 |
| 리눅스 성능 | 높은 CPU 사용량, 메모리 누수가 보고됨 | 안정적 |
Aspose.PDF vs. IronPDF: 주요 차이점
| 측면 | Aspose.PDF | IronPDF |
|---|---|---|
| 가격 | $1,199/개발자/연간 (구독) | $749 일회성 (Lite) |
| HTML 엔진 | Flying Saucer (제한된 CSS) | Chromium (전체 CSS3/JS) |
| 성능 | 문서화된 속도 저하 | 최적화됨 |
| 라이선스 모델 | 연간 갱신 + .lic 파일 | 영구 + 코드 기반 키 |
| Linux 지원 | 보고된 문제 (CPU, 메모리) | 안정적 |
| 페이지 색인 | 1-based (Pages[1]) |
0-based (Pages[0]) |
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 또는 VS Code와 C# 확장
- NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)
Aspose.PDF 사용 감사
해당 솔루션 디렉토리에서 다음 명령을 실행하여 모든 Aspose.PDF 참조를 식별하십시오:
# Find all Aspose.Pdf using statements
grep -r "using Aspose.Pdf" --include="*.cs" .
# Find HtmlLoadOptions usage
grep -r "HtmlLoadOptions\|HtmlFragment" --include="*.cs" .
# Find Facades usage
grep -r "PdfFileEditor\|PdfFileMend\|PdfFileStamp" --include="*.cs" .
# Find TextAbsorber usage
grep -r "TextAbsorber\|TextFragmentAbsorber" --include="*.cs" .
# Find all Aspose.Pdf using statements
grep -r "using Aspose.Pdf" --include="*.cs" .
# Find HtmlLoadOptions usage
grep -r "HtmlLoadOptions\|HtmlFragment" --include="*.cs" .
# Find Facades usage
grep -r "PdfFileEditor\|PdfFileMend\|PdfFileStamp" --include="*.cs" .
# Find TextAbsorber usage
grep -r "TextAbsorber\|TextFragmentAbsorber" --include="*.cs" .
예상해야 할 주요 변경사항
| Aspose.PDF 패턴 | 변경 필요 |
|---|---|
new Document() + Pages.Add() |
대신 HTML 렌더링 사용 |
HtmlLoadOptions |
ChromePdfRenderer.RenderHtmlAsPdf() |
TextFragment + 수동 위치 지정 |
CSS 기반 위치 지정 |
PdfFileEditor.Concatenate() |
PdfDocument.Merge() |
TextFragmentAbsorber |
pdf.ExtractAllText() |
ImageStamp |
HTML 기반 워터마크 |
.lic 파일 라이선싱 |
코드 기반 라이센스 키 |
| 1-based 페이지 색인 생성 | 0-based 페이지 색인 생성 |
단계별 마이그레이션 프로세스
1단계: NuGet 패키지 업데이트
Aspose.PDF를 제거하고 IronPDF를 설치하십시오:
# Remove Aspose.PDF
dotnet remove package Aspose.PDF
# Install IronPDF
dotnet add package IronPdf
# Remove Aspose.PDF
dotnet remove package Aspose.PDF
# Install IronPDF
dotnet add package IronPdf
또는 패키지 관리자 콘솔을 통해:
Uninstall-Package Aspose.PDF
Install-Package IronPdf
2단계: 네임스페이스 참조 업데이트
Aspose.PDF 네임스페이스를 IronPDF로 교체하십시오:
// Remove these
using Aspose.Pdf;
using Aspose.Pdf.Text;
using Aspose.Pdf.Facades;
using Aspose.Pdf.Generator;
// Add these
using IronPdf;
using IronPdf.Rendering;
using IronPdf.Editing;
// Remove these
using Aspose.Pdf;
using Aspose.Pdf.Text;
using Aspose.Pdf.Facades;
using Aspose.Pdf.Generator;
// Add these
using IronPdf;
using IronPdf.Rendering;
using IronPdf.Editing;
' Remove these
' Imports Aspose.Pdf
' Imports Aspose.Pdf.Text
' Imports Aspose.Pdf.Facades
' Imports Aspose.Pdf.Generator
' Add these
Imports IronPdf
Imports IronPdf.Rendering
Imports IronPdf.Editing
3단계: 라이선스 구성 업데이트
Aspose.PDF는 .lic 파일 라이선싱을 사용합니다. IronPDF는 간단한 코드 기반 키를 사용합니다.
Aspose.PDF 구현:
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.Pdf.lic");
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.Pdf.lic");
Imports Aspose.Pdf
Dim license As New License()
license.SetLicense("Aspose.Pdf.lic")
IronPDF 구현:
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"
완전한 API 마이그레이션 참조
핵심 클래스 매핑
| Aspose.PDF 클래스 | IronPDF 동등 |
|---|---|
Document |
PdfDocument |
HtmlLoadOptions |
ChromePdfRenderer |
TextFragmentAbsorber |
PdfDocument.ExtractAllText() |
PdfFileEditor |
PdfDocument.Merge() |
TextStamp / ImageStamp |
PdfDocument.ApplyWatermark() |
License |
IronPdf.License |
문서 작업
| Aspose.PDF 메소드 | IronPDF 메소드 |
|---|---|
new Document() |
new PdfDocument() |
new Document(path) |
PdfDocument.FromFile(path) |
doc.Save(path) |
pdf.SaveAs(path) |
doc.Pages.Count |
pdf.PageCount |
doc.Pages.Delete(index) |
pdf.RemovePage(index) |
HTML을 PDF로 변환
| Aspose.PDF 메소드 | IronPDF 메소드 |
|---|---|
new HtmlLoadOptions() |
new ChromePdfRenderer() |
new Document(stream, htmlOptions) |
renderer.RenderHtmlAsPdf(html) |
new Document(path, htmlOptions) |
renderer.RenderHtmlFileAsPdf(path) |
코드 마이그레이션 예제
HTML 문자열에서 PDF로
가장 일반적인 Aspose.PDF 작업은 접근 방식의 근본적인 차이를 보여줍니다—Aspose.PDF는 HTML을 MemoryStream에 래핑해야 하지만, IronPDF는 문자열을 직접 수용합니다.
Aspose.PDF 구현:
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>";
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(htmlContent)))
{
var htmlLoadOptions = new HtmlLoadOptions();
var document = new Document(stream, htmlLoadOptions);
document.Save("output.pdf");
}
Console.WriteLine("PDF created from HTML string");
}
}
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>";
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(htmlContent)))
{
var htmlLoadOptions = new HtmlLoadOptions();
var document = new Document(stream, htmlLoadOptions);
document.Save("output.pdf");
}
Console.WriteLine("PDF created from HTML string");
}
}
Imports Aspose.Pdf
Imports System
Imports System.IO
Imports System.Text
Module Program
Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>"
Using stream As New MemoryStream(Encoding.UTF8.GetBytes(htmlContent))
Dim htmlLoadOptions As New HtmlLoadOptions()
Dim document As New Document(stream, htmlLoadOptions)
document.Save("output.pdf")
End Using
Console.WriteLine("PDF created from HTML string")
End Sub
End Module
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created from HTML string");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created from HTML string");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML string.</p></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created from HTML string")
End Sub
End Class
IronPDF는 MemoryStream 래퍼를 완전히 제거하여 더 깔끔하고 직관적인 API를 제공합니다.
HTML 파일을 PDF로
Aspose.PDF 구현:
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
class Program
{
static void Main()
{
var htmlLoadOptions = new HtmlLoadOptions();
var document = new Document("input.html", htmlLoadOptions);
document.Save("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
class Program
{
static void Main()
{
var htmlLoadOptions = new HtmlLoadOptions();
var document = new Document("input.html", htmlLoadOptions);
document.Save("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports Aspose.Pdf
Imports System
Class Program
Shared Sub Main()
Dim htmlLoadOptions As New HtmlLoadOptions()
Dim document As New Document("input.html", htmlLoadOptions)
document.Save("output.pdf")
Console.WriteLine("PDF created successfully")
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.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
여러 PDF 병합
Aspose.PDF는 페이지를 수동으로 반복해야 합니다. IronPDF는 정적 Merge 메서드를 제공합니다.
Aspose.PDF 구현:
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
class Program
{
static void Main()
{
var document1 = new Document("file1.pdf");
var document2 = new Document("file2.pdf");
foreach (Page page in document2.Pages)
{
document1.Pages.Add(page);
}
document1.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
// NuGet: Install-Package Aspose.PDF
using Aspose.Pdf;
using System;
class Program
{
static void Main()
{
var document1 = new Document("file1.pdf");
var document2 = new Document("file2.pdf");
foreach (Page page in document2.Pages)
{
document1.Pages.Add(page);
}
document1.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
Imports Aspose.Pdf
Imports System
Class Program
Shared Sub Main()
Dim document1 As New Document("file1.pdf")
Dim document2 As New Document("file2.pdf")
For Each page As Page In document2.Pages
document1.Pages.Add(page)
Next
document1.Save("merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Class
IronPDF 구현:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully");
}
}
Imports IronPdf
Imports System
Imports System.Collections.Generic
Module Program
Sub Main()
Dim pdf1 = PdfDocument.FromFile("file1.pdf")
Dim pdf2 = PdfDocument.FromFile("file2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully")
End Sub
End Module
텍스트 추출
Aspose.PDF 구현:
using Aspose.Pdf;
using Aspose.Pdf.Text;
var document = new Document("document.pdf");
var absorber = new TextAbsorber();
foreach (Page page in document.Pages)
{
page.Accept(absorber);
}
string extractedText = absorber.Text;
Console.WriteLine(extractedText);
using Aspose.Pdf;
using Aspose.Pdf.Text;
var document = new Document("document.pdf");
var absorber = new TextAbsorber();
foreach (Page page in document.Pages)
{
page.Accept(absorber);
}
string extractedText = absorber.Text;
Console.WriteLine(extractedText);
Imports Aspose.Pdf
Imports Aspose.Pdf.Text
Dim document As New Document("document.pdf")
Dim absorber As New TextAbsorber()
For Each page As Page In document.Pages
page.Accept(absorber)
Next
Dim extractedText As String = absorber.Text
Console.WriteLine(extractedText)
IronPDF 구현:
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract all text - one line!
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);
// Or extract from specific page
string page1Text = pdf.ExtractTextFromPage(0);
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Extract all text - one line!
string allText = pdf.ExtractAllText();
Console.WriteLine(allText);
// Or extract from specific page
string page1Text = pdf.ExtractTextFromPage(0);
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Extract all text - one line!
Dim allText As String = pdf.ExtractAllText()
Console.WriteLine(allText)
' Or extract from specific page
Dim page1Text As String = pdf.ExtractTextFromPage(0)
IronPDF는 복수 단계에서 단일 메소드 호출로 텍스트 추출을 간소화합니다.
워터마크 추가
Aspose.PDF 구현:
using Aspose.Pdf;
using Aspose.Pdf.Text;
var document = new Document("document.pdf");
var textStamp = new TextStamp("CONFIDENTIAL");
textStamp.Background = true;
textStamp.XIndent = 100;
textStamp.YIndent = 100;
textStamp.Rotate = Rotation.on45;
textStamp.Opacity = 0.5;
textStamp.TextState.Font = FontRepository.FindFont("Arial");
textStamp.TextState.FontSize = 72;
textStamp.TextState.ForegroundColor = Color.Red;
foreach (Page page in document.Pages)
{
page.AddStamp(textStamp);
}
document.Save("watermarked.pdf");
using Aspose.Pdf;
using Aspose.Pdf.Text;
var document = new Document("document.pdf");
var textStamp = new TextStamp("CONFIDENTIAL");
textStamp.Background = true;
textStamp.XIndent = 100;
textStamp.YIndent = 100;
textStamp.Rotate = Rotation.on45;
textStamp.Opacity = 0.5;
textStamp.TextState.Font = FontRepository.FindFont("Arial");
textStamp.TextState.FontSize = 72;
textStamp.TextState.ForegroundColor = Color.Red;
foreach (Page page in document.Pages)
{
page.AddStamp(textStamp);
}
document.Save("watermarked.pdf");
Imports Aspose.Pdf
Imports Aspose.Pdf.Text
Dim document As New Document("document.pdf")
Dim textStamp As New TextStamp("CONFIDENTIAL")
textStamp.Background = True
textStamp.XIndent = 100
textStamp.YIndent = 100
textStamp.Rotate = Rotation.on45
textStamp.Opacity = 0.5
textStamp.TextState.Font = FontRepository.FindFont("Arial")
textStamp.TextState.FontSize = 72
textStamp.TextState.ForegroundColor = Color.Red
For Each page As Page In document.Pages
page.AddStamp(textStamp)
Next
document.Save("watermarked.pdf")
IronPDF 구현:
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
color: red;
opacity: 0.5;
font-family: Arial;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>";
pdf.ApplyWatermark(watermarkHtml,
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
// HTML-based watermark with full styling control
string watermarkHtml = @"
<div style='
color: red;
opacity: 0.5;
font-family: Arial;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>";
pdf.ApplyWatermark(watermarkHtml,
rotation: 45,
verticalAlignment: VerticalAlignment.Middle,
horizontalAlignment: HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
Imports IronPdf
Imports IronPdf.Editing
Dim pdf = PdfDocument.FromFile("document.pdf")
' HTML-based watermark with full styling control
Dim watermarkHtml As String = "
<div style='
color: red;
opacity: 0.5;
font-family: Arial;
font-size: 72px;
font-weight: bold;
text-align: center;
'>CONFIDENTIAL</div>"
pdf.ApplyWatermark(watermarkHtml,
rotation:=45,
verticalAlignment:=VerticalAlignment.Middle,
horizontalAlignment:=HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
IronPDF는 HTML/CSS 기반의 워터마킹을 사용하여 익숙한 웹 기술을 통해 전체 스타일링 제어를 제공합니다.
비밀번호 보호
Aspose.PDF 구현:
using Aspose.Pdf;
var document = new Document("document.pdf");
document.Encrypt("userPassword", "ownerPassword", DocumentPrivilege.ForbidAll, CryptoAlgorithm.AESx256);
document.Save("protected.pdf");
using Aspose.Pdf;
var document = new Document("document.pdf");
document.Encrypt("userPassword", "ownerPassword", DocumentPrivilege.ForbidAll, CryptoAlgorithm.AESx256);
document.Save("protected.pdf");
Imports Aspose.Pdf
Dim document As New Document("document.pdf")
document.Encrypt("userPassword", "ownerPassword", DocumentPrivilege.ForbidAll, CryptoAlgorithm.AESx256)
document.Save("protected.pdf")
IronPDF 구현:
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Set passwords
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Set passwords
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
// Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
pdf.SaveAs("protected.pdf");
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Set passwords
pdf.SecuritySettings.UserPassword = "userPassword"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
' Set permissions
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit
pdf.SaveAs("protected.pdf")
IronPDF는 강력하게 타입된 프로퍼티를 통해 권한에 대한 세분된 제어를 제공합니다. 더 많은 옵션을 보려면 암호화 문서를 참조하세요.
머리말과 바닥글
IronPDF 구현:
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-family:Arial; font-size:12px;'>
Company Header
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-family:Arial; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content here</h1>");
pdf.SaveAs("with_headers.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-family:Arial; font-size:12px;'>
Company Header
</div>",
DrawDividerLine = true,
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='text-align:center; font-family:Arial; font-size:10px;'>
Page {page} of {total-pages}
</div>",
DrawDividerLine = true,
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Content here</h1>");
pdf.SaveAs("with_headers.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-family:Arial; font-size:12px;'>
Company Header
</div>",
.DrawDividerLine = True,
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='text-align:center; font-family:Arial; font-size:10px;'>
Page {page} of {total-pages}
</div>",
.DrawDividerLine = True,
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Content here</h1>")
pdf.SaveAs("with_headers.pdf")
IronPDF는 {page} 및 {total-pages}와 같은 동적 페이지 번호 지정을 위한 자리 표시자 토큰을 지원합니다. 더 많은 옵션은 헤더 및 푸터 문서를 참조하세요.
중요한 마이그레이션 노트
페이지 색인 변경
Aspose.PDF는 1-based 색인을 사용합니다. IronPDF는 0-based 색인을 사용합니다:
// Aspose.PDF - 1-based indexing
var firstPage = doc.Pages[1]; // First page
var thirdPage = doc.Pages[3]; // Third page
//IronPDF- 0-based indexing
var firstPage = pdf.Pages[0]; // First page
var thirdPage = pdf.Pages[2]; // Third page
// Aspose.PDF - 1-based indexing
var firstPage = doc.Pages[1]; // First page
var thirdPage = doc.Pages[3]; // Third page
//IronPDF- 0-based indexing
var firstPage = pdf.Pages[0]; // First page
var thirdPage = pdf.Pages[2]; // Third page
Imports Aspose.Pdf
Imports IronPdf
' Aspose.PDF - 1-based indexing
Dim firstPageAspose = doc.Pages(1) ' First page
Dim thirdPageAspose = doc.Pages(3) ' Third page
' IronPDF - 0-based indexing
Dim firstPageIron = pdf.Pages(0) ' First page
Dim thirdPageIron = pdf.Pages(2) ' Third page
라이선스 파일을 코드 키로
.lic 파일 라이선싱을 코드 기반 활성화로 교체하십시오:
// Aspose.PDF
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.Pdf.lic");
// IronPDF
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Or from environment variable
IronPdf.License.LicenseKey = Environment.GetEnvironmentVariable("IRONPDF_LICENSE_KEY");
// Aspose.PDF
var license = new Aspose.Pdf.License();
license.SetLicense("Aspose.Pdf.lic");
// IronPDF
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Or from environment variable
IronPdf.License.LicenseKey = Environment.GetEnvironmentVariable("IRONPDF_LICENSE_KEY");
Imports Aspose.Pdf
Imports System
Dim license As New License()
license.SetLicense("Aspose.Pdf.lic")
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' Or from environment variable
IronPdf.License.LicenseKey = Environment.GetEnvironmentVariable("IRONPDF_LICENSE_KEY")
ASP.NET Core 통합
IronPDF 패턴:
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpGet("generate-async")]
public async Task<IActionResult> GeneratePdfAsync()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");
return File(pdf.Stream, "application/pdf", "report.pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("[controller]")>
Public Class PdfController
Inherits ControllerBase
<HttpGet("generate")>
Public Function GeneratePdf() As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>")
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
<HttpGet("generate-async")>
Public Async Function GeneratePdfAsync() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>")
Return File(pdf.Stream, "application/pdf", "report.pdf")
End Function
End Class
의존성 주입 구성
// Program.cs
public void ConfigureServices(IServiceCollection services)
{
// Set license once
IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
// Register renderer as scoped service
services.AddScoped<ChromePdfRenderer>();
}
// Program.cs
public void ConfigureServices(IServiceCollection services)
{
// Set license once
IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"];
// Register renderer as scoped service
services.AddScoped<ChromePdfRenderer>();
}
' Program.vb
Public Sub ConfigureServices(services As IServiceCollection)
' Set license once
IronPdf.License.LicenseKey = Configuration("IronPdf:LicenseKey")
' Register renderer as scoped service
services.AddScoped(Of ChromePdfRenderer)()
End Sub
성능 최적화
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
renderer.RenderingOptions.Timeout = 30000; // 30s max
// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();
// 2. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay
renderer.RenderingOptions.Timeout = 30000; // 30s max
// 3. Proper disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
' 1. Reuse renderer instance
Private Shared ReadOnly SharedRenderer As New ChromePdfRenderer()
' 2. Disable unnecessary features for speed
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = False ' If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0) ' No delay
renderer.RenderingOptions.Timeout = 30000 ' 30s max
' 3. Proper disposal
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using
일반적인 마이그레이션 문제 해결
문제: HtmlLoadOptions를 찾을 수 없습니다
ChromePdfRenderer로 교체하십시오:
// Remove this
var doc = new Document(stream, new HtmlLoadOptions());
// Use this
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Remove this
var doc = new Document(stream, new HtmlLoadOptions());
// Use this
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlString);
Dim doc = New Document(stream, New HtmlLoadOptions())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
문제: TextFragmentAbsorber를 찾을 수 없음
직접 텍스트 추출 사용:
// Remove this
var absorber = new TextFragmentAbsorber();
page.Accept(absorber);
string text = absorber.Text;
// Use this
var pdf = PdfDocument.FromFile("doc.pdf");
string text = pdf.ExtractAllText();
// Remove this
var absorber = new TextFragmentAbsorber();
page.Accept(absorber);
string text = absorber.Text;
// Use this
var pdf = PdfDocument.FromFile("doc.pdf");
string text = pdf.ExtractAllText();
' Remove this
Dim absorber As New TextFragmentAbsorber()
page.Accept(absorber)
Dim text As String = absorber.Text
' Use this
Dim pdf = PdfDocument.FromFile("doc.pdf")
Dim text As String = pdf.ExtractAllText()
문제: PdfFileEditor.Concatenate 사용할 수 없음
PdfDocument.Merge()를 사용하십시오:
// Remove this
var editor = new PdfFileEditor();
editor.Concatenate(files, output);
// Use this
var pdfs = files.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs(output);
// Remove this
var editor = new PdfFileEditor();
editor.Concatenate(files, output);
// Use this
var pdfs = files.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs(output);
' Remove this
Dim editor = New PdfFileEditor()
editor.Concatenate(files, output)
' Use this
Dim pdfs = files.Select(Function(file) PdfDocument.FromFile(file)).ToList()
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs(output)
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- Aspose.PDF 라이선스 파일 (.lic) 제거
- HTML 렌더링 품질 확인 (CSS Grid, Flexbox가 이제 제대로 작동해야 함)
- 큰 문서와 복잡한 CSS로 경계 사례 테스트
- 페이지 인덱스 참조 업데이트 (1 기반에서 0 기반으로)
- 해당하는 경우 Docker 구성을 업데이트하세요
- 새로운 라이선스 키 구성으로 CI/CD 파이프라인 업데이트
- 팀을 위한 새로운 패턴을 문서화하세요
PDF 인프라의 미래 대비
.NET 10이 다가오고 C# 14가 새로운 언어 기능을 도입함에 따라, 현대적인 렌더링 기능을 갖춘 PDF 라이브러리를 선택하면 발전하는 웹 표준과의 호환성을 보장합니다. IronPDF의 Chromium 엔진은 최신 브라우저에서 작동하는 것과 동일한 HTML/CSS를 렌더링합니다. 즉, Aspose.PDF의 Flying Saucer 엔진의 CSS 제한 없이 2025년 및 2026년까지 프로젝트가 확장되어도 PDF 템플릿이 최신 상태로 유지됩니다.
추가 리소스
Aspose.PDF에서 IronPDF로의 마이그레이션은 귀하의 PDF 코드베이스를 구식 HTML 렌더링 엔진에서 현대적인 Chromium 기반 렌더링으로 변화시킵니다. MemoryStream 래퍼의 제거, 간소화된 텍스트 추출 및 우수한 CSS3 지원은 단기적으로 생산성을 즉시 향상시키며 연간 구독에서 일회성 투자로 장기적인 라이선스 비용을 절감합니다.

