Zum Fußzeileninhalt springen
VIDEOS

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:

  1. Node.js Abhängigkeit: Erfordert die Node.js -Laufzeitumgebung und Binärdateien, was die Infrastruktur einer eigentlich unkomplizierten .NET Anwendung unnötig verkompliziert.

  2. 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).

  3. Separater Serverprozess: Läuft entweder als Dienstprogramm oder Webserver — zusätzliche Prozessverwaltung wird mit StartAsync() und KillAsync() Lebenszyklusmethoden benötigt.

  4. JavaScript Templating: Erzwingt das Erlernen von Handlebars, JsRender oder anderen JavaScript -Templating-Systemen anstatt die nativen C#-Funktionen zu nutzen.

  5. Komplexe Anfragestruktur: Erfordert umfangreiche RenderRequest Objekte mit verschachtelten Template Konfigurationen selbst für einfache PDF-Erstellung.

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

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

  1. .NET -Umgebung: .NET Framework 4.6.2+ oder .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet -Zugriff: Möglichkeit zur Installation von NuGet -Paketen
  3. 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
SHELL

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"
$vbLabelText   $csharpLabel

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" .
SHELL

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
SHELL

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}"
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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}"
$vbLabelText   $csharpLabel

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();
$vbLabelText   $csharpLabel

Migrations-Checkliste

Vor der Migration

  • Identifizieren Sie alle jsreport using Anweisungen
  • 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.Binary Paket
  • Entfernen Sie jsreport.Binary.Linux Paket
  • Entfernen Sie jsreport.Binary.OSX Paket
  • Entfernen Sie jsreport.Local Paket
  • Entfernen Sie jsreport.Types Paket
  • Entfernen Sie jsreport.Client Paket
  • Installieren Sie IronPdf Paket

Code-Änderungen

  • Lizenzschlüsselkonfiguration beim Start hinzufügen
  • Ersetzen Sie LocalReporting mit ChromePdfRenderer
  • Entfernen Sie RenderRequest Wrapper
  • Entfernen Sie Template Wrapper
  • Aktualisieren Sie die Platzhaltersyntax (<span class='pageNumber'>{page})
  • Handlebars durch C#-Stringinterpolation ersetzen
  • Entfernen Sie StartAsync() / KillAsync() Aufrufe
  • Ersetzen Sie das Stream-Kopieren durch BinaryData oder SaveAs()

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

Hinweis:jsreport ist ein eingetragenes Warenzeichen seines jeweiligen Inhabers.} Diese Seite steht in keiner Verbindung mit, wird nicht unterstützt oder gesponsert von jsreport. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an