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:
-
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.
-
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). -
Oddzielny proces serwera: Dziala jako narzedzie lub serwer WWW—wymagane jest dodatkowe zarzadzanie procesami przy uzyciu
StartAsync()iKillAsync()metod zycia. -
Szablony JavaScript: Wymusza naukę Handlebars, JsRender lub innych systemów szablonów JavaScript zamiast korzystania z natywnych możliwości C#.
-
Zlozona struktura zadan: Wymaga rozbudowanych obiektow
RenderRequestz zagniezdzonymi konfiguracjamiTemplatenawet dla prostego generowania PDF. -
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.
- 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
- Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- 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
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"
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" .
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
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
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
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
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
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
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()
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
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
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}"
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)
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
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()
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)
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}"
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();
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
LocalReportingzChromePdfRenderer - 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
BinaryDatalubSaveAs()
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

