Cómo migrar de jsreport a IronPDF en C#
La migración de jsreportaIronPDFtransforma su flujo de trabajo PDF .NET de un sistema dependiente de Node.js con gestión binaria externa y procesos de servidor independientes a una biblioteca .NET pura que se ejecuta completamente en el proceso. Esta guía proporciona una ruta de migración completa y paso a paso que elimina la complejidad de la infraestructura y los requisitos de plantillas de JavaScript para desarrolladores .NET profesionales.
Por qué migrar de jsreporta IronPDF
Los retos de jsreport
jsreport introduce una complejidad que no tiene cabida en un entorno .NET puro:
Dependencia de Node.js: requiere el entorno de ejecución y los binarios de Node.js, lo que agrega complejidad de infraestructura a lo que debería ser una aplicación .NET sencilla.
Administración binaria externa: debe descargar y administrar binarios específicos de la plataforma para Windows, Linux y OSX a través de paquetes NuGet separados (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX).Proceso de servidor independiente: se ejecuta como una utilidad o un servidor web; se requiere una gestión de procesos adicional con los métodos de ciclo de vida
StartAsync()yKillAsync().Plantillas de JavaScript: obliga a aprender Handlebars, JsRender u otros sistemas de plantillas de JavaScript en lugar de utilizar las capacidades nativas de C#.
Estructura de solicitud compleja: requiere objetos <código>RenderRequest</códigodetallados con configuraciones
Plantillaanidadas incluso para la generación de PDF simples.Limitaciones de licencia: el nivel gratuito limita la cantidad de plantillas; el escalado requiere licencia comercial.
- Salida basada en secuencias: devuelve secuencias que requieren operaciones manuales de archivos y gestión de secuencias de memoria.
Comparación entre jsreporte IronPDF
| Característica | jsreport | IronPDF |
|---|---|---|
| Tiempo de ejecución | Node.js + .NET | .NET puro |
| Gestión binaria | Manual (paquetes jsreport.Binary) | Automático |
| Proceso de servidor | Requerido (utilidad o servidor web) | En proceso |
| Plantillas | JavaScript (Handlebars, etc.) | C# (Razor, interpolación de cadenas) |
| Estilo API | Objetos de solicitud verbosos | Métodos limpios y fluidos |
| Salida | Enviar a | Objeto PdfDocument |
| Manipulación de PDF | Limitado | Extensivo (combinar, dividir, editar) |
| Soporte de Async | Sólo asíncrono | Tanto sync como async |
Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFproporciona una base preparada para el futuro como biblioteca nativa de .NET sin dependencias de tiempo de ejecución externas.
Evaluación de la complejidad de la migración
Esfuerzo estimado por función
| Característica | Complejidad de la migración | Notas |
|---|---|---|
| HTML a PDF | Muy bajo | Sustitución directa de métodos |
| URL a PDF | Muy bajo | Método directo, sin complicaciones |
| Encabezados/pies de página | Bajo | Cambio de sintaxis del marcador de posición |
| Configuración de la página | Bajo | Mapeo de propiedades |
| Ciclo de vida del servidor | Bajo | Eliminar por completo |
| Gestión binaria | Bajo | Eliminar por completo |
Cambio de paradigma
El cambio fundamental en esta migración de jsreportes de objetos de solicitud detallados con administración del servidor a simples llamadas a métodos en proceso:
using IronPdf; jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Transmisión → Archivo IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → Guardar como() using IronPdf;
Antes de empezar
Prerrequisitos
- Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acceso a NuGet: Capacidad para instalar paquetes NuGet
- Licencia de IronPDF: Obtenga su clave de licencia en ironpdf.com
Cambios en el paquete NuGet
using IronPdf;bash
Remove jsreportpackages
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 using IronPdf;
Configuración de licencias
using IronPdf;csharp // Add at application startup (Program.cs or Startup.cs) IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; using IronPdf;
Identificar el uso de jsreport
using IronPdf;bash
Find all jsreportreferences
grep -r "using jsreport|LocalReporting|RenderRequest|RenderAsync" --include=".cs" . grep -r "JsReportBinary|Template|Recipe|Engine." --include=".cs" . using IronPdf;
Referencia completa de la API
Clases
| clase jsreport | Equivalente de IronPDF | Notas |
|---|---|---|
Información local | <código>ChromePdfRenderer</código | Renderizador principal |
Servicio de informes | <código>ChromePdfRenderer</código | Misma clase |
| <código>RenderRequest</código | Parámetros del método | No se necesita wrapper |
Plantilla | Parámetros del método | No se necesita wrapper |
| <código>Chrome</código | <código>RenderingOptions</código | Opciones de Chrome |
Informe | Documento PDF | Objeto resultante |
Motor | (no es necesario) | C# para plantillas |
Métodos
| método jsreport | Equivalente de IronPDF | Notas |
|---|---|---|
| <código>LocalReporting().UseBinary().AsUtility().Create()</código | <código>new ChromePdfRenderer()</código | Una línea |
| <código>rs.RenderAsync(request)</código | renderer.RenderHtmlAsPdf(html) | Llamada directa |
rs.StartAsync() | (no es necesario) | En proceso |
rs.KillAsync() | (no es necesario) | Limpieza automática |
report.Content.CopyTo(stream) | pdf.SaveAs(path) o pdf.BinaryData | Acceso directo |
Mapeo de propiedades de RenderRequest
| propiedad de la plantilla jsreport | Equivalente de IronPDF | Notas |
|---|---|---|
Plantilla.Contenido | Primer parámetro de RenderHtmlAsPdf() | Cadena HTML directa |
Plantilla.Receta = Receta.ChromePdf | (no es necesario) | Siempre ChromePdf |
Template.Engine = Engine.None | (no es necesario) | Uso de plantillas de C# |
| <código>Chrome.HeaderTemplate</código | RenderingOptions.TextHeader o HtmlHeader | Encabezados HTML |
| <código>Chrome.FooterTemplate</código | RenderingOptions.TextFooter o HtmlFooter | Pies de página HTML |
| <código>Chrome.DisplayHeaderFooter</código | (automático)_ | Cabeceras activadas automáticamente |
Chrome.MarginTop | <código>RenderingOptions.MarginTop</código | En milímetros |
Mapeo de marcadores de posición (encabezados/pies de página)
| jsreportMarcador de posición | Marcador de posición IronPDF | Notas |
|---|---|---|
<span> class="pageNumber"></span> | {page} | Página actual |
<span> class="totalPages"></span> | {total de páginas} | Total de páginas |
{#pageNum} | {page} | Página actual |
{#numPages} | {total de páginas} | Total de páginas |
{#timestamp} | {fecha} | Fecha actual |
Ejemplos de migración de código
Ejemplo 1: HTML básico a PDF
Antes (jsreport):
using IronPdf;csharp // 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!");
}} using IronPdf;
Después (IronPDF):
using IronPdf;csharp // NuGet: Install-Package IronPdf using IronPdf; using System;
class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("
Hello from IronPDF
This is a PDF document.
"); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created successfully!"); } } using IronPdf;El enfoque de jsreportrequiere tres paquetes NuGet (jsreport.Binary, jsreport.Local, jsreport.Types), tres importaciones de espacios de nombres, ejecución sólo asíncrona, una cadena constructora fluida (LocalReporting().UseBinary().AsUtility().Create()), un verborreico <código>RenderRequest</códigocon un objeto Plantillaanidado que especifica Recipe y Engine, y copia manual de flujo a archivo con un bloque using.
IronPDF reduce todo esto a un paquete NuGet, un espacio de nombres, tres líneas de código y ejecución sincrónica. El método ChromePdfRenderer.RenderHtmlAsPdf() acepta HTML directamente y devuelve un Documento PDFcon un sencillo método SaveAs(). Consulte la documentación HTML a PDF para obtener más opciones de conversión.
Ejemplo 2: URL a PDF
Antes (jsreport):
using IronPdf;csharp // 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!");
}} using IronPdf;
Después (IronPDF):
using IronPdf;csharp // 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!"); } } using IronPdf;
Este ejemplo pone de manifiesto una importante limitación de jsreport: no existe un método directo de URL a PDF. El código de jsreportdebe utilizar una solución de redirección de JavaScript (window.location='https://example.com') incrustada en contenido HTML para capturar una página web. Este enfoque indirecto puede fallar con determinados sitios web y añade una complejidad innecesaria.
IronPDF proporciona un método dedicado RenderUrlAsPdf() que renderiza directamente cualquier URL con ejecución completa de JavaScript y soporte moderno de CSS. No hay soluciones, no hay scripts incrustados, sólo hay que pasar la URL. Más información sobre Conversión de URL a PDF.
Ejemplo 3: PDF con encabezados y pies de página
Antes (jsreport):
using IronPdf;csharp // 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!");
}} using IronPdf;
Después (IronPDF):
using IronPdf;csharp // 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!");
}} using IronPdf;
El enfoque de jsreportrequiere añadir un objeto <código>Chrome</códigoa la Template, establecer DisplayHeaderFooter = true y utilizar plantillas HTML con marcadores de posición de clase CSS especiales (<span> class="pageNumber"></span>, <span> class="totalPages"></span>). Las plantillas de encabezado y pie de página deben incluir un estilo en línea completo.
IronPDF proporciona una configuración más limpia de TextHeaderFooter con propiedades dedicadas para CenterText, LeftText, RightText y FontSize. Los marcadores de posición de número de página utilizan la sintaxis más sencilla {page}y {total-pages}. Consulte la documentación sobre encabezados y pies de página para conocer las opciones de encabezado HTML.
Notas de migración críticas
Eliminar la gestión del ciclo de vida del servidor
jsreport requiere una gestión explícita del ciclo de vida del servidor:
using IronPdf;csharp // 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(); using IronPdf;
IronPDF se ejecuta completamente en proceso: sin inicio de servidor, sin gestión de procesos, sin limpieza:
using IronPdf;csharp // IronPDF: var renderer = new ChromePdfRenderer(); // Just use it—no lifecycle management needed using IronPdf;
Eliminar paquetes binarios específicos de la plataforma
jsreport requiere paquetes NuGet independientes para cada plataforma de destino:
using IronPdf;bash
DELETE these platform-specific packages:
dotnet remove package jsreport.Binary dotnet remove package jsreport.Binary.Linux dotnet remove package jsreport.Binary.OSX using IronPdf;
IronPDF gestiona automáticamente todos los requisitos de la plataforma a través de un único paquete NuGet.
Actualización de la sintaxis de los marcadores de posición
jsreport utiliza marcadores de posición CSS basados en clases o llaves.IronPDFutiliza una sintaxis diferente:
using IronPdf;csharp // jsreportplaceholders: "" // or {#pageNum} "" // or {#numPages}
//IronPDFplaceholders: "{page}" "{total-pages}" "{date}" "{html-title}" using IronPdf;
Sustituir manillas con interpolación de cadenas en C
jsreport utiliza a menudo plantillas Handlebars con Engine.Handlebars:
using IronPdf;csharp // jsreportHandlebars (DELETE THIS): Template = new Template { Content = "
Hello, {{name}}
", Engine = Engine.Handlebars }, Data = new { name = "World" }//IronPDFwith C# string interpolation: string name = "World"; string html = $"
Hello, {name}
"; var pdf = renderer.RenderHtmlAsPdf(html); using IronPdf;Simplificar el manejo de flujos
jsreport devuelve un flujo que requiere copia manual:
using IronPdf;csharp // 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; using IronPdf;
Solución de problemas
Asunto 1: LocalReporting Not Found
Problema: el código hace referencia a la clase Información localque no existe en IronPDF.
Solución: Reemplazar con <código>ChromePdfRenderer</código:
using IronPdf;csharp // jsreport var rs = new LocalReporting().UseBinary().AsUtility().Create();
// IronPDF var renderer = new ChromePdfRenderer(); using IronPdf;
Edición 2: RenderRequest no encontrado
Problema: el código utiliza objetos envolventes <código>RenderRequest</códigoy Plantilla.
Solución: Pasar HTML directamente a los métodos de renderizado:
using IronPdf;csharp // jsreport await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });
// IronPDF var pdf = renderer.RenderHtmlAsPdf(html); using IronPdf;
Asunto 3: Los números de página no aparecen
Problema: uso de la sintaxis de marcador de posición jsreport<span> class="pageNumber"></span> .
Solución: Actualizar la sintaxis del marcador de posición IronPDF:
using IronPdf;csharp // jsreportsyntax (won't work) "Page of "
//IronPDFsyntax "Page {page} of {total-pages}" using IronPdf;
Edición 4: JsReportBinary no encontrado
Problema: El código hace referencia JsReportBinary.GetBinary() .
Solución: eliminar por completo:IronPDFno requiere archivos binarios externos:
using IronPdf;csharp // DELETE this jsreportpattern: .UseBinary(JsReportBinary.GetBinary())
//IronPDFneeds nothing—just create the renderer: var renderer = new ChromePdfRenderer(); using IronPdf;
Lista de comprobación de la migración
Pre-Migración
- Identificar todos los jsreport
usingdeclaraciones - Plantillas de lista usando Handlebars/JsRender (convertir a interpolación de cadenas de C#)
- Documentar las opciones actuales de Chrome utilizadas (márgenes, tamaño del papel)
- Verificar el modo servidor web frente al modo utilidad (ambos pasan a estar en proceso)
- Nota: paquetes binarios específicos de la plataforma (eliminar todos)
- Obtener la clave de licencia de IronPDF
Cambios en el paquete
- Eliminar el paquete
jsreport.Binary - Eliminar el paquete
jsreport.Binary.Linux - Eliminar el paquete
jsreport.Binary.OSX - Eliminar el paquete
jsreport.Local - Eliminar el paquete
jsreport.Types - Eliminar el paquete
jsreport.Client - Instalar el paquete
IronPdf
Cambios de código
- Agregar configuración de clave de licencia al inicio
- Reemplazar
Información localconChromePdfRenderer - Eliminar el contenedor
RenderRequest - Eliminar el contenedor
Template - Actualizar la sintaxis del marcador de posición (
<span> class="pageNumber">→{page}) - Reemplazar Handlebars con interpolación de cadenas C#
- Eliminar llamadas
StartAsync()/KillAsync() - Reemplace la copia de flujo con
BinaryDataoSaveAs()
Pruebas
- Probar todas las rutas de generación de PDF
- Verificar la representación del encabezado/pie de página
- Verificar la numeración de páginas
- Validar el espaciado de márgenes
- Prueba con páginas CSS/JavaScript complejas
- Rendimiento de referencia
Posmigración
- Eliminar archivos binarios de jsreport
- Eliminar las dependencias de Node.js si ya no son necesarias
- Actualizar scripts de implementación
- Actualización de la documentación






