Przejdź do treści stopki
PRZEWODNIKI MIGRACJI

Jak przeprowadzić migrację z jsreport do IronPDF w języku C#

Przejście z jsreport na IronPDF przekształca przepływ pracy z plikami PDF w środowisku .NET z systemu zależnego od Node.js, z zewnętrznym zarządzaniem plikami binarnymi i oddzielnymi procesami serwerowymi, w czystą bibliotekę .NET, która działa całkowicie w ramach procesu. Niniejszy przewodnik zawiera kompleksową, szczegółową ścieżkę migracji, która eliminuje złożoność infrastruktury i wymagania dotyczące szablonów JavaScript dla profesjonalnych programistów .NET.

Dlaczego warto przejść z jsreport na IronPDF

Wyzwania związane z jsreport

jsreport wprowadza złożoność, która nie pasuje do czystego środowiska .NET:

  1. Zależność od Node.js: Wymaga środowiska uruchomieniowego Node.js i plików binarnych, co zwiększa złożoność infrastruktury w przypadku aplikacji, która powinna być prostą aplikacją .NET.

  2. Zarzadzanie zewnetrznymi plikami binarnymi: Konieczne jest pobranie i zarzadzanie binariami specyficznymi dla platformy Windows, Linux i OSX poprzez oddzielne pakiety NuGet (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. Oddzielny proces serwera: Dziala jako narzedzie lub serwer WWW—wymagane jest dodatkowe zarzadzanie procesami przy uzyciu StartAsync() i KillAsync() metod zycia.

  4. Szablony JavaScript: Wymusza naukę Handlebars, JsRender lub innych systemów szablonów JavaScript zamiast korzystania z natywnych możliwości C#.

  5. Zlozona struktura zadan: Wymaga rozbudowanych obiektow RenderRequest z zagniezdzonymi konfiguracjami Template nawet dla prostego generowania PDF.

  6. Ograniczenia licencyjne: Darmowa wersja jest ograniczona do 5 szablonów na instancję; komercyjne użycie ponad to wymaga licencji Enterprise ($395/rok na instancję) lub Enterprise Scale ($1,295/rok, bez opłat licencyjnych pomiędzy instancjami). See jsreport.net/buy.

  7. Wyjście oparte na strumieniach: Zwraca strumienie wymagające ręcznych operacji na plikach i zarządzania strumieniami pamięci.

Porównanie jsreport i IronPDF

Funkcja jsreport IronPDF
Środowisko uruchomieniowe Node.js + .NET Czysty .NET
Zarządzanie plikami binarnymi Podręcznik (pakiety jsreport.Binary) Automatyczne
Proces serwerowy Wymagane (narzędzie lub serwer internetowy) W trakcie realizacji
Szablony JavaScript (Handlebars itp.) C# (Razor, interpolacja ciągów znaków)
Styl API Rozbudowane obiekty żądania Przejrzyste i płynne metody
Wynik Strumień Obiekt PdfDocument
Manipulacja plikami PDF Ograniczone Rozbudowane (łączenie, dzielenie, edycja)
Obsługa asynchroniczna Tylko asynchroniczne Zarówno synchroniczne, jak i asynchroniczne

Dla zespołów planujących przyjęcie .NET 10 i C# 14,IronPDF dostarcza natywne .NET bez zewnętrznych zależności czasu wykonywania.


Ocena złożoności migracji

Szacowany nakład pracy według funkcji

Funkcja Złożoność migracji
HTML do PDF Bardzo niski
URL do pliku PDF Bardzo niski
Nagłówki/stopki Niski
Ustawienia strony Niski
Cykl życia serwera Niski
Zarządzanie plikami binarnymi Niski

Zmiana paradygmatu

Podstawową zmianą w tej migracji jsreport jest przejście od rozbudowanych obiektów żądań z zarządzaniem serwerem do prostych wywołań metod w ramach procesu:

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

Zanim zaczniesz

Wymagania wstępne

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com

Zmiany w pakiecie NuGet

# Remove jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client

# Install IronPDF
dotnet add package IronPdf
# 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

Konfiguracja licencji

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

Zidentyfikuj zastosowanie 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

Kompletna dokumentacija API

Mapowania klas

Klasa jsreport Odpowiednik IronPDF
LocalReporting ChromePdfRenderer
ReportingService ChromePdfRenderer
RenderRequest Parametry metody
Template Parametry metody
Chrome RenderingOptions
Report PdfDocument
Engine (niepotrzebne)

Mapowanie metod

Metoda jsreport Odpowiednik IronPDF
LocalReporting().UseBinary().AsUtility().Create() new ChromePdfRenderer()
rs.RenderAsync(request) renderer.RenderHtmlAsPdf(html)
rs.StartAsync() (niepotrzebne)
rs.KillAsync() (niepotrzebne)
report.Content.CopyTo(stream) pdf.SaveAs(path) lub pdf.BinaryData

Mapowania właściwości RenderRequest

Właściwość szablonu jsreport Odpowiednik IronPDF
Template.Content Pierwszy parametr dla RenderHtmlAsPdf()
Template.Recipe = Recipe.ChromePdf (niepotrzebne)
Template.Engine = Engine.None (niepotrzebne)
Chrome.HeaderTemplate RenderingOptions.TextHeader lub HtmlHeader
Chrome.FooterTemplate RenderingOptions.TextFooter lub HtmlFooter
Chrome.DisplayHeaderFooter (automatyczne)
Chrome.MarginTop RenderingOptions.MarginTop

Mapowanie symboli zastępczych (nagłówki/stopki)

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

Przykłady migracji kodu

Przykład 1: Podstawowy HTML do PDF

Przed (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

Po (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

Podejście jsreport wymaga trzech pakietów NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), trzech importow przestrzeni nazw, tylko asynchronicznego wykonania, lancucha fluent buildera (LocalReporting().UseBinary().AsUtility().Create()), rozbudowanego RenderRequest z zagniezdzonym Template obiektem wyznaczajacym Recipe i Engine, oraz recznego kopiowania strumienia do pliku za pomoca bloku using.

IronPDF sprowadza to do jednego pakietu NuGet, jednej przestrzeni nazw, trzech wierszy kodu i synchronicznego wykonywania. Metoda ChromePdfRenderer.RenderHtmlAsPdf() akceptuje HTML bezposrednio i zwraca PdfDocument z prosta metoda SaveAs(). Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: URL do PDF

Przed (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

Po (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 moze renderowac URL poprzez ustawienie Chrome.Url na zadanie, ale nie ma wygodnej metody najwyzszego poziomu — i powszechnym wzorcem w istniejacym kodzie jest obejscie w postaci przekierowania JavaScript (window.location='https://example.com') pokazane powyzej, ktore moze zawodzic na stronach blokujacych skryptowane nawiagacje.

IronPDF zapewnia dedykowana metode RenderUrlAsPdf(), ktora przyjmuje URL jako bezposredni argument, z pelnym wykonaniem JavaScript i wsparciem dla nowoczesnego CSS. Dowiedz się więcej o konwersji adresów URL do formatu PDF.

Przykład 3: Plik PDF z nagłówkami i stopkami

Przed (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

Po (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

Podejście jsreport wymaga dodania obiektu Chrome do Template, ustawienia DisplayHeaderFooter = true i uzywania szablonow HTML ze specjalnymi miejscami na klasy CSS (<span class='pageNumber'></span>, <span class='totalPages'></span>). Szablony nagłówków i stopek muszą zawierać pełne style wbudowane.

IronPDF zapewnia czystsza konfiguracje TextHeaderFooter z dedykowanymi wlasciwosciami dla CenterText, LeftText, RightText i FontSize. Miejsca na liczenie stron uzywaja prostszej skladni {page} i {total-pages}. Opcje nagłówków HTML można znaleźć w dokumentacji dotyczącej nagłówków i stopek.


Ważne uwagi dotyczące migracji

Wyeliminuj zarządzanie cyklem życia serwerów

jsreport wymaga wyraźnego zarządzania cyklem życia serwera:

// 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 działa całkowicie w ramach procesu — bez uruchamiania serwera, bez zarządzania procesami, bez czyszczenia:

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

Usuń pakiety binarne specyficzne dla platformy

jsreport wymaga oddzielnych pakietów NuGet dla każdej platformy docelowej:

# 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 automatycznie obsługuje wszystkie wymagania platformowe za pośrednictwem jednego pakietu NuGet.

Zaktualizuj składnię symboli zastępczych

jsreport wykorzystuje symbole zastępcze oparte na klasach CSS lub nawiasach klamrowych.IronPDF używa innej składni:

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

Zamień Handlebars na interpolację ciągów C

jsreport czesto uzywa szablonow Handlebars z 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

Uprość obsługę strumieni

jsreport zwraca strumień, który wymaga ręcznego skopiowania:

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

Rozwiązywanie problemów

Problem 1: Nie znaleziono LocalReporting

Problem: Odniesienia do klasy LocalReporting, ktora nie istnieje w IronPDF.

Rozwiazanie: Zastapic 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

Problem 2: Nie znaleziono RenderRequest

Problem: Kod uzywa obiektow opakowujacych RenderRequest i Template.

Rozwiązanie: Przekazuj kod HTML bezpośrednio do metod renderowania:

// 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: Brak wyświetlania numerów stron

Problem: Uzywanie skladni miejsc docelowych jsreport <span class='pageNumber'></span>.

Rozwiązanie: Zaktualizuj do składni symboli zastępczych IronPDF:

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

Problem 4: Nie znaleziono pliku JsReportBinary

Problem: Kod odnosi sie do JsReportBinary.GetBinary().

Rozwiązanie: Usunąć w całości —IronPDF nie wymaga zewnętrznych plików binarnych:

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

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj wszystkie polecenia jsreport using
  • Szablony listy przy użyciu Handlebars/JsRender (przekonwertuj na interpolację ciągów znaków w C#)
  • Odzwierciedl aktualne ustawienia przeglądarki Chrome (marginesy, rozmiar papieru)
  • Sprawdź tryb serwera WWW w porównaniu z trybem narzędziowym (oba stają się trybem wbudowanym)
  • Uwaga: pakiety binarne specyficzne dla platformy (usunąć wszystkie)
  • Uzyskaj klucz licencyjny IronPDF

Zmiany w pakiecie

  • Usun pakiet jsreport.Binary
  • Usun pakiet jsreport.Binary.Linux
  • Usun pakiet jsreport.Binary.OSX
  • Usun pakiet jsreport.Local
  • Usun pakiet jsreport.Types
  • Usun pakiet jsreport.Client
  • Zainstaluj pakiet IronPdf

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zastap LocalReporting z ChromePdfRenderer
  • Usun opakowanie RenderRequest
  • Usun opakowanie Template
  • Aktualizuj składnie miejsc docelowych (<span class='pageNumber'>{page})
  • Zastąp Handlebars interpolacją ciągów znaków w języku C#
  • Usun wywolania StartAsync() / KillAsync()
  • Zastap kopiowanie strumienia z BinaryData lub SaveAs()

Testowanie

  • Przetestuj wszystkie ścieżki generowania plików PDF
  • Sprawdź renderowanie nagłówków/stopek
  • Sprawdź numerację stron
  • Sprawdź odstępy marginesów
  • Testowanie na złożonych stronach CSS/JavaScript
  • Porównanie wydajności

Po migracji

  • Usuń pliki binarne jsreport
  • Usuń zależności Node.js, jeśli nie są już potrzebne
  • Aktualizacja skryptów wdrażania
  • Aktualizacja dokumentacji

Zwróć uwagęjsreport jest zarejestrowanym znakiem towarowym swojego właściciela. Ta witryna nie jest powiązana, zatwierdzona ani sponsorowana przez jsreport. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie