IRONSOFTWAREHOME
VIDÉOS

Comment rasteriser un PDF en image en C#

Curtis Chau
Curtis Chau
Updated: 19 juillet 2026

La migration de jsreport vers IronPDF transforme votre flux de travail PDF .NET d'un système dépendant de Node.js avec une gestion binaire externe et des processus serveur distincts à une bibliothèque .NET pure qui s'exécute entièrement dans le processus. Ce guide fournit un chemin de migration complet, étape par étape, qui élimine la complexité de l'infrastructure et les exigences de templating JavaScript pour les développeurs .NET professionnels.

Pourquoi migrer de jsreport à IronPDF

Les défis de jsreport

jsreport introduit une complexité qui n'a pas sa place dans un environnement .NET pur :

  1. Dépendance Node.js : nécessite l'environnement d'exécution et les binaires Node.js , ce qui ajoute de la complexité à l'infrastructure de ce qui devrait être une application .NET simple.

  2. Gestion des binaires externes : Doit télécharger et gérer les binaires spécifiques à la plateforme pour Windows, Linux et OSX via des packages NuGet séparés (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. Processus serveur séparé : Fonctionne soit comme une utilité, soit comme un serveur web—une gestion de processus supplémentaire est requise avec StartAsync() et KillAsync() méthodes de cycle de vie.

  4. Modèles JavaScript : Oblige à apprendre Handlebars, JsRender ou d'autres systèmes de modèles JavaScript au lieu d'utiliser les capacités natives de C#.

  5. Structure de demande complexe : Nécessite des objets RenderRequest verbeux avec des configurations imbriquées Template même pour une simple génération de PDF.

  6. Limitations de licence : Le niveau gratuit est limité à 5 modèles par instance ; l'utilisation commerciale au-delà nécessite une licence Enterprise (395 $/an par instance) ou Enterprise Scale (1 295 $/an, libre de droits sur les instances). See jsreport.net/buy.

  7. Sortie basée sur les flux : Renvoie des flux nécessitant des opérations manuelles sur les fichiers et une gestion des flux de mémoire.

jsreport vs IronPDF Comparaison

FonctionjsreportIronPDF
Temps d'exécutionNode.js + .NETPure .NET
Gestion binaireManuel (paquets binaires jsreport)Automatique
Processus de serveurNécessaire (utilitaire ou serveur web)En cours
Création de modèlesJavaScript (guidon, etc.)C# (Razor, interpolation de chaînes)
Style APIObjets de requête verbeuxMéthodes fluides et propres
ProductionFluxObjet PdfDocument
Manipulation de PDFLimitéExtensif (fusionner, diviser, éditer)
Prise en charge de l'asynchronismeAsync uniquementSync et async

Pour les équipes planifiant l'adoption de .NET 10 et C# 14,IronPDF fournit une base native .NET sans dépendances d'exécution externes.


Évaluation de la complexité de la migration

Estimation de l'effort par fonctionnalité

FonctionComplexité de la migration
HTML vers PDFTrès faible
URL vers PDFTrès faible
En-têtes/Pieds de pageFaible
Paramètres de la pageFaible
Cycle de vie du serveurFaible
Gestion binaireFaible

Changement de paradigme

Le Shift fondamental de cette migration jsreport consiste à passer d'objets de requête verbeux avec gestion côté serveur à de simples appels de méthodes internes :

jsreport :  LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Flux→ File
IronPDF :   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Text

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 jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client

# Install IronPDF
dotnet add package IronPdf
SHELL

Configuration de la licence

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Identifier l'utilisation de jsreport

# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
SHELL

Référence API complète

Mappages de classes

classe jsreportÉquivalent d'IronPDF
LocalReportingChromePdfRenderer
ReportingServiceChromePdfRenderer
RenderRequestParamètres de la méthode
TemplateParamètres de la méthode
ChromeRenderingOptions
ReportPdfDocument
Engine(pas nécessaire)*

Mise en correspondance des méthodes

méthode jsreportÉquivalent d'IronPDF
LocalReporting().UseBinary().AsUtility().Create()new ChromePdfRenderer()
rs.RenderAsync(request)renderer.RenderHtmlAsPdf(html)
rs.StartAsync()(pas nécessaire)*
rs.KillAsync()(pas nécessaire)*
report.Content.CopyTo(stream)pdf.SaveAs(path) ou pdf.BinaryData

Mappages des propriétés de RenderRequest

propriété du modèle jsreportÉquivalent d'IronPDF
Template.ContentPremier paramètre à RenderHtmlAsPdf()
Template.Recipe = Recipe.ChromePdf(pas nécessaire)*
Template.Engine = Engine.None(pas nécessaire)*
Chrome.HeaderTemplateRenderingOptions.TextHeader ou HtmlHeader
Chrome.FooterTemplateRenderingOptions.TextFooter ou HtmlFooter
Chrome.DisplayHeaderFooter(automatique)
Chrome.MarginTopRenderingOptions.MarginTop

Mappages de caractères de remplacement (en-têtes/pieds de page)

jsreport PlaceholderIronPDF Placeholder
<span class='pageNumber'></span>{page}
<span class='totalPages'></span>{total-pages}
{#pageNum}{page}
{#numPages}{total-pages}
{#timestamp}{date}

Exemples de migration de code

Exemple 1 : HTML de base vers PDF

Avant (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
            }
        });

        using (var fileStream = File.Create("output.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF created successfully!");
    }
}

Après (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}

L'approche jsreport nécessite trois packages NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), trois importations de namespace, une exécution asynchrone uniquement, une chaîne de constructeur fluide (LocalReporting().UseBinary().AsUtility().Create()), un RenderRequest verbeux avec objet imbriqué Template spécifiant Recipe et Engine, et une copie de flux vers fichier manuelle avec un bloc using.

IronPDF réduit cette tâche à un package NuGet, un espace de noms, trois lignes de code et une exécution synchrone. La méthode ChromePdfRenderer.RenderHtmlAsPdf() accepte le HTML directement et renvoie un PdfDocument avec une méthode SaveAs() simple. Voir la documentation HTML vers PDF pour des options de rendu supplémentaires.

Exemple 2 : URL vers PDF

Avant (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
            }
        });

        using (var fileStream = File.Create("webpage.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("Webpage PDF created successfully!");
    }
}

Après (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("Webpage PDF created successfully!");
    }
}

jsreport peut rendre une URL en configurant Chrome.Url sur la demande, mais il n'y a pas de méthode de commodité au niveau supérieur — et un modèle commun dans le code existant est le contournement de redirection JavaScript (window.location='https://example.com') montré ci-dessus, qui peut échouer sur les sites qui bloquent la navigation scriptée.

IronPDF offre une méthode RenderUrlAsPdf() dédiée qui prend l'URL comme argument direct, avec exécution complète de JavaScript et prise en charge moderne des CSS. En savoir plus sur la conversion d'URL en PDF.

Exemple 3 : PDF avec en-têtes et pieds de page

Avant (jsreport):

// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var rs = new LocalReporting()
            .UseBinary(JsReportBinary.GetBinary())
            .AsUtility()
            .Create();

        var report = await rs.RenderAsync(new RenderRequest()
        {
            Template = new Template()
            {
                Recipe = Recipe.ChromePdf,
                Engine = Engine.None,
                Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
                Chrome = new Chrome()
                {
                    DisplayHeaderFooter = true,
                    HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
                    FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
                }
            }
        });

        using (var fileStream = File.Create("document_with_headers.pdf"))
        {
            report.Content.CopyTo(fileStream);
        }

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

Après (IronPDF):

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Custom Header",
            FontSize = 10
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}",
            FontSize = 10
        };
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>");
        pdf.SaveAs("document_with_headers.pdf");
        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}

L'approche jsreport nécessite l'ajout d'un objet Chrome au Template, la configuration de DisplayHeaderFooter = true, et l'utilisation de modèles HTML avec des classes CSS spéciales (<span class='pageNumber'></span>, <span class='totalPages'></span>). Les modèles d'en-tête et de pied de page doivent inclure une mise en forme en ligne complète.

IronPDF offre une configuration TextHeaderFooter plus propre avec des propriétés dédiées pour CenterText, LeftText, RightText, et FontSize. Les espaces réservés de numéro de page utilisent la syntaxe plus simple {page} et {total-pages}. Voir la documentation sur les en-têtes et les pieds de page pour les options d'en-tête HTML.


Notes de migration essentielles

Éliminer la gestion du cycle de vie du serveur

jsreport nécessite une gestion explicite du cycle de vie du serveur :

// jsreport (DELETE THIS):
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsUtility()
    .Create();

// Or for web server mode:
var rs = new LocalReporting()
    .UseBinary(JsReportBinary.GetBinary())
    .AsWebServer()
    .Create();

await rs.StartAsync();
// ... use rs ...
await rs.KillAsync();

IronPDF s'exécute entièrement dans le processus - pas de démarrage du serveur, pas de gestion des processus, pas de nettoyage :

// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed

Supprimer les paquets binaires spécifiques à la plateforme

jsreport nécessite des packages NuGet distincts pour chaque plateforme cible :

# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
SHELL

IronPDF gère automatiquement toutes les exigences relatives à la plateforme par le biais d'un seul package NuGet.

Mettre à jour la syntaxe des espaces réservés

jsreport utilise des caractères de remplacement CSS basés sur des classes ou des accolades.IronPDF utilise une syntaxe différente :

// jsreport placeholders:
"<span class='pageNumber'></span>"  // or {#pageNum}
"<span class='totalPages'></span>"  // or {#numPages}

//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"

Remplacer les Handlebars par l'interpolation de chaînes C#

jsreport utilise souvent le modèle de gabarit Handlebars avec Engine.Handlebars :

// jsreport Handlebars (DELETE THIS):
Template = new Template
{
    Content = "<h1>Hello, {{name}}</h1>",
    Engine = Engine.Handlebars
},
Data = new { name = "World" }

//IronPDF with C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
C#

Simplifier le traitement des flux

jsreport renvoie un flux qui nécessite une copie manuelle :

// jsreport stream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
    report.Content.CopyTo(fileStream);
}

// Or for byte array:
using (var memoryStream = new MemoryStream())
{
    await report.Content.CopyToAsync(memoryStream);
    return memoryStream.ToArray();
}

//IronPDF direct access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;

Dépannage

Édition 1 : LocalReporting introuvable

Problème : Références de code la classe LocalReporting qui n'existe pas dans IronPDF.

Solution: Replace with ChromePdfRenderer:

// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();

// IronPDF
var renderer = new ChromePdfRenderer();

Edition 2 : RenderRequest Not Found

Problème : Code utilise les objets enveloppe RenderRequest et Template.

Solution : Transmettre directement le code HTML aux méthodes de rendu :

// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);

Sujet 3 : Les numéros de page n'apparaissent pas

Problème : Utilisation de la syntaxe d'espace réservé jsreport <span class='pageNumber'></span>.

Solution : Mise à jour de la syntaxe des espaces réservés IronPDF :

// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

//IronPDF syntax
"Page {page} of {total-pages}"

Edition 4 : JsReportBinary introuvable

Problème : Références de code JsReportBinary.GetBinary().

Solution : Supprimez-le complètement —IronPDF ne nécessite pas de fichiers binaires externes :

// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())

//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();

Liste de contrôle de la migration

Pré-migration

  • Identifier toutes les déclarations jsreport using
  • Lister les modèles en utilisant Handlebars/JsRender (conversion en interpolation de chaînes C#)
  • Indiquez les options Chrome actuellement utilisées (marges, format de papier).
  • Vérifier si le mode serveur web ou le mode utilitaire (les deux s'exécutent dans le processus)
  • Remarque concernant les paquets binaires spécifiques à la plateforme (supprimez-les tous)
  • Obtenir une clé de licence IronPDF

Modifications du paquet

  • Supprimer le package jsreport.Binary
  • Supprimer le package jsreport.Binary.Linux
  • Supprimer le package jsreport.Binary.OSX
  • Supprimer le package jsreport.Local
  • Supprimer le package jsreport.Types
  • Supprimer le package jsreport.Client
  • Installer le package IronPdf

Modifications du code

  • Ajouter la configuration de la clé de licence au démarrage
  • Remplacer LocalReporting par ChromePdfRenderer
  • Supprimer l'enveloppe RenderRequest
  • Supprimer l'enveloppe Template
  • Mettre à jour la syntaxe d'espace réservé (<span class='pageNumber'>{page})
  • Remplacer Handlebars par l'interpolation de chaînes C#
  • Supprimer les appels StartAsync() / KillAsync()
  • Remplacer la copie de flux par BinaryData ou SaveAs()

Essai

  • Tester tous les chemins de génération de PDF
  • Vérifier l'affichage de l'en-tête et du pied de page
  • Vérifiez la numérotation des pages
  • Valider l'espacement des marges
  • Testez avec des pages CSS/JavaScript complexes.
  • Performances de référence

Après la migration

  • Supprimer les fichiers binaires jsreport
  • Supprimez les dépendances Node.js si elles ne sont plus nécessaires.
  • Mettre à jour les scripts de déploiement
  • Mise à jour de la documentation

Veuillez noter: jsreport est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié, approuvé ou sponsorisé par jsreport. 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 et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise