Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer de Ghostscript GPL à IronPDF en C#

La migration de Ghostscript GPLversIronPDFtransforme votre flux de travail PDF .NET, qui passe du lancement de processus en ligne de commande et de la manipulation de commutateurs à base de chaînes à une API native .NET sécurisée et dotée d'IntelliSense. Ce guide fournit un chemin de migration complet, étape par étape, qui élimine les problèmes de licence AGPL et les dépendances binaires externes pour les développeurs .NET professionnels.

Pourquoi passer de Ghostscript GPLà IronPDF

Les défis de la licence GPL de Ghostscript

Ghostscript GPL est un interprète PostScript/PDF vénérable qui a des décennies d'histoire, mais son utilisation dans les applications .NET modernes présente des défis importants :

  1. Restrictions de la licence AGPL : La licence AGPL de Ghostscript GPLvous oblige à publier votre code source si vous distribuez un logiciel qui l'utilise, à moins d'acheter une licence commerciale coûteuse auprès d'Artifex. Ce modèle de licence "virale" crée un risque juridique important pour les applications propriétaires.

  2. Interface en ligne de commande : Ghostscript GPLest fondamentalement un outil en ligne de commande. Pour l'utiliser à partir de C#, il faut lancer des processus, passer des arguments de chaîne et analyser la sortie - une approche fragile et sujette aux erreurs.

  3. Dépendance binaire externe : vous devez installer Ghostscript GPLséparément, gérer les variables PATH et assurer la compatibilité des versions dans tous les environnements de déploiement. Des DLL différentes sont nécessaires pour les versions 32 bits et 64 bits (gsdll32.dll vs gsdll64.dll).

  4. Pas de conversion native HTML vers PDF : Ghostscript GPLne peut pas convertir directement le HTML en PDF. Vous devez d'abord convertir HTML en PostScript à l'aide d'un autre outil, puis utiliser Ghostscript GPLpour convertir PostScript en PDF - un processus en plusieurs étapes avec des dépendances externes.

  5. Syntaxe de commutateur complexe : les opérations sont contrôlées via des commutateurs de ligne de commande cryptiques comme -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=... . Pas d'IntelliSense, pas de sécurité de type, et facile de faire des fautes de frappe.

  6. Gestion des erreurs : Les erreurs arrivent via stderr sous forme de chaînes de caractères, nécessitant une analyse syntaxique plutôt qu'une gestion structurée des exceptions.

  7. Surcharge de gestion des processus : Chaque opération génère un processus distinct, ce qui ajoute de la surcharge et de la complexité pour la gestion des erreurs, les délais d'attente et le nettoyage des ressources.

Comparaison entre Ghostscript GPLet IronPDF

Aspect Ghostscript GPL IronPDF
Licence AGPL (virale) ou commerciale onéreuse Commercial avec des termes clairs
Intégration Lancement d'un processus en ligne de commande Bibliothèque native .NET
Conception de l'API Commutateurs à base de chaînes API typée et dotée d'IntelliSense
Gestion des erreurs Analyse du texte stderr exceptions .NET
HTML vers PDF Non pris en charge (besoin d'outils externes) Moteur Chromium intégré
Dépendances Installation binaire externe Paquet NuGet autonome
Déploiement Configurer le PATH, copier les DLL Il suffit d'ajouter une référence NuGet
Sécurité des fils Isolation du processus uniquement Sécurité des threads dès la conception
.NET moderne Soutien limité Prise en charge complète de .NET 6/7/8/9/10
Prise en charge de l'asynchronisme Basé sur le processus Async/await natif

Pour les équipes qui prévoient d'adopter .NET 10 et C# 14 jusqu'en 2025 et 2026,IronPDFconstitue une base à l'épreuve du temps qui s'intègre nativement aux modèles .NET modernes.


Évaluation de la complexité de la migration

Estimation de l'effort par fonctionnalité

Fonction Complexité de la migration Notes
PDF vers images Faible Mappage direct de l'API
Fusionner des PDF Faible Plus simple avec IronPDF
Compresser le PDF Faible Options intégrées
Optimisation PDF Faible Une approche différente
Chiffrement Moyen Différentes API
Extraction de pages Faible 0-indexé vs 1-indexé
PostScript vers PDF Moyenne-élevée Convertissez d'abord PS → PDF
Commutateurs personnalisés Moyenne-élevée Recherche de fonctionnalités équivalentes

Changement de paradigme

Le changement fondamental de cette migration vers la licence GPL de Ghostscript réside dans le passage de l'exécution de processus en ligne de commande aux appels d'API .NET typés :

Ghostscript GPL :  "Transmettre ces chaînes de caractères à un processus externe"
IronPDF :          "Appeler ces méthodes sur des objets .NET"

Avant de commencer

Prérequis

  1. Version .NET :IronPDFprend en charge .NET Framework 4.6.2+ et .NET Core 2.0+ / .NET 5/6/7/8/9+.
  2. Clé de licence : Obtenez votre clé de licenceIronPDFsur ironpdf.com
  3. Sauvegarde : Créer une branche pour les travaux de migration

Identifier toutes les utilisations de Ghostscript sous licence GPL

# Find all Ghostscript.NET references
grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" .

# Find direct process calls to Ghostscript
grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" .

# Find package references
grep -r "Ghostscript" --include="*.csproj" .
# Find all Ghostscript.NET references
grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" .

# Find direct process calls to Ghostscript
grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" .

# Find package references
grep -r "Ghostscript" --include="*.csproj" .
SHELL

Modifications du paquet NuGet

# Remove Ghostscript.NET
dotnet remove package Ghostscript.NET

# Install IronPDF
dotnet add package IronPdf
# Remove Ghostscript.NET
dotnet remove package Ghostscript.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

Supprimer les dépendances GPL de Ghostscript

Après la migration :

  • Désinstaller Ghostscript GPLdes serveurs
  • Supprimer gsdll32.dll / gsdll64.dll des déploiements
  • Supprimer la configuration PATH pour Ghostscript GPL
  • Supprimer toutes les références à GhostscriptVersionInfo

Migration rapide

Étape 1 : Mise à jour de la configuration de la licence

Avant (Ghostscript GPL):

Ghostscript GPL sous AGPL nécessite soit la divulgation du code source, soit une licence commerciale onéreuse auprès d'Artifex.

Après (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
$vbLabelText   $csharpLabel

Étape 2 : mise à jour des importations de l'espace de noms

// Before (Ghostscript GPL)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;

// After (IronPDF)
using IronPdf;
// Before (Ghostscript GPL)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;

// After (IronPDF)
using IronPdf;
$vbLabelText   $csharpLabel

Référence API complète

Mappage des classes de base

Ghostscript.NET IronPDF Description du projet
GhostscriptProcessor Diverses méthodes PdfDocument Traitement PDF
GhostscriptRasterizer PdfDocument.ToBitmap() / RasterizeToImageFiles() PDF vers images
GhostscriptVersionInfo N/A (pas nécessaire) Emplacement de la DLL
GhostscriptStdIO N/A (utiliser les exceptions) Traitement des E/S
Processus + ligne de commande ChromePdfRenderer HTML vers PDF

Mappage des commutateurs de ligne de commande

Ghostscript GPLSwitch Équivalent d'IronPDF Description du projet
-dNOPAUSE N/A (pas nécessaire) Ne pas faire de pause entre les pages
-dBATCH N/A (pas nécessaire) Quitter après traitement
-dSAFER N/A (par défaut) Accès sécurisé aux fichiers
-sDEVICE=pdfwrite Diverses méthodes PDF PDF de sortie
-sDEVICE=png16m ToBitmap() ou RasterizeToImageFiles() Sortie PNG
-sOutputFile=X SaveAs("X") Nom du fichier de sortie
-r300 Paramètre DPI dans les méthodes Résolution
-dPDFSETTINGS=/ebook CompressImages(quality : 75) Qualité moyenne
-sOwnerPassword=X SecuritySettings.OwnerPassword Mot de passe du propriétaire
-sUserPassword=X SecuritySettings.UserPassword Mot de passe utilisateur

Exemples de migration de code

Exemple 1 : Conversion HTML vers PDF

Avant (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;

class GhostscriptExample
{
    static void Main()
    {
        // Ghostscript cannot directly convert HTML to PDF
        // You need to first convert HTML to PS/EPS using another tool
        // then use Ghostscript to convert PS to PDF

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        string psFile = "temp.ps";
        string outputPdf = "output.pdf";

        // This is a workaround - Ghostscript primarily works with PostScript
        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}",
            psFile
        };

        processor.Process(switches.ToArray());
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;

class GhostscriptExample
{
    static void Main()
    {
        // Ghostscript cannot directly convert HTML to PDF
        // You need to first convert HTML to PS/EPS using another tool
        // then use Ghostscript to convert PS to PDF

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        string psFile = "temp.ps";
        string outputPdf = "output.pdf";

        // This is a workaround - Ghostscript primarily works with PostScript
        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}",
            psFile
        };

        processor.Process(switches.ToArray());
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

La différence est flagrante : Ghostscript GPLne peut pas du tout convertir directement HTML en PDF - il faut une conversion PostScript intermédiaire à l'aide d'outils externes. Le ChromePdfRendererd'IronPDF permet une conversion directe de HTML en PDF avec une prise en charge complète de CSS3, JavaScript et des normes web modernes. Voir la documentation HTML vers PDF pour plus d'options de rendu.

Exemple 2 : PDF vers images

Avant (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class GhostscriptExample
{
    static void Main()
    {
        string inputPdf = "input.pdf";
        string outputPath = "output";

        GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");

        using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
        {
            rasterizer.Open(inputPdf, gvi, false);

            for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
            {
                Image img = rasterizer.GetPage(300, pageNumber);
                img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
                img.Dispose();
            }
        }
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class GhostscriptExample
{
    static void Main()
    {
        string inputPdf = "input.pdf";
        string outputPath = "output";

        GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");

        using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
        {
            rasterizer.Open(inputPdf, gvi, false);

            for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
            {
                Image img = rasterizer.GetPage(300, pageNumber);
                img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
                img.Dispose();
            }
        }
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfExample
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var images = pdf.ToBitmap();

        for (int i = 0; i < images.Length; i++)
        {
            images[i].Save($"output_page{i + 1}.png");
        }
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfExample
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var images = pdf.ToBitmap();

        for (int i = 0; i < images.Length; i++)
        {
            images[i].Save($"output_page{i + 1}.png");
        }
    }
}
$vbLabelText   $csharpLabel

L'approche GPL de Ghostscript nécessite la localisation du fichier externe gsdll64.dll, la création d'un objet GhostscriptVersionInfoet l'utilisation de numéros de page indexés par 1. La méthode ToBitmap() d'IronPDF offre une approche propre, en une seule ligne et sans dépendances externes. Notez la différence d'indexation des pages : Ghostscript GPLutilise des pages indexées à 1 alors qu'IronPDF utilise des pages indexées à 0 (convention .NET standard).

Exemple 3 : Fusionner des fichiers PDF

Avant (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;

class GhostscriptExample
{
    static void Main()
    {
        string outputPdf = "merged.pdf";
        string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };

        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}"
        };

        switches.AddRange(inputFiles);

        processor.Process(switches.ToArray());
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;

class GhostscriptExample
{
    static void Main()
    {
        string outputPdf = "merged.pdf";
        string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };

        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}"
        };

        switches.AddRange(inputFiles);

        processor.Process(switches.ToArray());
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class IronPdfExample
{
    static void Main()
    {
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("file1.pdf"),
            PdfDocument.FromFile("file2.pdf"),
            PdfDocument.FromFile("file3.pdf")
        };

        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class IronPdfExample
{
    static void Main()
    {
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("file1.pdf"),
            PdfDocument.FromFile("file2.pdf"),
            PdfDocument.FromFile("file3.pdf")
        };

        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
    }
}
$vbLabelText   $csharpLabel

L'approche de Ghostscript GPLnécessite la mémorisation de la syntaxe des commutateurs (-dNOPAUSE, -dBATCH, -sDEVICE=pdfwrite) et la concaténation des chemins d'accès aux fichiers dans un tableau de chaînes de caractères. La méthode statique Merge d'IronPDF fournit une fusion à sécurité de type, compatible avec IntelliSense, avec des objets PdfDocument appropriés. En savoir plus sur la fusion et la division de PDF.


Notesde migration essentielles

Conversion de l'indexation des pages

L'un des changements les plus importants dans cette migration GPL de Ghostscript est la différence d'indexation des pages :

// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
    Image img = rasterizer.GetPage(300, pageNumber);
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
    images[i].Save($"output_page{i + 1}.png");
}
// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
    Image img = rasterizer.GetPage(300, pageNumber);
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
    images[i].Save($"output_page{i + 1}.png");
}
$vbLabelText   $csharpLabel

Les problèmes liés à la licence AGPL éliminés

La licence AGPL de Ghostscript GPLa des propriétés "virales" qui exigent la divulgation du code source lors de la distribution des applications. La licence commerciale d'IronPDF comporte des termes clairs sans aucune exigence de ce type.

Pas de binaires externes

IronPDF est entièrement autonome. Supprimez-les après la migration :

  • fichiers gsdll32.dll et gsdll64.dll
  • Installation de Ghostscript GPLà partir de serveurs
  • Configurations de la variable d'environnement PATH
  • références GhostscriptVersionInfodans le code

Fichiers PostScript

IronPDF ne gère pas directement les fichiers PostScript (.ps). Si votre flux de travail nécessite un traitement PostScript, soit :

  1. Convertir PostScript en PDF à l'aide d'un autre outil avant le traitement par IronPDF
  2. Convertissez le contenu source en HTML et utilisez le rendu HTML d'IronPDF

Considérations de Performance

Pas de création de processus

Les opérations de Ghostscript GPLgénèrent des processus externes avec les frais généraux associés.IronPDFfonctionne dans le cadre de votre processus .NET :

// Ghostscript GPL: Process spawning overhead
processor.Process(switches.ToArray());  // Creates new OS process

// IronPDF: In-process execution
var merged = PdfDocument.Merge(pdfs);  // Native .NET method call
// Ghostscript GPL: Process spawning overhead
processor.Process(switches.ToArray());  // Creates new OS process

// IronPDF: In-process execution
var merged = PdfDocument.Merge(pdfs);  // Native .NET method call
$vbLabelText   $csharpLabel

Sécurité des threads

IronPDF est de par sa conception à l'épreuve des threads. Plusieurs threads peuvent utiliser ChromePdfRendereret PdfDocument simultanément sans problème de synchronisation.


Liste de contrôle de la migration

Pré-migration

  • Recenser toutes les utilisations de Ghostscript GPLdans le code source
  • Documenter les options de ligne de commande actuellement utilisées
  • Identifier tout traitement PostScript (nécessitant un traitement spécial)
  • Vérifier la conformité de la licence AGPL
  • Obtenir une clé de licence IronPDF
  • Créer une branche de migration dans le système de contrôle de version

Migration de code

  • Supprimer le package NuGet Ghostscript.NET : dotnet remove package Ghostscript.NET
  • Installez le package NuGet IronPdf : dotnet add package IronPdf
  • Supprimer les dépendances binaires externes Ghostscript GPL
  • Supprimer les références GhostscriptVersionInfoet aux DLL
  • Convertir GhostscriptProcessor.Process() en méthodes IronPDF
  • Convertir GhostscriptRasterizeren pdf.ToBitmap()
  • Remplacer les options de ligne de commande par des appels d'API
  • Mise à jour de la gestion des erreurs : passage de l'analyse de stderr à la gestion des exceptions
  • Convertir les numéros de page indexés à 1 en numéros indexés à 0

Essai

  • Test de conversion PDF en image
  • Test de fusion de PDF
  • Extraction de la page de test
  • Tester la qualité de compression
  • Tester la protection par mot de passe
  • Vérifier que la qualité de la production correspond aux attentes
  • Chemins critiques de référence des performances

Déploiement

  • Supprimer Ghostscript GPLdes serveurs
  • Supprimer la configuration PATH
  • Supprimer les fichiers gsdll*.dll des déploiements
  • Vérifier que l'application fonctionne sans Ghostscript GPLinstallé

Après la migration

  • Supprimer la licence GPL de Ghostscript (si commercial)
  • Mise à jour de la documentation
  • Former l'équipe à l'API IronPDF
  • Surveiller la production pour détecter tout problème.

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