C#에서 Nutrient.io에서 IronPDF로 마이그레이션하는 방법
Nutrient.io(이전 PSPDFKit)에서 IronPDF로의 이전은 비동기 우선 패턴을 사용하는 복잡한 문서 인텔리전스 플랫폼에서 직관적인 동기 API가 있는 집중된 PDF 라이브러리로 이동하여 .NET PDF 워크플로우를 단순화합니다. 이 가이드는 플랫폼 오버헤드를 제거하면서 필수적인 PDF 기능은 모두 유지하는 포괄적인 단계별 마이그레이션 경로를 제공합니다.
Nutrient.io에서 IronPDF로 마이그레이션하는 이유
플랫폼 복잡성 문제
Nutrient.io(이전 PSPDFKit)는 PDF SDK에서 포괄적인 "문서 인텔리전스 플랫폼"으로 발전했습니다. 이 변화는 기능을 확장하지만, 단순히 안정적인 PDF 작업이 필요한 팀에게 상당한 도전을 안겨줍니다:
-
플랫폼 과공학: 한때 PDF SDK였던 것이 이제 AI 기능과 문서 워크플로 기능을 갖춘 완전한 문서 인텔리전스 플랫폼으로 변모하여, 단순한 PDF 작업에는 불필요할 수 있습니다.
-
Enterprise 가격 정책: Nutrient.io는 대규모 조직을 위해 설정되어 있으며, 영업팀과의 문의가 필요한 불투명한 가격을 가지고 있습니다. 이는 중소 팀에게 장벽을 만들고 예산 계획을 어렵게 합니다.
-
재브랜딩 혼란: PSPDFKit → Nutrient로의 전환은 두 명칭에 대한 참조가 존재하는 문서화 문제를 야기했습니다. 패키지 이름은 여전히 PSPDFKit을 사용할 수 있으며, 전환 중의 마이그레이션 경로는 명확하지 않습니다.
-
비동기 우선 복잡성: Nutrient.io에서는 모든 것이 async/await 패턴을 요구합니다. 단순한 작업조차도 초기화를 위해
PdfProcessor.CreateAsync()및 기본 작업을 위한 비동기 메서드를 필요로 하며, 동기 업무 흐름에 오버헤드를 추가합니다. - 큰 의존성: 전체 플랫폼은 더 큰 패키지 크기, 더 긴 초기화 시간, 추가적인 구성으로 더 많은 자원을 필요로 합니다.
Nutrient.io와IronPDF비교
| 측면 | Nutrient.io (PSPDFKit) | IronPDF |
|---|---|---|
| 초점 | 문서 인텔리전스 플랫폼 | PDF 라이브러리 |
| 가격 | Enterprise (영업팀에 문의) | 투명하고 출판된 내용 |
| 아키텍처 | 복잡한 플랫폼 | 간단한 라이브러리 |
| API 스타일 | 비동기 우선 | 비동기 옵션이 있는 동기 |
| 종속성 | 무거운 | 경량 |
| 구성 | 복잡한 구성 객체 | 직관적인 속성 |
| 학습 곡선 | 가파른 (플랫폼) | 완만한 (라이브러리) |
| 대상 사용자 | Enterprise | 모든 팀 크기 |
2025년과 2026년을 대비해 .NET 10 및 C# 14 채택을 계획하는 팀을 위해 IronPDF는 전체 문서 인텔리전스 플랫폼의 오버헤드 없이 깔끔하게 통합되는 더 단순한 기초를 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF
# Install IronPDF
dotnet add package IronPdf
# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Nutrient.io 사용 여부 식별
# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .
# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .
완전한 API 참조
초기화 매핑
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await PdfProcessor.CreateAsync() |
new ChromePdfRenderer() |
processor.Dispose() |
(자동 또는 수동) |
new PdfConfiguration { ... } |
renderer.RenderingOptions |
문서 로딩 매핑
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await processor.OpenAsync(path) |
PdfDocument.FromFile(path) |
Document.LoadFromStream(stream) |
PdfDocument.FromStream(stream) |
Document.LoadFromBytes(bytes) |
new PdfDocument(bytes) |
PDF 생성 매핑
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await processor.GeneratePdfFromHtmlStringAsync(html) |
renderer.RenderHtmlAsPdf(html) |
await processor.GeneratePdfFromUrlAsync(url) |
renderer.RenderUrlAsPdf(url) |
await processor.GeneratePdfFromFileAsync(path) |
renderer.RenderHtmlFileAsPdf(path) |
문서 작업 매핑
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await processor.MergeAsync(docs) |
PdfDocument.Merge(pdfs) |
document.PageCount |
pdf.PageCount |
await document.SaveAsync(path) |
pdf.SaveAs(path) |
document.ToBytes() |
pdf.BinaryData |
주석 및 워터마크 매핑
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await document.AddAnnotationAsync(index, annotation) |
pdf.ApplyWatermark(html) |
new TextAnnotation("text") |
워터마크의 HTML |
annotation.Opacity = 0.5 |
CSS opacity: 0.5 |
annotation.FontSize = 48 |
CSS font-size: 48px |
코드 마이그레이션 예제
예제 1: HTML에서 PDF로 변환
이전 (Nutrient.io):
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
await document.SaveAsync("output.pdf");
}
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
await document.SaveAsync("output.pdf");
}
}
Imports PSPDFKit.Pdf
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Using processor = Await PdfProcessor.CreateAsync()
Dim document = Await processor.GeneratePdfFromHtmlStringAsync(htmlContent)
Await document.SaveAsync("output.pdf")
End Using
End Function
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
Nutrient.io 접근 방식은 몇 가지 비동기 단계가 필요합니다: await PdfProcessor.CreateAsync()로 PdfProcessor을 만든 다음 await processor.GeneratePdfFromHtmlStringAsync()을 호출하고 마지막으로 await document.SaveAsync()을 호출합니다. 전체 메서드는 async Task로 표시되어야 하며, 프로세서는 적절한 처리를 위해 using 문이 필요합니다.
IronPDF는 이를 극적으로 단순화합니다. ChromePdfRenderer을 생성하고 RenderHtmlAsPdf()을 호출한 다음 SaveAs()로 저장합니다. 비동기/대기를 필요로 하지 않고, 관리할 프로세서 수명 주기도 없으며, 간단한 작업에 필요한 using 블록도 필요 없습니다. 이 패턴은 PDF 워크플로를 위해 비동기 패턴이 필요하지 않은 개발자에게 더 직관적입니다. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예시 2: 여러 PDF 병합
이전 (Nutrient.io):
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;
class Program
{
static async Task Main()
{
using var processor = await PdfProcessor.CreateAsync();
var document1 = await processor.OpenAsync("document1.pdf");
var document2 = await processor.OpenAsync("document2.pdf");
var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
await mergedDocument.SaveAsync("merged.pdf");
}
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;
class Program
{
static async Task Main()
{
using var processor = await PdfProcessor.CreateAsync();
var document1 = await processor.OpenAsync("document1.pdf");
var document2 = await processor.OpenAsync("document2.pdf");
var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
await mergedDocument.SaveAsync("merged.pdf");
}
}
Imports PSPDFKit.Pdf
Imports System.Threading.Tasks
Imports System.Collections.Generic
Class Program
Shared Async Function Main() As Task
Using processor = Await PdfProcessor.CreateAsync()
Dim document1 = Await processor.OpenAsync("document1.pdf")
Dim document2 = Await processor.OpenAsync("document2.pdf")
Dim mergedDocument = Await processor.MergeAsync(New List(Of PdfDocument) From {document1, document2})
Await mergedDocument.SaveAsync("merged.pdf")
End Using
End Function
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Nutrient.io 병합 작업은 await PdfProcessor.CreateAsync()로 프로세서를 생성하고, 각 문서를 별도의 await processor.OpenAsync() 호출로 열고, List<PdfDocument>을 생성하고, 그 목록과 함께 await processor.MergeAsync()를 호출한 다음 최종적으로 await mergedDocument.SaveAsync()을 호출해야 합니다. 기본 병합을 위한 다섯 가지 비동기 작업이 필요합니다.
IronPDF는 이를 네 개의 동기 라인으로 줄여줍니다: PdfDocument.FromFile()으로 각 PDF를 로드하고, 정적 PdfDocument.Merge() 메서드로 병합한 다음 저장합니다. 프로세서 수명 주기 필요 없음, 리스트 생성 필요 없음 (문서를 바로 전달할 수 있음), 비동기 오버헤드 없음. PDF 병합 및 분할에 대해 더 알아보세요.
예제 3: 워터마크 추가
이전 (Nutrient.io):
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.OpenAsync("document.pdf");
for (int i = 0; i < document.PageCount; i++)
{
var watermark = new TextAnnotation("CONFIDENTIAL")
{
Opacity = 0.5,
FontSize = 48
};
await document.AddAnnotationAsync(i, watermark);
}
await document.SaveAsync("watermarked.pdf");
}
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.OpenAsync("document.pdf");
for (int i = 0; i < document.PageCount; i++)
{
var watermark = new TextAnnotation("CONFIDENTIAL")
{
Opacity = 0.5,
FontSize = 48
};
await document.AddAnnotationAsync(i, watermark);
}
await document.SaveAsync("watermarked.pdf");
}
}
Imports PSPDFKit.Pdf
Imports PSPDFKit.Pdf.Annotation
Imports System.Threading.Tasks
Class Program
Shared Async Function Main() As Task
Using processor = Await PdfProcessor.CreateAsync()
Dim document = Await processor.OpenAsync("document.pdf")
For i As Integer = 0 To document.PageCount - 1
Dim watermark = New TextAnnotation("CONFIDENTIAL") With {
.Opacity = 0.5,
.FontSize = 48
}
Await document.AddAnnotationAsync(i, watermark)
Next
Await document.SaveAsync("watermarked.pdf")
End Using
End Function
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
50,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
50,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
50,
VerticalAlignment.Middle,
HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
이 예시는 근본적인 아키텍처 차이를 강조합니다. Nutrient.io는 주석 기반 접근 방식을 사용합니다: Opacity 및 FontSize와 같은 속성을 가지는 TextAnnotation 객체를 생성한 다음, 각 페이지를 순회하며 각각에 대해 await document.AddAnnotationAsync(i, watermark)을 호출합니다. 이는 주석 시스템을 이해하고 자신이 루프를 관리해야 함을 요구합니다.
IronPDF는 HTML 기반 접근 방식을 사용합니다: ApplyWatermark() 메서드는 CSS 스타일링이 있는 HTML 문자열을 수용합니다. 워터마크는 한 번의 호출로 모든 페이지에 자동으로 적용됩니다. 익숙한 CSS 속성(color, opacity, font-size)을 통해 외관을 제어하며, 주석-특정 객체 속성보다는 이 방법을 사용합니다. 이 접근 방식은 더 많은 스타일링 유연성을 제공합니다—그라데이션, 이미지, 복잡한 레이아웃을 포함한 모든 HTML/CSS를 사용할 수 있습니다. 고급 예제는 워터마크 문서를 참조하십시오.
중요한 마이그레이션 노트
비동기에서 동기 변환
가장 중요한 변화는 불필요한 async/await 패턴을 제거하는 것입니다.
// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");
// IronPDF: Sync by default (async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");
// IronPDF: Sync by default (async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Imports System
Imports System.Threading.Tasks
' Nutrient.io: Async-first
Using processor = Await PdfProcessor.CreateAsync()
Dim document = Await processor.GeneratePdfFromHtmlStringAsync(html)
Await document.SaveAsync("output.pdf")
End Using
' IronPDF: Sync by default (async available when needed)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
비동기 작업이 필요하다면, IronPDF는 RenderHtmlAsPdfAsync()와 같은 비동기 변형을 제공합니다.
프로세서 수명 주기 제거
Nutrient.io는 프로세서 생성 및 폐기를 요구합니다.
// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block
// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle management
// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block
// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle management
Imports IronPdf
' Nutrient.io: Processor lifecycle management
Using processor = Await PdfProcessor.CreateAsync()
' ... use processor ...
' Processor disposed at end of using block
End Using
' IronPDF: No processor lifecycle
Dim renderer As New ChromePdfRenderer()
' Reuse renderer, no complex lifecycle management
구성 패턴 변경
Nutrient.io는 구성 객체를 사용합니다; IronPDF는 속성을 사용합니다:
// Nutrient.io: Config object
var config = new PdfConfiguration
{
PageSize = PageSize.A4,
Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);
// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);
// Nutrient.io: Config object
var config = new PdfConfiguration
{
PageSize = PageSize.A4,
Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);
// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);
Imports System.Threading.Tasks
' Nutrient.io: Config object
Dim config As New PdfConfiguration With {
.PageSize = PageSize.A4,
.Margins = New Margins(20, 20, 20, 20)
}
Dim doc = Await processor.GeneratePdfFromHtmlStringAsync(html, config)
' IronPDF: Properties on RenderingOptions
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlAsPdf(html)
주석에서 HTML 워터마크로
주석 객체를 HTML 문자열로 대체하십시오:
// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }
// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"
// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }
// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"
' Nutrient.io: Annotation object with properties
New TextAnnotation("CONFIDENTIAL") With {.Opacity = 0.5F, .FontSize = 48}
' IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"
페이지 번호 처리
Nutrient.io는 수동 페이지 카운팅이 필요합니다; IronPDF에는 내장된 플레이스홀더가 있습니다:
// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
await doc.AddAnnotationAsync(i, footer);
}
// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};
// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
await doc.AddAnnotationAsync(i, footer);
}
// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};
' Nutrient.io: Manual loop and page counting
For i As Integer = 0 To doc.PageCount - 1
Dim footer = New TextAnnotation($"Page {i + 1} of {doc.PageCount}")
Await doc.AddAnnotationAsync(i, footer)
Next
' IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "Page {page} of {total-pages}"
}
문제 해결
문제 1: PdfProcessor를 찾을 수 없음
문제: IronPDF에 PdfProcessor 클래스가 존재하지 않습니다.
해결책: ChromePdfRenderer을 사용하세요:
// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();
// IronPDF
var renderer = new ChromePdfRenderer();
// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();
// IronPDF
var renderer = new ChromePdfRenderer();
' Nutrient.io
Using processor = Await PdfProcessor.CreateAsync()
' IronPDF
Dim renderer = New ChromePdfRenderer()
문제 2: GeneratePdfFromHtmlStringAsync를 찾을 수 없음
문제: 비동기 HTML 메서드가 존재하지 않습니다.
해결책: RenderHtmlAsPdf()을 사용하세요:
// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
' Nutrient.io
Dim document = Await processor.GeneratePdfFromHtmlStringAsync(html)
' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)
문제 3: TextAnnotation을 찾을 수 없음
문제: IronPDF에 주석 클래스가 존재하지 않습니다.
해결책: HTML 기반 워터마크를 사용하세요:
// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");
// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");
Imports System.Threading.Tasks
' Nutrient.io
Dim watermark As New TextAnnotation("DRAFT") With {.Opacity = 0.5}
Await document.AddAnnotationAsync(0, watermark)
' IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>")
문제 4: MergeAsync를 찾을 수 없음
문제: 비동기 병합 메서드가 존재하지 않습니다.
해결책: 정적 PdfDocument.Merge()을 사용하세요:
// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
Imports System.Threading.Tasks
' Nutrient.io
Dim mergedDocument = Await processor.MergeAsync(documentList)
' IronPDF
Dim merged = PdfDocument.Merge(pdf1, pdf2)
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에서 모든 PSPDFKit/Nutrient 사용을 인벤토리화합니다
- 조정이 필요할 수 있는 비동기 패턴을 문서화합니다
- 모든 구성 객체와 그 속성을 나열합니다
- 주석 기반 기능(워터마크, 헤더)을 식별합니다
- 폼 처리 요구 사항을 검토합니다 -IronPDF라이센스 키를 받으세요
패키지 변경 사항
PSPDFKit.NETNuGet 패키지 제거NutrientNuGet 패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf- 네임스페이스 가져오기 업데이트
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
PdfProcessor.CreateAsync()를new ChromePdfRenderer()로 대체processor.GeneratePdfFromHtmlStringAsync()를renderer.RenderHtmlAsPdf()로 대체processor.MergeAsync()를PdfDocument.Merge()로 대체TextAnnotation워터마크를 HTML 워터마크로 변환- 구성 객체를
RenderingOptions속성으로 대체 - 머리글/바닥글을
HtmlHeaderFooter와 자리 표시자와 함께 사용하도록 업데이트 - 불필요한 async/await 패턴을 제거합니다
마이그레이션 이후
- 더 이상 필요하지 않은 경우 async/await 제거
- PDF 출력 비교 회귀 테스트 실행
- 페이지 번호가 있는 페이지 머리글/바닥글 확인
- 워터마크 렌더링 테스트
- CI/CD 파이프라인 업데이트

