Passer au contenu du pied de page
VIDéOS

Comment signer des fichiers PDF en C# à l'aide d'IronPDF

Migrer de Nutrient (anciennement PSPDFKit) à IronPDF simplifie votre flux de travail PDF .NET en passant d'une boîte à outils large d'imagerie et de PDF à une bibliothèque axée uniquement sur les PDF. L'offre .NET côté serveur de Nutrient est GdPicture.NET — la boîte à outils acquise auprès d'ORPALIS et repositionnée sous le nom de "Nutrient .NET SDK" — qui est fournie sous forme de package NuGet GdPicture sous l'espace de nommage GdPicture14. Ce guide parcourt étape par étape le chemin de migration qui échange la boîte à outils procédurale et multi-fonctionnelle pour une bibliothèque de PDF uniquement avec une surface plus petite.

Pourquoi migrer de Nutrient à IronPDF

Le problème de la surface de la boîte à outils

Nutrient (anciennement PSPDFKit, repensé 23/10/2024) vend une famille multi-produit — Document Engine (microservice Docker), SDK Web, SDKs mobiles, et un SDK .NET côté serveur qui est GdPicture sous le capot. Pour les équipes qui ont besoin d'opérations PDF simples sans le reste de la boîte à outils, la surface se manifeste de plusieurs manières concrètes :

  1. Portée étendue de la boîte à outils : Le SDK .NET couvre les PDF, OCR, codes-barres, numérisation TWAIN, traitement d'image et conversion sur plus de 100 formats de fichiers. Utile si vous avez besoin de cette ampleur - plus de surface qu'un projet uniquement PDF n'a besoin si vous ne le faites pas.

  2. Tarification dirigée par les ventes : La page nutrient.io/sdk/pricing renvoie à un formulaire de contact au lieu de publier des tarifs par développeur, ce qui rend la comparaison des coûts plus difficile pour les petites équipes.

  3. Instabilité de marque et de package : PSPDFKit → Nutrient (23/10/2024), plus l'acquisition de GdPicture, signifie trois noms à suivre dans l'ancien code. Le SDK .NET est toujours fourni sous forme de package NuGet GdPicture, espace de nommage GdPicture14, avec des noms de classes comme GdPicturePDF et GdPictureDocumentConverter qui ne correspondent pas à la marque "Nutrient" ou "PSPDFKit".

  4. Dépendance du navigateur externe pour le HTML-vers-PDF : Le rendu HTML du SDK .NET repose sur un Chrome ou Edge installé sur le système (ou un chemin portable que vous définissez via SetWebBrowserPath).IronPDF expédie son propre Chromium intégré.

  5. API PDF procédurale : Les filigranes composent SetFillAlpha, DrawTextBox, et des marqueurs de calque OCG ; les en-têtes et pieds de page sont dessinés par page dans une boucle. Composer des opérations PDF communes à partir de primitives signifie plus de code par tâche.

Comparaison Nutrient .NET SDK vs IronPDF

Aspect SDK .NET de Nutrient (GdPicture) IronPDF
Portée PDF + OCR + code-barres + numérisation + imagerie Bibliothèque PDF
Tarifs Dirigé par les ventes (contact pour devis) Transparent, publié
Paquet NuGet GdPicture IronPdf
Namespace racine GdPicture14 IronPdf
style API Principalement des appels de dessin synchrones, procéduraux Synchronisation avec option asynchrone, fluide
Rendu HTML Nécessite Chrome/Edge du système Chromium intégré
Indexation de pages basé sur 1 basé sur 0
Utilisateurs cibles Équipes ayant besoin d'imagerie + numérisation + PDF dans une seule boîte à outils Équipes ayant besoin uniquement de PDF

Pour les équipes sur .NET moderne qui n'ont besoin que de PDF,IronPDF offre une base plus petite et centrée sur le PDF qui s'intègre proprement sans les couches supplémentaires d'imagerie/numérisation/OCR.


Avant de commencer

Prérequis

  1. Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Accès à NuGet : possibilité d'installer des packages NuGet
  3. Licence IronPDF : Obtenez votre clé de licence sur IronPDF

Modifications du paquet NuGet

# Remove the SDK .NET de Nutrient (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 the SDK .NET de Nutrient (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

Le SDK Nutrient .NET actuel est distribué sous l'ID NuGet GdPicture (dernière version 14.x, propriétaire ORPALIS — une filiale de Nutrient). L'ancien package marqué PSPDFKit PSPDFKit.NET est progressivement abandonné ; retirez-le s'il est présent.

Configuration de la licence

// 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

Identifiez l'utilisation du SDK .NET Nutrient

# 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

Référence API complète

Mappages d'initialisation

SDK .NET de Nutrient (GdPicture) IronPDF
new GdPicturePDF() new PdfDocument(...) / PdfDocument.FromFile(...)
new GdPictureDocumentConverter() new ChromePdfRenderer()
pdf.Dispose() (IDisposable) pdf.Dispose() (IDisposable)

Mappages de chargement de documents

SDK .NET de Nutrient (GdPicture) IronPDF
pdf.LoadFromFile(path) PdfDocument.FromFile(path)
pdf.LoadFromStream(stream) PdfDocument.FromStream(stream)
pdf.LoadFromByteArray(bytes) new PdfDocument(bytes) / PdfDocument.FromBinaryData(bytes)

Mappages de génération de PDF

SDK .NET de Nutrient (GdPicture) IronPDF
Chaîne HTML : écrire dans un fichier temporaire, puis 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)

Mise en correspondance des opérations sur les documents

SDK .NET de Nutrient (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

Correspondances des filigranes

SDK .NET de Nutrient (GdPicture) IronPDF
pdf.SetFillAlpha(...) + pdf.DrawTextBox(...) par page pdf.ApplyWatermark(html, rotation, vAlign, hAlign)
pdf.AddStandardFont(...) + appels de dessin HTML/CSS dans une chaîne de filigrane
SetFillAlpha(128) (échelle de 0 à 255 octets) Filigrane Opacity 0–100 (int) ou CSS opacity
pdf.SetTextSize(48) CSS font-size: 48px

Exemples de migration de code

Exemple 1 : Conversion HTML vers PDF

Avant (SDK .NET Nutrient / 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

Après (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

L'approche GdPicture nécessite quelques étapes supplémentaires : le chargeur HTML est basé sur des fichiers/URLs, donc une chaîne HTML en mémoire doit d'abord être placée sur le disque, puis converter.LoadFromFile(...) est appelé avec DocumentFormat.DocumentFormatHTML, suivi par SaveAsPDF. Le rendu HTML repose sur un Chrome ou Edge installé sur le système (ou un chemin portable fourni via SetWebBrowserPath).

IronPDF accepte directement la chaîne HTML. Créez un ChromePdfRenderer, appelez RenderHtmlAsPdf(), et enregistrez avec SaveAs(). Pas de fichier temporaire, pas de dépendance sur un navigateur hôte —IronPDF est livré avec son propre Chromium intégré. Voir la documentation HTML vers PDF pour des options de rendu supplémentaires.

Exemple 2 : Fusionner plusieurs PDF

Avant (SDK .NET Nutrient / 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

Après (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

La fusion GdPicture prend un IEnumerable<string> basé sur un chemin via converter.CombineToPDF, avec une valeur PdfConformance sélectionnant le niveau de conformité de sortie.

IronPDF fonctionne au niveau du document : chargez chaque PDF avec PdfDocument.FromFile(), fusionnez avec la méthode statique PdfDocument.Merge(), et enregistrez. Les documents peuvent être passés directement ou sous forme de collection énumérable. En savoir plus sur la fusion et la division de PDF.

Exemple 3 : Ajout de filigranes

Avant (SDK .NET Nutrient / 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

Après (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

Cet exemple met en évidence une différence architecturale fondamentale. GdPicture utilise une approche de dessin procédurale : ajoutez une police standard, puis parcourez (basé sur l'index 1) chaque page en appelant SelectPage, SetFillAlpha, SetTextSize, SetOriginRotationInDegrees, et DrawTextBox. L'alpha est sur une échelle de 0 à 255 octets, la rotation est définie comme une propriété d'état graphique et le positionnement est géré par des coordonnées explicites.

IronPDF utilise une approche basée sur HTML : la méthode ApplyWatermark() accepte une chaîne HTML avec un style CSS et l'applique à toutes les pages en un seul appel. Vous contrôlez l'apparence à l'aide de propriétés CSS familières (color, opacity, font-size) plutôt que des appels graphiques primitifs. Cette approche prend également en charge un contenu plus riche — dégradés, images et mises en page plus complexes — dans la même chaîne. Consultez la documentation sur les filigranes pour des exemples avancés.


Notes de migration essentielles

Surface d'entrée HTML

Le chargeur HTML de GdPicture est basé sur fichier/URL;IronPDF accepte directement les chaînes HTML :

// 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

Si vous avez besoin d'opérations asynchrones,IronPDF propose des variantes asynchrones comme RenderHtmlAsPdfAsync().

Dépendance sur le navigateur externe

Le moteur de rendu HTML de GdPicture repose sur une installation de Chrome ou Edge sur le système (ou sur un chemin portable que vous définissez via SetWebBrowserPath).IronPDF est livré avec son propre Chromium intégré :

// 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

Modification du modèle de configuration

GdPicture expose les paramètres de mise en page comme des valeurs individuelles sur le convertisseur (largeur/hauteur de la page HTML en pouces, marges individuelles).IronPDF les regroupe dans un sac RenderingOptions avec des tailles de papier nommées :

// 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

Marquages procéduraux à marquages HTML

Remplacez les appels de dessin primitifs par une seule chaîne 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

Gestion des numéros de page

GdPicture n'a pas de modèle de pré-en-tête/pied de page de première classe — les numéros de page sont dessinés par page dans une boucle.IronPDF expose des espaces réservés intégrés {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

Indexation des pages

GdPicture est basé sur l'index 1 (SelectPage(1) est la première page).IronPDFpdf.Pages et pdf.RemovePages(int) sont basés sur l'index 0. L'erreur d'une unité est le bogue de portage le plus courant :

// 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

Dépannage

Problème 1 : GdPictureDocumentConverter introuvable

Problème : La classe GdPictureDocumentConverter n'existe pas dans IronPDF.

Solution: Use ChromePdfRenderer for 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

Problème 2 : GdPicturePDF introuvable

Problème : La classe GdPicturePDF n'existe pas dans IronPDF.

Solution: Use 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

Problème 3 : DrawTextBox / SetFillAlpha introuvable

Problème : Les appels de dessins primitifs n'existent pas dans IronPDF.

Solution : Utiliser des filigranes 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

Problème 4 : CombineToPDF introuvable

Problème : Une méthode de combinaison basée sur le chemin n'existe pas.

Solution : Chargez chaque PDF comme un PdfDocument et utilisez PdfDocument.Merge() statique :

// 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

Problème 5 : Index de page décalé d'une unité

Problème : GdPicture utilise des indices de page indexés à partir de 1 ;IronPDF utilise des indices indexés à partir de 0. Les ports directs de SelectPage(1) à pdf.Pages[1] sautent la première page.

Solution : Soustrayez un lors du portage des indices de page :

// 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

Liste de contrôle de la migration

Pré-migration

  • Inventoriez toutes les utilisations de GdPicture / PSPDFKit / Nutrient dans le codebase
  • Notez les indexations de pages de 1 à n contre 0 à n dans le code GdPicture existant
  • Listez la configuration définie sur GdPictureDocumentConverter (dimensions de la page HTML, marges)
  • Identifiez le dessin procédural pour les filigranes et les en-têtes (SetFillAlpha, DrawTextBox)
  • Révisez le code des champs de formulaire qui utilise l'accès basé sur l'index (GetFormFieldName(i))
  • Obtenir une clé de licence IronPDF

Modifications du paquet

  • Supprimez le package NuGet GdPicture (et GdPicture.WPF / GdPicture.WinForms si présent)
  • Supprimez le package obsolète PSPDFKit.NET si présent
  • Installez le package NuGet IronPdf : dotnet add package IronPdf
  • Mettez à jour les imports d'espace de noms (using GdPicture14;using IronPdf;)

Modifications du code

  • Ajouter la configuration de la clé de licence au démarrage
  • Remplacez new GdPictureDocumentConverter() par new ChromePdfRenderer() pour le HTML/URL → PDF
  • Remplacez new GdPicturePDF() + LoadFromFile par PdfDocument.FromFile()
  • Remplacez converter.CombineToPDF(paths, ...) par PdfDocument.Merge()
  • Convertissez les appels de dessin procédural de filigrane en pdf.ApplyWatermark(html, ...)
  • Remplacez les propriétés du convertisseur par RenderingOptions (tailles de papier nommées, marges en mm)
  • Mettez à jour les en-têtes/pieds de page à HtmlHeaderFooter avec les jetons {page} / {total-pages}
  • Convertissez les indices de page de 1 à n en 0 à n partout

Après la migration

  • Retirez la dépendance de Chrome/Edge du système des images de déploiement si elle était là uniquement pour GdPicture
  • Effectuer des tests de régression comparant les résultats PDF
  • Vérifier que les en-têtes et pieds de page correspondent aux numéros de page
  • Test du rendu du filigrane
  • Mise à jour du pipeline CI/CD

  • Inventairez toutes les utilisations de Nutrient / PSPDFKit / GdPicture et ORPALIS dans le code, pour référence Ce site n'est pas affilié, approuvé, ou sponsorisé par Nutrient, PSPDFKit, GdPicture ou ORPALIS. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.)}]
Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi