Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer de PDFreactor à IronPDF en C#

La migration de PDFreactorversIronPDFélimine les dépendances Java et l'infrastructure du serveur tout en offrant des capacités équivalentes de conversion de HTML en PDF par le biais d'une bibliothèque .NET native. Ce guide fournit un chemin de migration complet, étape par étape, qui remplace votre architecture de serveur basée sur Java par une bibliothèque en cours de traitement qui s'intègre de manière transparente dans les applications .NET.

Pourquoi migrer de PDFreactorà IronPDF

Comprendre PDFreactor

PDFreactor est un puissant serveur de conversion HTML-PDF qui s'intègre à diverses plateformes. En tant que solution commerciale, PDFreactors'appuie sur sa technologie propriétaire pour convertir le contenu HTML et CSS en documents PDF de haute qualité. Parmi ses attributs notables, PDFreactorprend en charge un large éventail de propriétés CSS, ce qui en fait un candidat de choix pour le rendu de mises en page complexes.

Toutefois, la dépendance de PDFreactorà l'égard de Java pose certains problèmes dans les environnements .NET, où sa nature non native peut compliquer le déploiement et l'intégration. Sa dépendance à l'égard de Java entraîne une surcharge dans les applications .NET, ce qui nécessite souvent un travail d'intégration supplémentaire.

Le problème de la dépendance de Java

L'architecture de PDFreactorpose plusieurs problèmes dans les environnements .NET :

  1. Environnement d'exécution Java requis : nécessite l'installation de JRE/JDK sur tous les serveurs.

  2. Architecture serveur : Fonctionne comme un service distinct nécessitant une infrastructure supplémentaire. En tant que solution basée sur un serveur, PDFreactornécessite des appels à l'API REST pour chaque conversion.

  3. Déploiement complexe : la gestion des dépendances Java dans un écosystème principalement .NET peut compliquer la configuration et augmenter les coûts de maintenance. Deux runtimes (Java + .NET) à gérer dans les pipelines CI/CD.

  4. Communication inter-processus : la communication via API REST ou socket ajoute de la latence. Chaque conversion PDF nécessite un aller-retour HTTP vers le serveur.

  5. Gestion séparée des licences : Licence liée à l'instance du serveur, et non à l'application. Licence par serveur liée à l'instance de service Java.

  6. Isolation des ressources : Gestion séparée de la mémoire et du processeur. Serveur supplémentaire à surveiller, à mettre à l'échelle et à entretenir.

Comparaison PDFreactorvs IronPDF

Caractéristique/aspect PDFreactor IronPDF
Bibliothèque native .NET Non (basé sur Java) Oui
Runtime Java (serveur externe) Natif .NET(en cours)
Architecture Service API REST Bibliothèque NuGet
Déploiement Java + configuration du serveur Paquet NuGet unique
Dépendances JRE + client HTTP Autonome
Latence Aller-retour sur le réseau Appels de méthode directs
Capacité multiplateforme Oui (dépendant de Java) Oui (Chromium inclus)
Support CSS Prise en charge avancée de CSS3, CSS Paged Media Prise en charge complète de HTML5/CSS3
Complexité du déploiement Plus complexe en raison de Java Simple, s'intègre directement à .NET
Fonctionnalités de manipulation du PDF Basique (Génération uniquement) Extensif, incluant la fusion, le fractionnement, l'édition et l'annotation

Contrairement à PDFreactor,IronPDFse présente comme une bibliothèque native .NET, spécialement conçue pour s'intégrer de manière transparente dans les projets .NET sans dépendances externes comme Java.IronPDFutilise un moteur de rendu Chromium intégré, ce qui lui permet de convertir HTML en PDF avec seulement quelques lignes de code.

Pour les équipes qui prévoient l'adoption de .NET 10 et C# 14 d'ici 2025 et 2026,IronPDFfournit une solution native .NET qui élimine la complexité du serveur Java tout en offrant une gestion complète du cycle de vie des PDF.


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

Modifications du paquet NuGet

# Remove PDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64

# Stop PDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor

# Install IronPDF
dotnet add package IronPdf
# Remove PDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64

# Stop PDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuration de la licence

PDFreactor (sur serveur):

// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");
// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");
$vbLabelText   $csharpLabel

IronPDF (niveau application):

// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
$vbLabelText   $csharpLabel

Identifier l'utilisation de PDFreactor

# Find PDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .

# Find CSS Paged Mediarules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .
# Find PDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .

# Find CSS Paged Mediarules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .
SHELL

Référence API complète

Modifications de l'espace de nommage

// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
$vbLabelText   $csharpLabel

Mappages de classes de base

PDFreactor IronPDF Notes
PDFreactor ChromePdfRenderer Principale classe de conversion
Configuration ChromePdfRenderOptions Paramètres PDF
Résultat Document PDF Document de sortie
config.Document = html renderer.RenderHtmlAsPdf(html) Entrée HTML
result.Document (byte[]) pdf.BinaryData Octets bruts

Mappages de propriétés de configuration

Configuration de PDFreactor Options de rendu IronPDF Notes
config.Document = html renderer.RenderHtmlAsPdf(html) Contenu HTML
config.Document = url renderer.RenderUrlAsPdf(url) Conversion d'URL
config.PageFormat = PageFormat.A4 RenderingOptions.PaperSize = PdfPaperSize.A4 Taille du papier
config.PageOrientation RenderingOptions.PaperOrientation Orientation
config.PageMargins RenderingOptions.MarginTop/Bottom/Left/Right Marges (mm)
config.EnableJavaScript = true RenderingOptions.EnableJavaScript = true Exécution JS
config.AddUserStyleSheet(css) Intégrer CSS dans HTML Injection CSS
config.Title pdf.MetaData.Title Métadonnées
config.Encryption pdf.SecuritySettings Sécurité

Nouvelles fonctionnalités non disponibles dans PDFreactor

Fonctionnalité d'IronPDF Description du projet
PdfDocument.Merge() Fusionner plusieurs PDF
pdf.ApplyWatermark() Ajouter des filigranes
pdf.ExtractAllText() Extraction de texte
pdf.Form Remplissage de formulaires
pdf.Sign() Signatures numériques

Exemples de migration de code

Exemple 1 : Conversion d'une chaîne HTML en fichier PDF

Avant (PDFreactor):

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

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

        Configuration config = new Configuration();
        config.Document = html;

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("output.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

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

        Configuration config = new Configuration();
        config.Document = html;

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("output.pdf", result.Document);
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

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

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

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

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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

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

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

La différence fondamentale réside dans le modèle architectural. PDFreactornécessite la création d'une instance PDFreactor(qui se connecte au serveur Java), d'un objet Configurationséparé pour contenir les paramètres et le contenu HTML, l'appel à Convert() qui renvoie un objet Result, et enfin l'écriture des octets result.Document dans un fichier en utilisant File.WriteAllBytes().

IronPDF simplifie cela en créant un ChromePdfRenderer, en appelant RenderHtmlAsPdf() directement avec la chaîne HTML, et en utilisant la méthode intégrée SaveAs() sur le Document PDFretourné. Pas de connexion au serveur, pas d'objet de configuration, pas de manipulation manuelle d'octets. Consultez la documentation HTML vers PDF pour des exemples complets.

Exemple 2 : Conversion d'une URL en PDF

Avant (PDFreactor):

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

        Configuration config = new Configuration();
        config.Document = "https://www.example.com";

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("webpage.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

        Configuration config = new Configuration();
        config.Document = "https://www.example.com";

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("webpage.pdf", result.Document);
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

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

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

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        pdf.SaveAs("webpage.pdf");
    }
}
$vbLabelText   $csharpLabel

PDFreactor utilise la même propriété config.Document pour les chaînes HTML et les URL, en déterminant automatiquement le type.IronPDFfournit des méthodes explicites : RenderHtmlAsPdf() pour les chaînes HTML et RenderUrlAsPdf() pour les URL. Cette approche explicite améliore la clarté du code et la prise en charge IntelliSense. Pour en savoir plus, consultez nos tutoriels.

Exemple 3 : En-têtes et pieds de page avec numéros de page

Avant (PDFreactor):

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        Configuration config = new Configuration();
        config.Document = html;
        config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("document.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        Configuration config = new Configuration();
        config.Document = html;
        config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("document.pdf", result.Document);
    }
}
$vbLabelText   $csharpLabel

Après (IronPDF):

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

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

        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Header Text"
        };

        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

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

        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Header Text"
        };

        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("document.pdf");
    }
}
$vbLabelText   $csharpLabel

Cet exemple illustre la différence syntaxique la plus importante. PDFreactorutilise la syntaxe CSS Paged Mediaavec les règles @page, les régions @top-center/@bottom-center et counter(page) pour les numéros de page injectés via AddUserStyleSheet().

IronPDF utilise une API .NET native avec des objets TextHeaderFooter attribués à RenderingOptions.TextHeader et RenderingOptions.TextFooter. Les numéros de page utilisent le caractère générique {page} au lieu du CSS counter(page). Notez qu'IronPDF nécessite également l'importation de l'espace de noms IronPdf.Rendering pour les classes d'en-tête/pied de page.


Notesde migration essentielles

Aucun serveur n'est nécessaire

IronPDF fonctionne en cours de processus - pas de serveur Java à configurer :

// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");

// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");

// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

CSS Paged MediaversIronPDFAPI

Remplacer les règles CSS @page par RenderingOptions :

// PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter 
{ 
    CenterText = "Page {page}" 
};
// PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter 
{ 
    CenterText = "Page {page}" 
};
$vbLabelText   $csharpLabel

Syntaxe de l'espace réservé au numéro de page

// PDFreactorCSS: counter(page)
// IronPDF: {page}

// PDFreactorCSS: counter(pages)  
// IronPDF: {total-pages}
// PDFreactorCSS: counter(page)
// IronPDF: {page}

// PDFreactorCSS: counter(pages)  
// IronPDF: {total-pages}
$vbLabelText   $csharpLabel

Modification du traitement des résultats

Le modèle Configuration + Result devient un PdfDocument direct :

// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);

// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;
// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);

// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;
$vbLabelText   $csharpLabel

Modification des unités de marge

PDFreactor utilise des chaînes de caractères ;IronPDFutilise des millimètres :

// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4  // 1 inch in mm
// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4  // 1 inch in mm
$vbLabelText   $csharpLabel

Nouvelles capacités après la migration

Après avoir migré vers IronPDF, vous bénéficiez de fonctionnalités que PDFreactorne peut pas vous offrir :

Fusion de fichiers PDF

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

Marques de fond

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
$vbLabelText   $csharpLabel

Extraction de texte

string text = pdf.ExtractAllText();
string text = pdf.ExtractAllText();
$vbLabelText   $csharpLabel

Protection par mot de passe

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
$vbLabelText   $csharpLabel

Résumé de la comparaison des fonctionnalités

Fonction PDFreactor IronPDF
HTML vers PDF
URL vers PDF
En-têtes/Pieds de page CSS Paged Media API native
Paramètres de la page
Support JavaScript
Natif .NET
En cours
Fusionner des PDF
Diviser les PDF
Filigranes
Extraction de texte
Remplissage de formulaires
Signatures numériques

Liste de contrôle de la migration

Pré-migration

  • Recenser toutes les utilisations de PDFreactordans le code source
  • Documenter toutes les règles CSS Paged Mediautilisées
  • Notez tous les paramètres de configuration (marges, taille de la page, JavaScript)
  • Planifier le stockage de la clé de licenceIronPDF(variables d'environnement recommandées)
  • Commencez par tester avec une licence d'essai IronPDF.

Modifications du paquet

  • Supprimer le package NuGet PDFreactor.NET
  • Supprimer le package NuGet PDFreactor.Native.Windows.x64
  • Installez le package NuGet IronPdf : dotnet add package IronPdf

Modifications du code

  • Mise à jour des importations d'espace de noms ( using RealObjects.PDFreactor;using IronPdf; )
  • Ajoutez using IronPdf.Rendering; pour les classes d'en-tête/de pied de page
  • Remplacez la classe PDFreactorpar ChromePdfRenderer
  • Convertir les objets Configurationen propriétés RenderingOptions
  • Remplacez config.Document = htmlpar renderer.RenderHtmlAsPdf(html)
  • Remplacez config.Document = urlpar renderer.RenderUrlAsPdf(url)
  • Remplacez File.WriteAllBytes(path, result.Document) par pdf.SaveAs(path)
  • Convertir les règles CSS @page en objets TextHeader / TextFooter
  • Mettre à jour les espaces réservés aux numéros de page ( counter(page){page} )
  • Convertir les unités de marge de chaînes de caractères en millimètres

Migration des infrastructures

  • Supprimer l'exigence d'exécution Java
  • Mise hors service du serveur PDFreactor
  • Mettre à jour les configurations Docker/de déploiement
  • Mise à jour des pipelines CI/CD

Après la migration

  • Testez la qualité de la sortie PDF en fonction des attentes
  • Vérifier l'affichage de l'en-tête et du pied de page
  • Vérifier l'exécution de JavaScript si elle est utilisée
  • Ajouter de nouvelles fonctionnalités (fusion, filigranes, sécurité) selon les besoins

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