Jak przeprowadzić migrację z Nutrient.io do IronPDF w języku C#
Migracja z Nutrient.io (dawniej PSPDFKit) doIronPDFupraszcza przepływ pracy z plikami PDF w środowisku .NET poprzez przejście ze złożonej platformy analizy dokumentów opartej na wzorcach asynchronicznych na wyspecjalizowaną bibliotekę PDF z prostymi, synchronicznymi interfejsami API. Niniejszy przewodnik zawiera kompleksową, krok po kroku ścieżkę migracji, która eliminuje obciążenie platformy, zachowując jednocześnie wszystkie niezbędne funkcje związane z plikami PDF.
Dlaczego warto przejść z Nutrient.io na IronPDF
Problem złożoności platformy
Nutrient.io (dawniej PSPDFKit) ewoluowało z zestawu SDK do obsługi plików PDF w kompleksową "platformę analizy dokumentów". Chociaż ta transformacja poszerza możliwości, stwarza ona poważne wyzwania dla zespołów, które potrzebują po prostu niezawodnych operacji na plikach PDF:
-
Nadmierna rozbudowa platformy: To, co kiedyś było zestawem SDK do obsługi plików PDF, obecnie stanowi pełną platformę analizy dokumentów z funkcjami sztucznej inteligencji i możliwościami zarządzania przepływem pracy, które mogą być zbędne w przypadku prostych zadań związanych z plikami PDF.
-
Ceny dla Enterprise: Nutrient.io jest skierowany do dużych organizacji, a jego ceny są nieprzejrzyste i wymagają kontaktu z działem sprzedaży. Stwarza to bariery dla małych i średnich zespołów oraz utrudnia planowanie budżetu.
-
Niejasności związane ze zmianą marki: Przejście z PSPDFKit na Nutrient spowodowało problemy z dokumentacją, w której występują odniesienia do obu nazw. Nazwy pakietów mogą nadal zawierać PSPDFKit, a ścieżki migracji podczas przejścia pozostają niejasne.
-
Złożoność oparta na asynchroniczności: Wszystko w Nutrient.io wymaga wzorców async/await. Nawet proste operacje wymagają
PdfProcessor.CreateAsync()do inicjalizacji oraz metod asynchronicznych do podstawowych zadań, co zwiększa obciążenie w przypadku synchronicznych przepływów pracy. - Duże zależności: Pełna platforma wymaga większych zasobów, zajmuje więcej miejsca w pakiecie, wymaga dłuższego czasu inicjalizacji oraz dodatkowej konfiguracji.
Porównanie Nutrient.io i IronPDF
| Aspekt | Nutrient.io (PSPDFKit) | IronPDF |
|---|---|---|
| Skup się na | Platforma analizy dokumentów | Biblioteka PDF |
| Ceny | Enterprise (kontakt z działem sprzedaży) | Przejrzyste, opublikowane |
| Architektura | Złożona platforma | Prosta biblioteka |
| Styl API | Async-first | Synchronizacja z opcjami asynchronicznymi |
| Zależności | Ciężki | Lekki |
| Konfiguracja | Złożone obiekty konfiguracyjne | Proste właściwości |
| Krzywa uczenia się | Steep (platforma) | Gentle (biblioteka) |
| Docelowi użytkownicy | Enterprise | Wszystkie rozmiary zespołów |
Dla zespołów planujących wdrożenie .NET 10 i C# 14 w latach 2025 i 2026,IronPDFzapewnia prostszą podstawę, która integruje się płynnie bez obciążenia związanego z pełną platformą analizy dokumentów.
Zanim zaczniesz
Wymagania wstępne
- Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com
Zmiany w pakiecie 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
Konfiguracja licencji
// 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"
Zidentyfikuj zastosowanie 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" .
Kompletna dokumentacija API
Mapowania inicjalizacji
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await PdfProcessor.CreateAsync() |
new ChromePdfRenderer() |
processor.Dispose() |
(automatyczne lub ręczne) |
new PdfConfiguration { ... } |
renderer.RenderingOptions |
Mapowania ładowania dokumentów
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await processor.OpenAsync(path) |
PdfDocument.FromFile(path) |
Document.LoadFromStream(stream) |
PdfDocument.FromStream(stream) |
Document.LoadFromBytes(bytes) |
new PdfDocument(bytes) |
Mapowania generowania plików 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) |
Mapowania operacji na dokumentach
| 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 |
Mapowanie adnotacji i znaków wodnych
| Nutrient.io (PSPDFKit) | IronPDF |
|---|---|
await document.AddAnnotationAsync(index, annotation) |
pdf.ApplyWatermark(html) |
new TextAnnotation("text") |
HTML w znaku wodnym |
annotation.Opacity = 0.5 |
CSS opacity: 0.5 |
annotation.FontSize = 48 |
CSS font-size: 48px |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF
Przed (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
Po (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
Podejście Nutrient.io wymaga kilku asynchronicznych kroków: utworzenia PdfProcessor za pomocą await PdfProcessor.CreateAsync(), następnie wywołania await processor.GeneratePdfFromHtmlStringAsync(), a na koniec await document.SaveAsync(). Cała metoda musi być oznaczona jako async Task, a procesor wymaga instrukcji using w celu prawidłowego usunięcia.
IronPDF znacznie to upraszcza. Utwórz ChromePdfRenderer, wywołaj RenderHtmlAsPdf() i zapisz za pomocą SaveAs(). Nie wymaga async/await, nie ma cyklu życia procesora do zarządzania i nie potrzebuje bloków using do prostych operacji. Ten wzorzec jest bardziej intuicyjny dla programistów, którzy nie potrzebują wzorców asynchronicznych w swoim przepływie pracy z plikami PDF. Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: Łączenie wielu plików PDF
Przed (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
Po (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
Operacja scalania w Nutrient.io wymaga utworzenia procesora za pomocą await PdfProcessor.CreateAsync(), otwarcia każdego dokumentu za pomocą oddzielnych wywołań await processor.OpenAsync(), utworzenia List<PdfDocument>, wywołania await processor.MergeAsync() z tą listą, a na koniec await mergedDocument.SaveAsync(). To pięć operacji asynchronicznych dla podstawowego scalania.
IronPDF redukuje to do czterech synchronicznych wierszy: załaduj każdy plik PDF za pomocą PdfDocument.FromFile(), scal za pomocą statycznej metody PdfDocument.Merge() i zapisz. Brak cyklu życia procesora, brak konieczności tworzenia list (można przekazywać dokumenty bezpośrednio) oraz brak obciążenia związanego z asynchronicznością. Dowiedz się więcej o łączeniu i dzieleniu plików PDF.
Przykład 3: Dodawanie znaków wodnych
Przed (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
Po (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
Ten przykład podkreśla fundamentalną różnicę architektoniczną. Nutrient.io wykorzystuje podejście oparte na adnotacjach: tworzysz obiekt TextAnnotation z właściwościami takimi jak Opacity i FontSize, a następnie przechodzisz przez każdą stronę, wywołując await document.AddAnnotationAsync(i, watermark) dla każdej z nich. Wymaga to zrozumienia systemu adnotacji i samodzielnego zarządzania pętlą.
IronPDF wykorzystuje podejście oparte na HTML: metoda ApplyWatermark() akceptuje ciąg znaków HTML ze stylami CSS. Znak wodny jest automatycznie nakładany na wszystkie strony za pomocą jednego wywołania. Wygląd kontrolujesz za pomocą znanych właściwości CSS (color, opacity, font-size), a nie właściwości obiektów specyficznych dla adnotacji. Takie podejście zapewnia większą elastyczność stylistyczną — można używać dowolnego kodu HTML/CSS, w tym gradientów, obrazów i złożonych układów. Zaawansowane przykłady można znaleźć w dokumentacji dotyczącej znaków wodnych.
Ważne uwagi dotyczące migracji
Konwersja z trybu asynchronicznego na synchroniczny
Najważniejszą zmianą jest usunięcie zbędnych wzorców 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")
Jeśli potrzebujesz operacji asynchronicznych,IronPDFoferuje warianty asynchroniczne, takie jak RenderHtmlAsPdfAsync().
Eliminacja cyklu życia procesora
Nutrient.io wymaga tworzenia i usuwania procesorów:
// 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
Zmiana wzorca konfiguracji
Nutrient.io wykorzystuje obiekty konfiguracyjne;IronPDFwykorzystuje właściwości:
// 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)
Adnotacja do znaków wodnych HTML
Zastąp obiekty adnotacji ciągami 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>"
Obsługa numerów stron
Nutrient.io wymaga ręcznego zliczenia stron;IronPDFposiada wbudowane symbole zastępcze:
// 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}"
}
Rozwiązywanie problemów
Problem 1: Nie znaleziono PdfProcessor
Problem: Klasa PdfProcessor nie istnieje w IronPDF.
Rozwiązanie: Użyj 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()
Problem 2: Nie znaleziono GeneratePdfFromHtmlStringAsync
Problem: Metoda Async HTML nie istnieje.
Rozwiązanie: Użyj 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)
Problem 3: Nie znaleziono adnotacji tekstowej
Problem: Klasy adnotacji nie istnieją w IronPDF.
Rozwiązanie: Użyj znaków wodnych opartych na 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>")
Problem 4: Nie znaleziono MergeAsync
Problem: Nie istnieje metoda asynchronicznego scalania.
Rozwiązanie: Użyj statycznego 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)
Lista kontrolna migracji
Przed migracją
- Sporządź spis wszystkich zastosowań PSPDFKit/Nutrient w kodzie źródłowym
- Dokumentuj wzorce asynchroniczne, które mogą wymagać dostosowania
- Wymień wszystkie obiekty konfiguracyjne i ich właściwości
- Zidentyfikuj elementy oparte na adnotacjach (znaki wodne, nagłówki)
- Zapoznaj się z wymaganiami dotyczącymi obsługi formularzy
- Uzyskaj klucz licencyjny IronPDF
Zmiany w pakiecie
- Usuń pakiet NuGet
PSPDFKit.NET - Usuń pakiet NuGet
Nutrient - Zainstaluj pakiet NuGet
IronPdf:dotnet add package IronPdf - Zaktualizuj importy przestrzeni nazw
Zmiany w kodzie
- Dodaj konfigurację klucza licencyjnego podczas uruchamiania
- Zastąp
PdfProcessor.CreateAsync()przeznew ChromePdfRenderer() - Zastąp
processor.GeneratePdfFromHtmlStringAsync()przezrenderer.RenderHtmlAsPdf() - Zastąp
processor.MergeAsync()przezPdfDocument.Merge() - Zamień znaki wodne
TextAnnotationna znaki wodne HTML - Zastąp obiekty konfiguracyjne właściwościami
RenderingOptions - Zaktualizuj nagłówek/stopkę, aby używać
HtmlHeaderFooterz symbolami zastępczymi - Usuń zbędne wzorce async/await
Po migracji
- Usuń async/await tam, gdzie nie jest już potrzebne
- Przeprowadź testy regresji porównujące wynik w formacie PDF
- Sprawdź nagłówki/stopki z numerami stron
- Test renderowania znaku wodnego
- Aktualizacja potoku CI/CD

