Jak przeprowadzić migrację z Nutrient.io do IronPDF w języku C#
Migracja z Nutrient (dawniej PSPDFKit) do IronPDF uproszcza przepływ pracy PDF w .NET, przechodząc z szerokiego zestawu narzędzi do obrazowania i PDF na skoncentrowaną bibliotekę PDF. Serwerowa oferta .NET Nurtient to GdPicture.NET — zestaw narzędzi nabyty od ORPALIS i przeprofilowany jako "Nutrient .NET SDK" — który jest dostarczany jako pakiet GdPicture NuGet w przestrzeni nazw GdPicture14. Ten przewodnik przeprowadza przez krok po kroku ścieżkę migracji, która zamienia proceduralny, wielozadaniowy zestaw narzędzi na bibliotekę tylko PDF z mniejszą powierzchnią.
Dlaczego przejść z Nutrient do IronPDF
Problem z powierzchnią zestawu narzędzi
Nutrient (dawniej PSPDFKit, rebranding 2024-10-23) sprzedaje wieloproduktową rodzinę — Document Engine (mikroserwis Docker), Web SDK, SDK mobilne i serwerowy .NET SDK, który jest GdPicture w głębokim zapleczu. Dla zespołów, które potrzebują prostych operacji PDF bez reszty zestawu narzędzi, powierzchnia ujawnia się na kilka konkretnych sposobów:
-
Szeroki zakres zestawu narzędzi: SDK .NET obejmuje PDF, OCR, kody kreskowe, skanowanie TWAIN, przetwarzanie obrazów i konwersję między ponad 100 formatami plików. Przydatne, jeśli potrzebujesz tej szerokości - więcej powierzchni niż potrzebuje projekt tylko PDF, jeśli nie.
-
Cennik prowadzony przez dział sprzedaży: Strona
nutrient.io/sdk/pricingkieruje do formularza kontaktowego zamiast publikować stawki per-developer, co utrudnia porównanie kosztów dla małych zespołów. -
Zmiana marki i pakietu: PSPDFKit → Nutrient (2024-10-23), plus nabycie GdPicture, oznacza trzy nazwy do śledzenia w starszym kodzie. .NET SDK wciąż jest dostarczany jako pakiet
GdPictureNuGet, przestrzeń nazwGdPicture14, z nazwami klas jakGdPicturePDFiGdPictureDocumentConverter, które nie pasują do marki "Nutrient" lub "PSPDFKit". -
Zależność od przeglądarki zewnętrznej podczas konwersji HTML do PDF: Renderer HTML w .NET SDK uzależnia się od systemowo zainstalowanego Chrome lub Edge (lub na przenośną ścieżkę, którą ustawia się poprzez
SetWebBrowserPath).IronPDF dostarcza własny wbudowany Chromium. - Proceduralne API PDF: Znaki wodne składają się z
SetFillAlpha,DrawTextBoxi znaczników warstw OCG; nagłówki i stopki są rysowane na stronę w pętli. Kompozycja typowych operacji PDF z prymitywów oznacza więcej kodu na zadanie.
Porównanie Nutrient .NET SDK kontra IronPDF
| Aspekt | Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|---|
| Zakres | PDF + OCR + kod kreskowy + skanowanie + obrazowanie | Biblioteka PDF |
| Ceny | Wyceną prowadzoną przez sprzedaż (skontaktuj się, aby uzyskać ofertę) | Przejrzyste, opublikowane |
| Pakiet NuGet | GdPicture |
IronPdf |
| Przestrzeń nazw głównych | GdPicture14 |
IronPdf |
| Styl API | Głównie synchroniczne, wywołania procedury rysowania | Synchronizacja z opcją asynchroniczną, płynne |
| Renderowanie HTML | Wymaga systemowej Chrome / Edge | Osadzone Chromium |
| Indeksowanie stron | bazujący na 1 | bazujący na 0 |
| Docelowi użytkownicy | Zespoły potrzebujące obrazowania + skanowania + PDF w jednym zestawie narzędzi | Zespoły potrzebujące tylko PDF |
Dla zespołów na nowoczesnym .NET, które potrzebują tylko PDF,IronPDF zapewnia mniejszą, skoncentrowaną na PDF podstawę, która integruje się czysto, bez dodatkowych warstw obrazowania / skanowania / OCR.
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 theNutrient .NET SDK (GdPicture)and any legacy PSPDFKit-branded packages
dotnet remove package GdPicture
dotnet remove package GdPicture.WPF
dotnet remove package GdPicture.WinForms
dotnet remove package PSPDFKit.NET
# Install IronPDF
dotnet add package IronPdf
# Remove theNutrient .NET SDK (GdPicture)and any legacy PSPDFKit-branded packages
dotnet remove package GdPicture
dotnet remove package GdPicture.WPF
dotnet remove package GdPicture.WinForms
dotnet remove package PSPDFKit.NET
# Install IronPDF
dotnet add package IronPdf
Obecny Nutrient .NET SDK jest dostarczany pod identyfikatorem GdPicture NuGet (najnowsza wersja 14.x, właściciel ORPALIS — spółka zależna Nutrient). Starszy pakiet oznakowany jako PSPDFKit PSPDFKit.NET został wycofany; usuń, jeśli jest obecny.
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"
Identyfikacja użycia Nutrient .NET SDK
# Find GdPicture / Nutrient / PSPDFKit usage
grep -rE "GdPicture14|GdPicturePDF|GdPictureDocumentConverter|PSPDFKit|Nutrient" --include="*.cs" .
# Find GdPicture / Nutrient / PSPDFKit usage
grep -rE "GdPicture14|GdPicturePDF|GdPictureDocumentConverter|PSPDFKit|Nutrient" --include="*.cs" .
Kompletna dokumentacija API
Mapowania inicjalizacji
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
new GdPicturePDF() |
new PdfDocument(...) / PdfDocument.FromFile(...) |
new GdPictureDocumentConverter() |
new ChromePdfRenderer() |
pdf.Dispose() (IDisposable) |
pdf.Dispose() (IDisposable) |
Mapowania ładowania dokumentów
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
pdf.LoadFromFile(path) |
PdfDocument.FromFile(path) |
pdf.LoadFromStream(stream) |
PdfDocument.FromStream(stream) |
pdf.LoadFromByteArray(bytes) |
new PdfDocument(bytes) / PdfDocument.FromBinaryData(bytes) |
Mapowania generowania plików PDF
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
Ciąg HTML: zapis do tymczasowego pliku, następnie converter.LoadFromFile(path, DocumentFormat.DocumentFormatHTML) + SaveAsPDF(out) |
renderer.RenderHtmlAsPdf(html) |
converter.LoadFromHttp(url) + SaveAsPDF(out) |
renderer.RenderUrlAsPdf(url) |
converter.LoadFromFile(htmlPath, DocumentFormat.DocumentFormatHTML) + SaveAsPDF(out) |
renderer.RenderHtmlFileAsPdf(path) |
Mapowania operacji na dokumentach
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
converter.CombineToPDF(paths, out, PdfConformance.PDF) |
PdfDocument.Merge(pdfs) |
pdf.GetPageCount() |
pdf.PageCount |
pdf.SaveToFile(path) |
pdf.SaveAs(path) |
pdf.SaveToByteArray(out bytes) |
pdf.BinaryData |
Odwzorowania znaków wodnych
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
pdf.SetFillAlpha(...) + pdf.DrawTextBox(...) na stronę |
pdf.ApplyWatermark(html, rotation, vAlign, hAlign) |
pdf.AddStandardFont(...) + wywołania rysowania |
HTML/CSS w łańcuchu znaków znaku wodnego |
SetFillAlpha(128) (skala bajtów 0–255) |
Znak wodny Opacity 0–100 (int) lub CSS opacity |
pdf.SetTextSize(48) |
CSS font-size: 48px |
Przykłady migracji kodu
Przykład 1: Konwersja HTML do PDF
Before (Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.IO;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent);
using var converter = new GdPictureDocumentConverter();
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
}
}
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.IO;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent);
using var converter = new GdPictureDocumentConverter();
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
}
}
Imports GdPicture14
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent)
Using converter As New GdPictureDocumentConverter()
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
End Using
End Sub
End Class
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 GdPicture wymaga kilku dodatkowych kroków: loader HTML jest oparty na plikach/URL, więc w pierwszej kolejności ciąg HTML w pamięci musi być zarejestrowany na dysku, następnie wywoływane jest converter.LoadFromFile(...) z DocumentFormat.DocumentFormatHTML, a następnie SaveAsPDF. Renderowanie HTML opiera się na systemowo zainstalowanym Chrome lub Edge (lub na przenośnej ścieżce dostarczonej przez SetWebBrowserPath).
IronPDF akceptuje łańcuch HTML bezpośrednio. Stwórz ChromePdfRenderer, wywołaj RenderHtmlAsPdf() i zapisz z SaveAs(). Brak pliku tymczasowego, brak zależności od przeglądarki gospodarza —IronPDF dostarcza własny wbudowany Chromium. Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: Łączenie wielu plików PDF
Before (Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.Collections.Generic;
class Program
{
static void Main()
{
IEnumerable<string> sourceFiles = new List<string>
{
"document1.pdf",
"document2.pdf"
};
using var converter = new GdPictureDocumentConverter();
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF);
}
}
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.Collections.Generic;
class Program
{
static void Main()
{
IEnumerable<string> sourceFiles = new List<string>
{
"document1.pdf",
"document2.pdf"
};
using var converter = new GdPictureDocumentConverter();
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF);
}
}
Imports GdPicture14
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim sourceFiles As IEnumerable(Of String) = New List(Of String) From {
"document1.pdf",
"document2.pdf"
}
Using converter As New GdPictureDocumentConverter()
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF)
End Using
End Sub
End Class
Po (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
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;
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
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
Scalanie GdPicture przyjmuje ścieżkowy IEnumerable<string> przez converter.CombineToPDF, z wartością PdfConformance wybierającą poziom zgodności wyjściowej.
IronPDF działa na poziomie dokumentu: załaduj każdy PDF z PdfDocument.FromFile(), scal z metodą statyczną PdfDocument.Merge() i zapisz. Dokumenty można przekazywać bezpośrednio lub jako wyliczenie. Dowiedz się więcej o łączeniu i dzieleniu plików PDF.
Przykład 3: Dodawanie znaków wodnych
Before (Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
class Program
{
static void Main()
{
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("document.pdf");
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint);
var font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold);
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
pdf.SetFillAlpha(128); // ~50% (0..255)
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
}
pdf.SaveToFile("watermarked.pdf");
}
}
// NuGet: Install-Package GdPicture
using GdPicture14;
class Program
{
static void Main()
{
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("document.pdf");
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint);
var font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold);
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
pdf.SetFillAlpha(128); // ~50% (0..255)
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
}
pdf.SaveToFile("watermarked.pdf");
}
}
Imports GdPicture14
Class Program
Shared Sub Main()
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("document.pdf")
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint)
Dim font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold)
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
pdf.SetFillAlpha(128) ' ~50% (0..255)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
Next
pdf.SaveToFile("watermarked.pdf")
End Using
End Sub
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>",
45,
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>",
45,
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>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
Ten przykład podkreśla fundamentalną różnicę architektoniczną. GdPicture używa podejścia proceduralnego do wywołań rysowania: dodaj standardową czcionkę, następnie iteruj (bazując na 1) przez każdą stronę wywołując SelectPage, SetFillAlpha, SetTextSize, SetOriginRotationInDegrees, i DrawTextBox. Alfa jest na skali bajtowej 0–255, rotacja jest ustawiana jako właściwość stanu grafiki, a pozycjonowanie jest obsługiwane przez jawne współrzędne.
IronPDF używa podejścia opartego na HTML: metoda ApplyWatermark() akceptuje ciąg HTML z CSS stylingiem i stosuje go do wszystkich stron w jednym wywołaniu. Kontroluj wygląd poprzez znane właściwości CSS (color, opacity, font-size) zamiast podstawowych wywołań graficznych. To podejście wspiera również bogatsze treści — gradienty, obrazy i bardziej złożone układy — w tym samym łańcuchu. Zaawansowane przykłady można znaleźć w dokumentacji dotyczącej znaków wodnych.
Ważne uwagi dotyczące migracji
Powierzchnia wejściowa HTML
Loader HTML GdPicture jest oparty na plikach/URL;IronPDF akceptuje łańcuch HTML bezpośrednio:
// Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html);
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
//IronPDF(string -> PDF):
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html);
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
//IronPDF(string -> PDF):
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html)
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
' IronPDF(string -> PDF):
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Jeśli potrzebujesz operacji asynchronicznych,IronPDF oferuje asynchroniczne warianty jak RenderHtmlAsPdfAsync().
Zależność od przeglądarki zewnętrznej
Renderer HTML GdPicture polega na systemowej instalacji Chrome lub Edge (lub przenośnej ścieżce ustawionej przez SetWebBrowserPath).IronPDF dostarcza własny wbudowany Chromium:
// Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath(@"C:\Tools\chrome\chrome.exe");
// IronPDF: nothing to configure
var pdf = renderer.RenderHtmlAsPdf(html);
// Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath(@"C:\Tools\chrome\chrome.exe");
// IronPDF: nothing to configure
var pdf = renderer.RenderHtmlAsPdf(html);
' Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath("C:\Tools\chrome\chrome.exe")
' IronPDF: nothing to configure
Dim pdf = renderer.RenderHtmlAsPdf(html)
Zmiana wzorca konfiguracji
GdPicture ujawnia ustawienia układu jako wartości właściwości na konwerterze (szerokość/wysokość strony HTML w calach, indywidualne marginesy).IronPDF grupuje je na torbie RenderingOptions z nazwanymi rozmiarami papieru:
// Nutrient .NET SDK: properties on the converter (inches)
using var converter = new GdPictureDocumentConverter();
converter.HtmlPageWidth = 8.27f; // A4 width (inches)
converter.HtmlPageHeight = 11.69f; // A4 height (inches)
converter.HtmlMarginTop = 0.78f;
converter.HtmlMarginBottom = 0.78f;
converter.HtmlMarginLeft = 0.78f;
converter.HtmlMarginRight = 0.78f;
// IronPDF: properties on RenderingOptions (millimetres)
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 .NET SDK: properties on the converter (inches)
using var converter = new GdPictureDocumentConverter();
converter.HtmlPageWidth = 8.27f; // A4 width (inches)
converter.HtmlPageHeight = 11.69f; // A4 height (inches)
converter.HtmlMarginTop = 0.78f;
converter.HtmlMarginBottom = 0.78f;
converter.HtmlMarginLeft = 0.78f;
converter.HtmlMarginRight = 0.78f;
// IronPDF: properties on RenderingOptions (millimetres)
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 GdPicture14
Imports IronPdf
' Nutrient .NET SDK: properties on the converter (inches)
Using converter As New GdPictureDocumentConverter()
converter.HtmlPageWidth = 8.27F ' A4 width (inches)
converter.HtmlPageHeight = 11.69F ' A4 height (inches)
converter.HtmlMarginTop = 0.78F
converter.HtmlMarginBottom = 0.78F
converter.HtmlMarginLeft = 0.78F
converter.HtmlMarginRight = 0.78F
End Using
' IronPDF: properties on RenderingOptions (millimetres)
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)
Proceduralne znaki wodne na znaki wodne HTML
Zastąp prymitywne wywołania rysunku jednym łańcuchem HTML/CSS:
// Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128);
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128);
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
' Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)
Obsługa numerów stron
GdPicture nie ma modelu nagłówka/stopki z klasy pierwszej — numery stron są rysowane na stronę w pętli.IronPDF eksponuje wbudowane zastępniki {page} / {total-pages}:
// Nutrient .NET SDK: per-page DrawText loop (1-based)
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
pdf.SelectPage(i);
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}");
}
// IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};
// Nutrient .NET SDK: per-page DrawText loop (1-based)
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
pdf.SelectPage(i);
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}");
}
// IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};
' Nutrient .NET SDK: per-page DrawText loop (1-based)
For i As Integer = 1 To pdf.GetPageCount()
pdf.SelectPage(i)
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}")
Next
' IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "Page {page} of {total-pages}"
}
Indeksowanie stron
GdPicture ma bazę 1 (SelectPage(1) jest pierwszą stroną).IronPDFpdf.Pages i pdf.RemovePages(int) są bazowane na 0. Off-by-one to najczęstszy błąd przeniesienia:
// Nutrient .NET SDK (1-based):
pdf.SelectPage(1);
pdf.DeletePage();
//IronPDF(0-based):
pdf.RemovePages(0);
// Nutrient .NET SDK (1-based):
pdf.SelectPage(1);
pdf.DeletePage();
//IronPDF(0-based):
pdf.RemovePages(0);
' Nutrient .NET SDK (1-based):
pdf.SelectPage(1)
pdf.DeletePage()
' IronPDF(0-based):
pdf.RemovePages(0)
Rozwiązywanie problemów
Problem 1: GdPictureDocumentConverter nie znaleziono
Problem: Klasa GdPictureDocumentConverter nie istnieje w IronPDF.
Rozwiązanie: Użyj ChromePdfRenderer dla HTML/URL → PDF:
// Nutrient .NET SDK
using var converter = new GdPictureDocumentConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
// Nutrient .NET SDK
using var converter = new GdPictureDocumentConverter();
// IronPDF
var renderer = new ChromePdfRenderer();
Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using converter As New GdPictureDocumentConverter()
' Your code here
End Using
' IronPDF
Dim renderer As New ChromePdfRenderer()
Problem 2: GdPicturePDF nie znaleziono
Problem: Klasa GdPicturePDF nie istnieje w IronPDF.
Rozwiązanie: Użyj PdfDocument:
// Nutrient .NET SDK
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("input.pdf");
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");
// Nutrient .NET SDK
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("input.pdf");
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");
Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("input.pdf")
End Using
' IronPDF
Dim pdfDocument = PdfDocument.FromFile("input.pdf")
Problem 3: DrawTextBox / SetFillAlpha nie znaleziono
Problem: Prymitywne wywołania rysunku nie istnieją w IronPDF.
Rozwiązanie: Użyj znaków wodnych opartych na HTML:
// Nutrient .NET SDK
pdf.SetFillAlpha(128);
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
// Nutrient .NET SDK
pdf.SetFillAlpha(128);
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);
' Nutrient .NET SDK
pdf.SetFillAlpha(128)
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)
Problem 4: CombineToPDF nie znaleziono
Problem: Metoda scalania oparta na ścieżce nie istnieje.
Rozwiązanie: Załaduj każdy PDF jako PdfDocument i użyj statycznego PdfDocument.Merge():
// Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
// Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
' Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF)
' IronPDF
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
Kwestia 5: Indeksowanie strony o jeden mniej
Problem: GdPicture używa indeksów stron opartych na indeksie 1;IronPDF używa indeksów opartych na indeksie 0. Bezpośrednie porty SelectPage(1) do pdf.Pages[1] pomijają pierwszą stronę.
Rozwiązanie: Odejmij jeden przy przenoszeniu indeksów stron:
// Nutrient .NET SDK (first page)
pdf.SelectPage(1);
//IronPDF(first page)
var firstPage = pdf.Pages[0];
// Nutrient .NET SDK (first page)
pdf.SelectPage(1);
//IronPDF(first page)
var firstPage = pdf.Pages[0];
' Nutrient .NET SDK (first page)
pdf.SelectPage(1)
' IronPDF(first page)
Dim firstPage = pdf.Pages(0)
Lista kontrolna migracji
Przed migracją
- Skataloguj wszystkie użycia GdPicture / PSPDFKit / Nutrient w bazie kodu
- Zwróć uwagę na indeksowanie stron:bazujący na 1vsbazujący na 0w istniejącym kodzie GdPicture
- Ustaw konfigurację listy na
GdPictureDocumentConverter(rozmiary stron HTML, marginesy) - Zidentyfikuj proceduralne rysowanie dla znaków wodnych i nagłówków (
SetFillAlpha,DrawTextBox) - Przejrzyj kod pól formularzy, który korzysta z dostępu indeksowanego (
GetFormFieldName(i)) - Uzyskaj klucz licencyjny IronPDF
Zmiany w pakiecie
- Usuń pakiet
GdPictureNuGet (iGdPicture.WPF/GdPicture.WinFormsjeśli są obecne) - Usuń pakiet dziedzictwa
PSPDFKit.NETjeśli jest obecny - Zainstaluj pakiet
IronPdfNuGet:dotnet add package IronPdf - Zaktualizuj importy przestrzeni nazw (
using GdPicture14;→using IronPdf;)
Zmiany w kodzie
- Dodaj konfigurację klucza licencyjnego podczas uruchamiania
- Zamień
new GdPictureDocumentConverter()nanew ChromePdfRenderer()dla HTML/URL → PDF - Zamień
new GdPicturePDF()+LoadFromFilenaPdfDocument.FromFile() - Zamień
converter.CombineToPDF(paths, ...)naPdfDocument.Merge() - Przekształć proceduralne wywołania rysowania znaku wodnego na
pdf.ApplyWatermark(html, ...) - Zamień właściwości konwertera na
RenderingOptions(nazwane rozmiary papieru, marginesy mm) - Zaktualizuj nagłówki/stopki do
HtmlHeaderFooterz tokenami{page}/{total-pages} - Przekształć indeksy stronbazujący na 1nabazujący na 0w całym kodzie
Po migracji
- Usuń zależność systemowej Chrome / Edge z obrazów wdrożeniowych, jeśli była tylko dla GdPicture
- 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

