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:
-
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.
-
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). -
Oddzielny proces serwera: Działa jako narzędzie lub serwer internetowy — wymagane jest dodatkowe zarządzanie procesami za pomocą metod cyklu życia
StartAsync()iKillAsync(). -
Szablony JavaScript: Wymusza naukę Handlebars, JsRender lub innych systemów szablonów JavaScript zamiast korzystania z natywnych możliwości C#.
-
Złożona struktura żądania: Wymaga rozbudowanych obiektów
RenderRequestz zagnieżdżonymi konfiguracjamiTemplatenawet do prostego generowania plików PDF. -
Ograniczenia licencyjne: Wersja bezpłatna ogranicza liczbę szablonów; Skalowanie wymaga licencji komercyjnej.
- 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
- Ś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
# 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
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 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" .
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
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ś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
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
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
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ś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()
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.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}"
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)
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
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()
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)
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}"
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();
Lista kontrolna migracji
Przed migracją
- Zidentyfikuj wszystkie instrukcjejsreport
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
- 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
LocalReportingprzezChromePdfRenderer - 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
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

