Przejdź do treści stopki
PRZEWODNIKI MIGRACJI

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:

  1. 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.

  2. Cennik prowadzony przez dział sprzedaży: Strona nutrient.io/sdk/pricing kieruje do formularza kontaktowego zamiast publikować stawki per-developer, co utrudnia porównanie kosztów dla małych zespołów.

  3. 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 GdPicture NuGet, przestrzeń nazw GdPicture14, z nazwami klas jak GdPicturePDF i GdPictureDocumentConverter, które nie pasują do marki "Nutrient" lub "PSPDFKit".

  4. 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.

  5. Proceduralne API PDF: Znaki wodne składają się z SetFillAlpha, DrawTextBox i 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

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. 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
SHELL

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"
$vbLabelText   $csharpLabel

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" .
SHELL

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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}"
}
$vbLabelText   $csharpLabel

Indeksowanie stron

GdPicture ma bazę 1 (SelectPage(1) jest pierwszą stroną).IronPDFpdf.Pages i pdf.RemovePages(int)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)
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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")
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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 GdPicture NuGet (i GdPicture.WPF / GdPicture.WinForms jeśli są obecne)
  • Usuń pakiet dziedzictwa PSPDFKit.NET jeśli jest obecny
  • Zainstaluj pakiet IronPdf NuGet: dotnet add package IronPdf
  • Zaktualizuj importy przestrzeni nazw (using GdPicture14;using IronPdf;)

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zamień new GdPictureDocumentConverter() na new ChromePdfRenderer() dla HTML/URL → PDF
  • Zamień new GdPicturePDF() + LoadFromFile na PdfDocument.FromFile()
  • Zamień converter.CombineToPDF(paths, ...) na PdfDocument.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 HtmlHeaderFooter z 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

Zwróć uwagęNutrient, PSPDFKit, GdPicture, and ORPALIS są znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest powiązana z, wspierana ani sponsorowana przez Nutrient, PSPDFKit, GdPicture ani ORPALIS. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie