Przejdź do treści stopki
PRZEWODNIKI MIGRACJI

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

Przejście zjsreportnaIronPDFprzekształ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ść zjsreportna 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. Zarządzanie plikami binarnymi zewnętrznymi: Konieczne jest pobieranie i zarządzanie plikami binarnymi specyficznymi dla platform Windows, Linux i OSX za pomocą oddzielnych pakietów NuGet (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. Oddzielny proces serwera: Działa jako narzędzie lub serwer internetowy — wymagane jest dodatkowe zarządzanie procesami za pomocą metod cyklu życia StartAsync() i KillAsync().

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

  5. Złożona struktura żądania: Wymaga rozbudowanych obiektów RenderRequest z zagnieżdżonymi konfiguracjami Template nawet do prostego generowania plików PDF.

  6. Ograniczenia licencyjne: Wersja bezpłatna ogranicza liczbę szablonów; Skalowanie wymaga licencji komercyjnej.

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

Porównaniejsreporti 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 Stream 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 wdrożenie .NET 10 i C# 14 w latach 2025 i 2026,IronPDFzapewnia przyszłościową podstawę jako natywna biblioteka .NET bez zewnętrznych zależności środowiskowych.


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 Low
Ustawienia strony Low
Cykl życia serwera Low
Zarządzanie plikami binarnymi Low

Zmiana paradygmatu

Podstawową zmianą w tej migracjijsreportjest 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) → Stream → 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

# Removejsreportpackages
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
# Removejsreportpackages
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 alljsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
# Find alljsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
SHELL

Kompletna dokumentacija API

Mapowania klas

Klasajsreport OdpowiednikIronPDF
LocalReporting ChromePdfRenderer
ReportingService ChromePdfRenderer
RenderRequest Parametry metody
Template Parametry metody
Chrome RenderingOptions
Report PdfDocument
Engine (niepotrzebne)

Mapowanie metod

Metodajsreport OdpowiednikIronPDF
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ść szablonujsreport OdpowiednikIronPDF
Template.Content Pierwszy parametr do 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ściejsreportwymaga trzech pakietów NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), trzech importów przestrzeni nazw, wykonania wyłącznie asynchronicznego, płynnego łańcucha Builderów (LocalReporting().UseBinary().AsUtility().Create()), rozbudowanego RenderRequest z zagnieżdżonym obiektem Template określającym Recipe i Engine oraz ręczne kopiowanie strumienia do pliku za pomocą bloku using.

IronPDF sprowadza to do jednego pakietu NuGet, jednej przestrzeni nazw, trzech wierszy kodu i synchronicznego wykonywania. Metoda ChromePdfRenderer.RenderHtmlAsPdf() akceptuje bezpośrednio kod HTML i zwraca PdfDocument za pomocą prostej metody 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

Ten przykład podkreśla istotne ograniczenie w jsreport: nie ma bezpośredniej metody konwersji adresu URL na plik PDF. Kodjsreportmusi wykorzystywać obejście przekierowania JavaScript (window.location='https://example.com') osadzone w treści HTML w celu przechwycenia strony internetowej. To pośrednie podejście może zawieść w przypadku niektórych stron internetowych i powoduje niepotrzebne komplikacje.

IronPDF udostępnia dedykowaną metodę RenderUrlAsPdf(), która bezpośrednio renderuje dowolny adres URL z pełnym wykonaniem kodu JavaScript i obsługą nowoczesnych arkuszy CSS. Żadnych obejść, żadnych osadzonych skryptów — wystarczy podać adres URL. 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ściejsreportwymaga dodania obiektu Chrome do Template, ustawienia DisplayHeaderFooter = true oraz użycia szablonów HTML ze specjalnymi symbolami zastępczymi klas CSS (<span class='pageNumber'></span>, <span class='totalPages'></span>). Szablony nagłówków i stopek muszą zawierać pełne style wbudowane.

IronPDF zapewnia bardziej przejrzystą konfigurację TextHeaderFooter z dedykowanymi właściwościami dla CenterText, LeftText, RightText i FontSize. W miejsce numerów stron używa się prostszej składni {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.IronPDFużywa innej składni:

//jsreportplaceholders:
"<span class='pageNumber'></span>"  // or {#pageNum}
"<span class='totalPages'></span>"  // or {#numPages}

//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
//jsreportplaceholders:
"<span class='pageNumber'></span>"  // or {#pageNum}
"<span class='totalPages'></span>"  // or {#numPages}

//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
'jsreportplaceholders:
"<span class='pageNumber'></span>"  ' or {#pageNum}
"<span class='totalPages'></span>"  ' or {#numPages}

'IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
$vbLabelText   $csharpLabel

Zastąp Handlebars interpolacją ciągów znaków w C

jsreport często korzysta z szablonów Handlebars z Engine.Handlebars:

//jsreportHandlebars (DELETE THIS):
Template = new Template
{
    Content = "<h1>Hello, {{name}}</h1>",
    Engine = Engine.Handlebars
},
Data = new { name = "World" }

//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
//jsreportHandlebars (DELETE THIS):
Template = new Template
{
    Content = "<h1>Hello, {{name}}</h1>",
    Engine = Engine.Handlebars
},
Data = new { name = "World" }

//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports IronPdf

' jsreportHandlebars (DELETE THIS):
Dim template As New Template With {
    .Content = "<h1>Hello, {{name}}</h1>",
    .Engine = Engine.Handlebars
}

Dim data = New With {.name = "World"}

' IronPDF with VB.NET string interpolation:
Dim name As String = "World"
Dim html As String = $"<h1>Hello, {name}</h1>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

Uprość obsługę strumieni

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

//jsreportstream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
    report.Content.CopyTo(fileStream);
}

// Or for byte array:
using (var memoryStream = new MemoryStream())
{
    await report.Content.CopyToAsync(memoryStream);
    return memoryStream.ToArray();
}

//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
//jsreportstream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
    report.Content.CopyTo(fileStream);
}

// Or for byte array:
using (var memoryStream = new MemoryStream())
{
    await report.Content.CopyToAsync(memoryStream);
    return memoryStream.ToArray();
}

//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
Imports System.IO

'jsreportstream handling (DELETE THIS):
Using fileStream As FileStream = File.Create("output.pdf")
    report.Content.CopyTo(fileStream)
End Using

' Or for byte array:
Using memoryStream As New MemoryStream()
    Await report.Content.CopyToAsync(memoryStream)
    Return memoryStream.ToArray()
End Using

'IronPDFdirect access:
pdf.SaveAs("output.pdf")
' Or:
Dim bytes As Byte() = pdf.BinaryData
$vbLabelText   $csharpLabel

Rozwiązywanie problemów

Problem 1: Nie znaleziono LocalReporting

Problem: Kod odwołuje się do klasy LocalReporting, która nie istnieje w IronPDF.

Rozwiązanie: Zastąp przez 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 wykorzystuje obiekty opakowujące 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: Użycie składni symbolu zastępczegojsreport<span class='pageNumber'></span>.

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

//jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

//IronPDFsyntax
"Page {page} of {total-pages}"
//jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

//IronPDFsyntax
"Page {page} of {total-pages}"
'jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"

'IronPDFsyntax
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

Problem 4: Nie znaleziono pliku JsReportBinary

Problem: Odwołania do kodu JsReportBinary.GetBinary().

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

// DELETE thisjsreportpattern:
.UseBinary(JsReportBinary.GetBinary())

//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
// DELETE thisjsreportpattern:
.UseBinary(JsReportBinary.GetBinary())

//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

Lista kontrolna migracji

Przed migracją

  • Zidentyfikuj wszystkie instrukcjejsreportusing
  • 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

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

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zastąp LocalReporting przez ChromePdfRenderer
  • Usuń opakowanie RenderRequest
  • Usuń opakowanie Template
  • Zaktualizuj składnię symboli zastępczych (<span class='pageNumber'>{page})
  • Zastąp Handlebars interpolacją ciągów znaków w języku C#
  • Usuń wywołania StartAsync() / KillAsync()
  • Zastąp kopiowanie strumienia przez 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

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

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie