Comment migrer de jsreport à IronPDF en C#
La migration de jsreportversIronPDFtransforme 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 :
-
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.
-
Gestion des binaires externes : Vous devez télécharger et gérer les binaires spécifiques à la plateforme pour Windows, Linux et OSX via des packages NuGet distincts (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX). -
Processus serveur séparé : s'exécute en tant qu'utilitaire ou serveur Web ; une gestion de processus supplémentaire est requise avec les méthodes de cycle de vie
StartAsync()etKillAsync(). -
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#.
-
Structure de requête complexe : Nécessite des objets verbeux
RenderRequestavec des configurations imbriquéesTemplatemême pour une génération PDF simple. -
Limitations de licence : le niveau gratuit limite le nombre de modèles ; la mise à l'échelle nécessite une licence commerciale.
- 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.
jsreportvsIronPDFComparaison
| Fonction | jsreport | IronPDF |
|---|---|---|
| Temps d'exécution | Node.js + .NET | Pure .NET |
| Gestion binaire | Manuel (paquets binaires jsreport) | Automatique |
| Processus de serveur | Nécessaire (utilitaire ou serveur web) | En cours |
| Création de modèles | JavaScript (guidon, etc.) | C# (Razor, interpolation de chaînes) |
| Style API | Objets de requête verbeux | Méthodes fluides et propres |
| Production | Flux | Objet PdfDocument |
| Manipulation de PDF | Limité | Extensif (fusionner, diviser, éditer) |
| Prise en charge de l'asynchronisme | Async uniquement | Sync et async |
Pour les équipes qui prévoient l'adoption de .NET 10 et C# 14 jusqu'en 2025 et 2026,IronPDFconstitue une base à l'épreuve du temps en tant que bibliothèque native .NET sans dépendances d'exécution externes.
Évaluation de la complexité de la migration
Estimation de l'effort par fonctionnalité
| Fonction | Complexité de la migration |
|---|---|
| HTML vers PDF | Très faible |
| URL vers PDF | Très faible |
| En-têtes/Pieds de page | Faible |
| Paramètres de la page | Faible |
| Cycle de vie du serveur | Faible |
| Gestion binaire | Faible |
Changement de paradigme
Le Shift fondamental de cette migration jsreportconsiste à 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()
Avant de commencer
Prérequis
- Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Accès à NuGet : possibilité d'installer des packages NuGet
- Licence IronPDF : Obtenez votre clé de licence sur IronPDF
Modifications du paquet NuGet
# Remove jsreportpackages
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
# Remove jsreportpackages
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
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"
Identifier l'utilisation de jsreport
# Find all jsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
# Find all jsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
Référence API complète
Mappages de classes
| classe jsreport | Équivalent d'IronPDF |
|---|---|
LocalReporting |
ChromePdfRenderer |
ReportingService |
ChromePdfRenderer |
RenderRequest |
Paramètres de la méthode |
Template |
Paramètres de la méthode |
Chrome |
RenderingOptions |
Report |
PdfDocument |
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.Content |
Premier paramètre à RenderHtmlAsPdf() |
Template.Recipe = Recipe.ChromePdf |
(pas nécessaire)* |
Template.Engine = Engine.None |
(pas nécessaire)* |
Chrome.HeaderTemplate |
RenderingOptions.TextHeader ou HtmlHeader |
Chrome.FooterTemplate |
RenderingOptions.TextFooter ou HtmlFooter |
Chrome.DisplayHeaderFooter |
(automatique) |
Chrome.MarginTop |
RenderingOptions.MarginTop |
Mappages de caractères de remplacement (en-têtes/pieds de page)
| jsreportPlaceholder | IronPDFPlaceholder |
|---|---|
<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!");
}
}
// 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!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
}
})
Using fileStream = File.Create("output.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("PDF created successfully!")
End Function
End Module
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!");
}
}
// 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!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
L'approche jsreportnécessite trois packages NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), trois importations d'espace de noms, une exécution uniquement asynchrone, une chaîne de Builder fluide (LocalReporting().UseBinary().AsUtility().Create()), un RenderRequest verbeux avec un objet Template imbriqué spécifiant Recipe et Engine, et une copie manuelle du flux vers un fichier 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 directement le HTML et renvoie un PdfDocument avec une simple méthode SaveAs(). 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!");
}
}
// 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!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
}
})
Using fileStream = File.Create("webpage.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("Webpage PDF created successfully!")
End Function
End Module
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!");
}
}
// 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!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("Webpage PDF created successfully!")
End Sub
End Class
Cet exemple met en évidence une limitation importante de jsreport: il n'y a pas de méthode directe d'URL vers PDF. Le code jsreportdoit utiliser une solution de contournement de redirection JavaScript (window.location='https://example.com') intégrée dans le contenu HTML pour capturer une page Web. Cette approche indirecte peut échouer avec certains sites web et ajoute une complexité inutile.
IronPDF fournit une méthode dédiée RenderUrlAsPdf() qui affiche directement n'importe quelle URL avec une exécution JavaScript complète et une prise en charge CSS moderne. Pas de solutions de contournement, pas de scripts intégrés - il suffit de transmettre l'URL. 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!");
}
}
// 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!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = New LocalReporting() _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
.Chrome = New Chrome() With {
.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 fileStream = File.Create("document_with_headers.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("PDF with headers and footers created successfully!")
End Function
End Module
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!");
}
}
// 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!");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main(args As String())
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Custom Header",
.FontSize = 10
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
Dim 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!")
End Sub
End Module
L'approche jsreportnécessite l'ajout d'un objet Chrome au Template, la définition de DisplayHeaderFooter = true et l'utilisation de modèles HTML avec des espaces réservés de classe CSS spéciaux (<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 fournit une configuration TextHeaderFooter plus propre avec des propriétés dédiées pour CenterText, LeftText, RightText et FontSize. Les espaces réservés aux numéros 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();
// 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();
' jsreport(DELETE THIS):
Dim rs = New LocalReporting() _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
' Or for web server mode:
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
// 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
# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
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.IronPDFutilise une syntaxe différente :
// jsreportplaceholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
// jsreportplaceholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
' jsreportplaceholders:
"<span class='pageNumber'></span>" ' or {#pageNum}
"<span class='totalPages'></span>" ' or {#numPages}
' IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
Remplacer le guidon avec l'interpolation de chaînes de caractères en C
jsreport utilise souvent le modèle Handlebars avec Engine.Handlebars :
// jsreportHandlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
// jsreportHandlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports IronPdf
' jsreportHandlebars (DELETE THIS):
Dim Template As New Template With {
.Content = "<h1>Hello, {{name}}</h1>",
.Engine = Engine.Handlebars
}
Dim Data = New With {.name = "World"}
' IronPDF with VB.NET string interpolation:
Dim name As String = "World"
Dim html As String = $"<h1>Hello, {name}</h1>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
Simplifier le traitement des flux
jsreport renvoie un flux qui nécessite une copie manuelle :
// jsreportstream 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();
}
//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
// jsreportstream 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();
}
//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
Imports System.IO
' jsreportstream handling (DELETE THIS):
Using fileStream As FileStream = File.Create("output.pdf")
report.Content.CopyTo(fileStream)
End Using
' Or for byte array:
Using memoryStream As New MemoryStream()
Await report.Content.CopyToAsync(memoryStream)
Return memoryStream.ToArray()
End Using
' IronPDFdirect access:
pdf.SaveAs("output.pdf")
' Or:
Dim bytes As Byte() = pdf.BinaryData
Dépannage
Édition 1 : LocalReporting introuvable
Problème : Le code fait référence à la classe LocalReporting qui n'existe pas dans IronPDF.
Solution : Remplacer par ChromePdfRenderer :
// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();
// IronPDF
var renderer = new ChromePdfRenderer();
// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();
// IronPDF
var renderer = new ChromePdfRenderer();
' jsreport
Dim rs = New LocalReporting().UseBinary().AsUtility().Create()
' IronPDF
Dim renderer = New ChromePdfRenderer()
Edition 2 : RenderRequest Not Found
Problème : Le code utilise des objets wrapper 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);
// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
Imports System.Threading.Tasks
' jsreport
Await rs.RenderAsync(New RenderRequest With {.Template = New Template With {.Content = html}})
' IronPDF
Dim 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 :
// jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDFsyntax
"Page {page} of {total-pages}"
// jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDFsyntax
"Page {page} of {total-pages}"
' jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
' IronPDFsyntax
"Page {page} of {total-pages}"
Edition 4 : JsReportBinary introuvable
Problème : Références de code JsReportBinary.GetBinary().
Solution : Supprimez-le complètement —IronPDFne nécessite pas de fichiers binaires externes :
// DELETE this jsreportpattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
// DELETE this jsreportpattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
Liste de contrôle de la migration
Pré-migration
- Identifier toutes les instructions 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
- Remplacez
LocalReportingparChromePdfRenderer - Supprimer l'enveloppe
RenderRequest - Supprimer l'enveloppe
Template - Mise à jour de la syntaxe des espaces réservés (
<span class='pageNumber'>→{page}) - Remplacer Handlebars par l'interpolation de chaînes C#
- Supprimer les appels
StartAsync()/KillAsync() - Remplacez la copie de flux par
BinaryDataouSaveAs()
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

