Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de jsreport a IronPDF en C#

Migrar de jsreporta IronPDF: Guía completa de migración a 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:

  1. Dependencia de Node.js: Requiere el tiempo de ejecución y los binarios de Node.js, lo que añade complejidad de infraestructura a lo que debería ser una aplicación .NET sencilla.

  2. Gestión de binarios externos: Debe descargar y gestionar binarios específicos de plataforma para Windows, Linux y OSX a través de paquetes NuGet independientes (jsreport.Binary, jsreport.Binary.Linux, jsreport.Binary.OSX).

  3. 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() y KillAsync().

  4. JavaScript Templating: Obliga a aprender Handlebars, JsRender u otros sistemas de plantillas JavaScript en lugar de utilizar las capacidades nativas de C#.

  5. Estructura de solicitud compleja: Requiere verborreicos objetos <código>RenderRequest</códigocon configuraciones Plantillaanidadas incluso para la generación de PDF sencillos.

  6. Limitaciones de licencia: La capa gratuita limita el número de plantillas; el escalado requiere licencia comercial.

  7. Salida basada en flujos: Devuelve flujos que requieren operaciones manuales de archivos y gestión de flujos de memoria.

Comparación entre jsreporte IronPDF

CaracterísticajsreportIronPDF
Tiempo de ejecuciónNode.js + .NET.NET puro
Gestión binariaManual (paquetes jsreport.Binary)Automático
Proceso de servidorRequerido (utilidad o servidor web)En proceso
PlantillasJavaScript (Handlebars, etc.)C# (Razor, interpolación de cadenas)
Estilo APIObjetos de solicitud verbososMétodos limpios y fluidos
SalidaEnviar aObjeto PdfDocument
Manipulación de PDFLimitadoExtensivo (combinar, dividir, editar)
Soporte de AsyncSólo asíncronoTanto 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ísticaComplejidad de la migraciónNotas
HTML a PDFMuy bajoSustitución directa de métodos
URL a PDFMuy bajoMétodo directo, sin complicaciones
Encabezados/pies de páginaBajoCambio de sintaxis del marcador de posición
Configuración de la páginaBajoMapeo de propiedades
Ciclo de vida del servidorBajoEliminar por completo
Gestión binariaBajoEliminar por completo

Cambio de paradigma

El cambio fundamental en esta migración de jsreportes de verbosos objetos de solicitud con gestión de servidor a simples llamadas a métodos en proceso:

using IronPdf; jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Enviar a→ File IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs() using IronPdf;


Antes de empezar

Prerrequisitos

  1. <Entorno .NET: .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet: Capacidad para instalar paquetes NuGet
  3. Licencia 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 jsreportEquivalente de IronPDFNotas
Información local<código>ChromePdfRenderer</códigoRenderizador principal
Servicio de informes<código>ChromePdfRenderer</códigoMisma clase
<código>RenderRequest</códigoParámetros del métodoNo se necesita wrapper
PlantillaParámetros del métodoNo se necesita wrapper
<código>Chrome</código<código>RenderingOptions</códigoOpciones de Chrome
InformeDocumento PDFObjeto resultante
Motor(no es necesario)C# para plantillas

Métodos

método jsreportEquivalente de IronPDFNotas
<código>LocalReporting().UseBinary().AsUtility().Create()</código<código>new ChromePdfRenderer()</códigoUna línea
<código>rs.RenderAsync(request)</códigorenderer.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.BinaryDataAcceso directo

Mapeo de propiedades de RenderRequest

propiedad de la plantilla jsreportEquivalente de IronPDFNotas
Plantilla.ContenidoPrimer 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ódigoRenderingOptions.TextHeader o HtmlHeaderEncabezados HTML
<código>Chrome.FooterTemplate</códigoRenderingOptions.TextFooter o HtmlFooterPies de página HTML
<código>Chrome.DisplayHeaderFooter</código(automático)_Cabeceras activadas automáticamente
Chrome.MarginTop<código>RenderingOptions.MarginTop</códigoEn milímetros

Mapeo de marcadores de posición (encabezados/pies de página)

jsreportMarcador de posiciónMarcador de posición IronPDFNotas
<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: Sustituir por ChromePdfRenderer:

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 los objetos <código>RenderRequest</códigoy Template.

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 de jsreport<span> class="pageNumber"></span>.

Solución: Actualización de la sintaxis de los marcadores de posición de 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 a JsReportBinary.GetBinary().

Solución: Eliminar por completoIronPDFno requiere 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 todas las declaraciones jsreportusing
  • [ ] Plantillas de listas utilizando Handlebars/JsRender (convertir a interpolación de cadenas en C#)
  • [ ] Documente las opciones actuales de Chrome utilizadas (márgenes, tamaño de papel)
  • [ ] Comprobación de servidor web frente a modo de utilidad (ambos se convierten en proceso)
  • [ ] Tenga en cuenta los paquetes binarios específicos de cada plataforma (suprímalos 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

  • [ ] Añadir configuración de clave de licencia al inicio
  • [ ] Sustituya Información localpor ChromePdfRenderer
  • [ ] Eliminar la envoltura RenderRequest
  • [ ] Eliminar Plantillawrapper
  • [ ] Actualizar la sintaxis de los marcadores de posición (<span> class="pageNumber">{page})
  • [ ] Sustituir Handlebars por interpolación de cadenas en C#
  • [ ] Eliminar las llamadas StartAsync() / KillAsync()
  • [ ] Sustituya la copia de flujos por BinaryData o SaveAs()

Pruebas

  • [ ] Probar todas las rutas de generación de PDF
  • [ ] Verificar el renderizado de encabezado/pie de página
  • [ ] Comprobar la numeración de las páginas
  • [ ] Validar el espaciado entre márgenes
  • [ ] Prueba con páginas CSS/JavaScript complejas
  • [Rendimiento de referencia

Posmigración

  • [ ] Eliminar archivos binarios de jsreport
  • [ ] Elimine las dependencias de Node.js si ya no son necesarias
  • [ ] Actualización de scripts de despliegue
  • [ ] Actualización de la documentación

Conclusión

La migración de jsreportaIronPDFelimina la complejidad de las dependencias de Node.js, la gestión de binarios externos y la gestión del ciclo de vida del servidor. El cambio de paradigma de verborreicos objetos <código>RenderRequest</códigoa simples llamadas a métodos reduce significativamente el volumen de código a la vez que mantiene todas las capacidades de generación de PDF.

Los cambios clave en esta migración son:

  1. Runtime: Node.js + .NET→ Pure .NET
  2. Proceso de servidor: Requerido → En proceso (eliminado)
  3. Gestión binaria: Paquetes de plataforma manuales → Automáticos
  4. Templating: JavaScript (Handlebars) → C# (interpolación de cadenas)
  5. Estilo de la API: Objetos de solicitud verbosos → Métodos fluidos limpios
  6. Placeholders: <span> class="pageNumber">{page}

Explore la documentación completa de IronPDF, tutoriales y referencia de API para acelerar su migración a jsreport.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más