Wie man ein PDF in ein Bild in C# rastert
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 Binary-Verwaltung: Muss plattformspezifische Binärdateien für Windows, Linux und OSX über separate NuGet-Pakete herunterladen und verwalten (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX). -
Separater Serverprozess: Läuft entweder als Dienstprogramm oder Webserver — zusätzliche Prozessverwaltung wird mit
StartAsync()undKillAsync()Lebenszyklusmethoden benötigt. -
JavaScript Templating: Erzwingt das Erlernen von Handlebars, JsRender oder anderen JavaScript -Templating-Systemen anstatt die nativen C#-Funktionen zu nutzen.
-
Komplexe Anfragestruktur: Erfordert umfangreiche
RenderRequestObjekte mit verschachteltenTemplateKonfigurationen selbst für einfache PDF-Erstellung. -
Lizenzbeschränkungen: Die kostenlose Stufe ist auf 5 Vorlagen pro Instanz beschränkt; kommerzielle Nutzung darüber hinaus erfordert eine Enterprise-Lizenz ($395/Jahr pro Instanz) oder Enterprise-Scale ($1.295/Jahr, gebührenfrei über Instanzen). See jsreport.net/buy.
- Streambasierte Ausgabe: Gibt Datenströme zurück, die manuelle Dateivorgänge und Speicherstromverwaltung erfordern.
jsreport vs IronPDF Vergleich
| 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 .NET 10 und C# 14 übernehmen möchten, bietet IronPDF eine native .NET-Basis 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
| jsreport Vorlage Eigenschaft | IronPDF-Äquivalent |
|---|---|
Template.Content |
Erster Parameter zu 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)
| jsreport Platzhalter | IronPDF Platzhalter |
|---|---|
<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, asynchrone Ausführung, eine fließende Builder-Kette (LocalReporting().UseBinary().AsUtility().Create()), ein ausführliches RenderRequest mit verschachteltem Template Objekt, das Recipe und Engine spezifiziert, sowie manuelles Stream-to-File-Kopieren mit einem using Block.
IronPDF reduziert dies auf ein NuGet-Paket, einen Namespace, drei Codezeilen und synchrone Ausführung. Die ChromePdfRenderer.RenderHtmlAsPdf() Methode akzeptiert HTML direkt und gibt ein 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
jsreport kann eine URL rendern, indem Chrome.Url in der Anfrage gesetzt wird, aber es gibt keine einfache Top-Level-Methode — ein häufiges Muster im vorhandenen Code ist der oben gezeigte JavaScript-Redirect-Workaround (window.location='https://example.com'), der auf Websites, die gescriptete Navigation blockieren, fehlschlagen kann.
IronPDF bietet eine spezielle RenderUrlAsPdf() Methode, die die URL als direktes Argument nimmt, mit vollständiger JavaScript-Ausführung und moderner CSS-Unterstützung. 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 zum Template, das Setzen 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 sauberere TextHeaderFooter Konfiguration mit speziellen Eigenschaften für CenterText, LeftText, RightText und FontSize. Seitennummernplatzhalter verwenden die einfachere {page} und {total-pages} Syntax. 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}"
Ersetzen Sie Handlebars durch C# String Interpolation
jsreport verwendet häufig Handlebars-Templating mit 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);
// 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);
Imports IronPdf
' jsreport Handlebars (DELETE THIS):
Dim Template = 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: Code referenziert LocalReporting Klasse, die in IronPDF nicht existiert.
Lösung: Ersetzen 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: 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 von jsreport-Platzhaltersyntax <span class='pageNumber'></span>.
Lösung: Aktualisierung der IronPDF Platzhaltersyntax:
// 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 references 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
jsreport.BinaryPaket - Entfernen Sie
jsreport.Binary.LinuxPaket - Entfernen Sie
jsreport.Binary.OSXPaket - Entfernen Sie
jsreport.LocalPaket - Entfernen Sie
jsreport.TypesPaket - Entfernen Sie
jsreport.ClientPaket - Installieren Sie
IronPdfPaket
Code-Änderungen
- Lizenzschlüsselkonfiguration beim Start hinzufügen
- Ersetzen Sie
LocalReportingmitChromePdfRenderer - Entfernen Sie
RenderRequestWrapper - Entfernen Sie
TemplateWrapper - Aktualisieren Sie die Platzhaltersyntax (
<span class='pageNumber'>→{page}) - Handlebars durch C#-Stringinterpolation ersetzen
- Entfernen Sie
StartAsync()/KillAsync()Aufrufe - 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

