Migrieren von jsreport zu IronPDF in C#
Die Migration von jsreport zu IronPDF verwandelt Ihren .NET-PDF-Workflow von einem Node.js-abhängigen System mit externer Binärverwaltung und separaten Serverprozessen in eine reine .NET-Bibliothek, die vollständig prozessintern läuft. Dieses Handbuch bietet einen umfassenden, schrittweisen Migrationspfad, der die Komplexität der Infrastruktur und die Anforderungen an JavaScript-Templates für professionelle .NET-Entwickler eliminiert.
Warum von jsreport zu IronPDF migrieren
Die jsreport-Herausforderungen
jsreport führt eine Komplexität ein, die nicht in eine reine .NET-Umgebung gehört:
-
Node.js Abhängigkeit: Erfordert die Node.js -Laufzeitumgebung und Binärdateien, was die Infrastruktur einer eigentlich unkomplizierten .NET Anwendung unnötig verkompliziert.
-
Externe Binärverwaltung: Plattformspezifische Binärdateien für Windows, Linux und OSX müssen über separate NuGet Pakete heruntergeladen und verwaltet werden (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX). -
Separater Serverprozess: Läuft entweder als Utility- oder Webserver – zusätzliches Prozessmanagement ist mit den Lebenszyklusmethoden
StartAsync()undKillAsync()erforderlich. -
JavaScript Templating: Erzwingt das Erlernen von Handlebars, JsRender oder anderen JavaScript -Templating-Systemen anstatt die nativen C#-Funktionen zu nutzen.
-
Komplexe Anfragestruktur: Erfordert ausführliche
RenderRequestObjekte mit verschachteltenTemplateKonfigurationen selbst für die einfache PDF-Generierung. -
Lizenzbeschränkungen: Die kostenlose Version beschränkt die Anzahl der Vorlagen; die Skalierung erfordert eine kommerzielle Lizenz.
- Streambasierte Ausgabe: Gibt Datenströme zurück, die manuelle Dateivorgänge und Speicherstromverwaltung erfordern.
jsreport vs IronPDFVergleich
| Feature | jsreport | IronPDF |
|---|---|---|
| Laufzeit | Node.js + .NET | Reines .NET |
| Binäres Management | Handbuch (jsreport.Binary-Pakete) | Automatisch |
| Server-Prozess | Erforderlich (Dienstprogramm oder Webserver) | In Bearbeitung |
| Vorlagenerstellung | JavaScript (Handlebars, etc.) | C# (Razor, String-Interpolation) |
| API-Stil | Ausführliche Anfrageobjekte | Saubere, fließende Methoden |
| Ausgabe | Stream | PdfDocument-Objekt |
| PDF-Bearbeitung | Beschränkt | Umfassend (zusammenführen, aufteilen, bearbeiten) |
| Async-Unterstützung | Async-only | Sowohl sync als auch async |
Für Teams, die die Einführung von .NET 10 und C# 14 bis 2025 und 2026 planen, bietet IronPDF eine zukunftssichere Grundlage als native .NET-Bibliothek ohne externe Laufzeitabhängigkeiten.
Migrationskomplexitätsbewertung
Geschätzter Aufwand nach Merkmalen
| Feature | Komplexität der Migration |
|---|---|
| HTML zu PDF | Sehr niedrig |
| URL zu PDF | Sehr niedrig |
| Kopf-/Fußzeilen | Niedrig |
| Seite Einstellungen | Niedrig |
| Server-Lebenszyklus | Niedrig |
| Binäres Management | Niedrig |
Paradigmen-Verschiebung
Der grundlegende Shift bei dieser jsreport-Migration besteht in der Abkehr von ausführlichen Anfrageobjekten mit Serververwaltung hin zu einfachen In-Process-Methodenaufrufen:
jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Stream→ Datei
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Bevor Sie beginnen
Voraussetzungen
- .NET -Umgebung: .NET Framework 4.6.2+ oder .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet -Zugriff: Möglichkeit zur Installation von NuGet -Paketen
- IronPDF -Lizenz: Ihren Lizenzschlüssel erhalten Sie unter IronPDF.
NuGet-Paketänderungen
# 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
# 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
Lizenz-Konfiguration
// 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"
Identifizieren Sie die Verwendung von jsreport
# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
Komplette API-Referenz
Klassen-Zuordnungen
| jsreport-Klasse | IronPDF-Äquivalent |
|---|---|
LocalReporting |
ChromePdfRenderer |
ReportingService |
ChromePdfRenderer |
RenderRequest |
Parameter der Methode |
Template |
Parameter der Methode |
Chrome |
RenderingOptions |
Report |
PdfDocument |
Engine |
(nicht erforderlich) |
Methoden-Zuordnungen
| jsreport-Methode | IronPDF-Äquivalent |
|---|---|
LocalReporting().UseBinary().AsUtility().Create() |
new ChromePdfRenderer() |
rs.RenderAsync(request) |
renderer.RenderHtmlAsPdf(html) |
rs.StartAsync() |
(nicht erforderlich) |
rs.KillAsync() |
(nicht erforderlich) |
report.Content.CopyTo(stream) |
pdf.SaveAs(path) oder pdf.BinaryData |
RenderRequest-Eigenschaftszuordnungen
| jsreportVorlage Eigenschaft | IronPDF-Äquivalent |
|---|---|
Template.Content |
Erster Parameter für RenderHtmlAsPdf() |
Template.Recipe = Recipe.ChromePdf |
(nicht erforderlich) |
Template.Engine = Engine.None |
(nicht erforderlich) |
Chrome.HeaderTemplate |
RenderingOptions.TextHeader oder HtmlHeader |
Chrome.FooterTemplate |
RenderingOptions.TextFooter oder HtmlFooter |
Chrome.DisplayHeaderFooter |
(automatisch) |
Chrome.MarginTop |
RenderingOptions.MarginTop |
Platzhalter-Zuordnungen (Kopf-/Fußzeilen)
| jsreportPlatzhalter | IronPDFPlatzhalter |
|---|---|
<span class='pageNumber'></span> |
{page} |
<span class='totalPages'></span> |
{total-pages} |
{#pageNum} |
{page} |
{#numPages} |
{total-pages} |
{#timestamp} |
{date} |
Beispiele für die Code-Migration
Beispiel 1: Grundlegendes HTML zu PDF
Vor (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
Nach (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
Der jsreport-Ansatz erfordert drei NuGet Pakete (jsreport.Binary, jsreport.Local, jsreport.Types), drei Namespace-Importe, ausschließlich asynchrone Ausführung, eine Fluent Builder Chain (LocalReporting().UseBinary().AsUtility().Create()), ein ausführliches RenderRequest mit verschachteltem Template-Objekt, das Recipe und Engine spezifiziert, und manuelles Kopieren des Streams in eine Datei mit einem using-Block.
IronPDF reduziert dies auf ein NuGet-Paket, einen Namespace, drei Codezeilen und synchrone Ausführung. Die Methode ChromePdfRenderer.RenderHtmlAsPdf() akzeptiert HTML direkt und gibt eine PdfDocument mit einer einfachen SaveAs() Methode zurück. Weitere Rendering-Optionen finden Sie in der HTML to PDF Dokumentation.
Beispiel 2: URL zu PDF
Vor (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
Nach (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
Dieses Beispiel zeigt eine wesentliche Einschränkung von jsreport: Es gibt keine direkte URL-zu-PDF-Methode. Der jsreport-Code muss einen JavaScript -Redirect-Workaround (window.location='https://example.com') verwenden, der in den HTML-Inhalt eingebettet ist, um eine Webseite zu erfassen. Dieser indirekte Ansatz kann bei bestimmten Websites scheitern und führt zu unnötiger Komplexität.
IronPDF bietet eine spezielle RenderUrlAsPdf() Methode, die jede URL direkt mit vollständiger JavaScript Ausführung und moderner CSS-Unterstützung rendert. Keine Workarounds, keine eingebetteten Skripte - einfach die URL weitergeben. Erfahren Sie mehr über die URL in PDF Konvertierung.
Beispiel 3: PDF mit Kopf- und Fußzeilen
Vor (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
Nach (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
Der jsreport-Ansatz erfordert das Hinzufügen eines Chrome-Objekts zu Template, das Festlegen von DisplayHeaderFooter = true und die Verwendung von HTML-Vorlagen mit speziellen CSS-Klassenplatzhaltern (<span class='pageNumber'></span>, <span class='totalPages'></span>). Die Kopf- und Fußzeilenvorlagen müssen ein vollständiges Inline-Styling enthalten.
IronPDF bietet eine übersichtlichere TextHeaderFooter-Konfiguration mit dedizierten Eigenschaften für CenterText, LeftText, RightText und FontSize. Platzhalter für Seitenzahlen verwenden die einfachere Syntax {page} und {total-pages}. Siehe die Kopf- und Fußzeilen-Dokumentation für HTML-Kopfzeilenoptionen.
Kritische Hinweise zur Migration
Eliminieren Sie das Server-LebenszyklusManagement
jsreport erfordert ein explizites Server-Lifecycle-Management:
// 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 wird vollständig prozessintern ausgeführt - kein Serverstart, keine Prozessverwaltung, keine Aufräumarbeiten:
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
Plattformspezifische Binärpakete entfernen
jsreport erfordert separate NuGet-Pakete für jede Zielplattform:
# 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 behandelt alle Plattformanforderungen automatisch über ein einziges NuGet-Paket.
Platzhalter-Syntax aktualisieren
jsreport verwendet klassenbasierte CSS-Platzhalter oder geschweifte Klammern.IronPDF verwendet eine andere Syntax:
// jsreport placeholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
// jsreport placeholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
' jsreport placeholders:
"<span class='pageNumber'></span>" ' or {#pageNum}
"<span class='totalPages'></span>" ' or {#numPages}
' IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
Handlebars durch C# String-Interpolation ersetzen
jsreport verwendet häufig Handlebars-Templating mit Engine.Handlebars:
// jsreportHandlebars (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);
// jsreportHandlebars (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);
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)
Vereinfachung der Stream-Verarbeitung
jsreport gibt einen Streamzurück, der manuell kopiert werden muss:
// 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;
// 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;
Imports System.IO
' jsreport stream 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
'IronPDF direct access:
pdf.SaveAs("output.pdf")
' Or:
Dim bytes As Byte() = pdf.BinaryData
Fehlerbehebung
Ausgabe 1: LocalReporting nicht gefunden
Problem: Der Code verweist auf die Klasse LocalReporting, die in IronPDF nicht existiert.
Lösung: Ersetzen Sie durch 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()
Ausgabe 2: RenderRequest nicht gefunden
Problem: Der Code verwendet RenderRequest und Template Wrapper-Objekte.
Lösung: HTML direkt an die Rendermethoden übergeben:
// 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)
Problem 3: Nicht angezeigte Seitenzahlen
Problem: Verwendung der jsreport-Platzhaltersyntax <span class='pageNumber'></span>.
Lösung: Aktualisierung der IronPDFPlatzhaltersyntax:
// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDF syntax
"Page {page} of {total-pages}"
// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDF syntax
"Page {page} of {total-pages}"
' jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
' IronPDF syntax
"Page {page} of {total-pages}"
Ausgabe 4: JsReportBinary nicht gefunden
Problem: Code referenziert JsReportBinary.GetBinary().
Lösung: Komplett löschen –IronPDF benötigt keine externen Binärdateien:
// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
Migrations-Checkliste
Vor der Migration
- Identifizieren Sie alle jsreport
usingAnweisungen - Listenvorlagen mit Handlebars/JsRender (Konvertierung in C#-Stringinterpolation)
- Dokumentieren Sie die aktuell verwendeten Chrome-Optionen (Ränder, Papierformat)
- Prüfen Sie, ob es sich um einen Webserver oder einen Utility-Modus handelt (beide laufen im selben Prozess).
- Hinweis: Plattformspezifische Binärpakete (alle löschen) -IronPDF-Lizenzschlüssel erhalten
Paketänderungen
- Entfernen Sie das Paket
jsreport.Binary - Entfernen Sie das Paket
jsreport.Binary.Linux - Entfernen Sie das Paket
jsreport.Binary.OSX - Entfernen Sie das Paket
jsreport.Local - Entfernen Sie das Paket
jsreport.Types - Entfernen Sie das Paket
jsreport.Client - Installieren Sie das Paket
IronPdf
Code-Änderungen
- Lizenzschlüsselkonfiguration beim Start hinzufügen
- Ersetzen Sie
LocalReportingdurchChromePdfRenderer - Entfernen Sie den Wrapper
RenderRequest - Entfernen Sie den
TemplateWrapper - Aktualisierung der Platzhaltersyntax (
<span class='pageNumber'>→{page}) - Handlebars durch C#-Stringinterpolation ersetzen
- Entfernen Sie die Anrufe
StartAsync()/KillAsync() - Ersetzen Sie das Stream-Kopieren durch
BinaryDataoderSaveAs()
Testen
- Alle PDF-Generierungspfade testen
- Überprüfung der Darstellung von Kopf- und Fußzeile
- Seitennummerierung prüfen
- Randabstände prüfen
- Testen mit komplexen CSS/ JavaScript Seiten
- Benchmark-Leistung
Nach der Migration
- Löschen Sie die Binärdateien von jsreport.
- Entfernen Sie Node.js Abhängigkeiten, falls diese nicht mehr benötigt werden.
- Bereitstellungsskripte aktualisieren
- Dokumentation aktualisieren

