Generación de reportes en Laravel 5 con JasperPHP (JasperReports)

martes, agosto 23, 2016
Banner Reportes

El desarrollo web con PHP hasta los momentos ha carecido de una herramienta realmente completa y eficiente para la generación de reportes. Poco tiempo atrás si me hubieran pedido alguna recomendación para generar reportes desde PHP la respuesta hubiera sido clara: FPDF. Pero recientemente debido a mi incursión con Java por motivos laborales, he tenido contacto directo con JasperReports.

JasperReports es una librería de creación de reportes que permite la exportación a diversos formatos tales como PDF, HTML, XLS, CSV y XML. Es una herramienta que considero bastante potente. En ésta entrada puedes ver cómo generar un reporte con esta librería.

Buscando y buscando encontré un paquete llamado JasperPHP que permite generar reportes con el uso de JasperReports a través de la herramienta de linea de comandos JasperStarter. Este paquete podemos instalarlo en nuestro proyecto en PHP, en este caso te muestro como hacerlo con un proyecto en Laravel 5, pero no debería ser muy diferente su uso sin el empleo de Laravel.


Puedes ver una actualización de esta entrada ingresando aquí.


Requerimientos mínimos para Instalar JasperPHP


Instalación de JasperPHP en Laravel 5

Para usar este paquete en Laravel 5 lo primero que debemos es tener instalado Composer. Luego ingresar en el proyecto desde la linea de comandos y ejecutar el siguiente comando:

composer require cossou/jasperphp

Luego actualizamos para que se descargue (a mi me tardó un poco en descargar, pero mi internet es de -0kb así que no creo que a ustedes les pase xD):

composer update

¡Y listo! Con eso lo tendrás instalado el paquete.

Uso de JasperPHP en Laravel 5

Si nunca han usado JasperReports pueden ver ésta entrada donde les muestro como crear un reporte en JasperReports desde cero. Les recomiendo Jaspersoft Studio para tal fin. En ésta entrada para demostrar el uso de JasperPHP vamos a utilizar el reporte de ejemplo que viene con el paquete y se encuentra en la ruta vendor/cossou/jasperphp/examples/hello_world.jrxml.

Inicialmente tienes que añadir la librería donde la vas a usar (para este ejemplo en routes.php):

use JasperPHP\JasperPHP as JasperPHP; 

La clase nos provee un método para compilar los reportes llamado compile() y se usa de la siguiente manera (no es necesario este paso si lo hace antes desde un programa como Jaspersoft Studio):

Route::get('/compilar', function () {
    // Crear el objeto JasperPHP
    $jasper = new JasperPHP;
    
    // Compilar el reporte para generar .jasper
    $jasper->compile(base_path() .
    '/vendor/cossou/jasperphp/examples/hello_world.jrxml')->execute();
   
    return view('welcome');
});

Una vez que tengas el archivo .jasper generado puedes ejecutar tu reporte:

Route::get('/reporte', function () {
    // Crear el objeto JasperPHP
    $jasper = new JasperPHP;
    
    // Generar el Reporte
    $jasper->process(
        // Ruta y nombre de archivo de entrada del reporte
        base_path() .
        '/vendor/cossou/jasperphp/examples/hello_world.jasper', 
        false, // Ruta y nombre de archivo de salida del reporte (sin extensión)
        array('pdf', 'rtf'), // Formatos de salida del reporte
        array('php_version' => phpversion()) // Parámetros del reporte
    )->execute();
   
    return view('welcome');
});

Depuración de errores con JasperPHP

Uno de los errores frecuentes al usar la librería es que no tengamos permisos suficientes para escribir en el directorio donde se genera el reporte. Asegúrese de tener permisos de escritura en la ruta vendor/cossou/jasperphp/examples/.

De igual forma luego de seguir todos los pasos al pie de la letra puede ser que veas el siguiente error:

Exception in JasperPHP.php line 178:

Your report has an error and couldn't be processed! Try to output the command using the function `output();` and run it manually in the console.


La clase JasperPHP nos provee una función llamada output() que nos retorna el comando que se esta tratando de ejecutar al generar el reporte. Para poder depurar este comando directamente desde el código lo puedes hacer copiando el siguiente fragmento justo debajo de la generación de tu reporte:

    // Depuración de errores
    exec($jasper->output().' 2>&1', $output);
    print_r($output);

De esta manera podrás visualizar el error específico que te está ocurriendo.


La verdad que este paquete me ha ahorrado mucho tiempo que antes gastaba construyendo reportes desde PHP. Diría que es unir lo mejor de dos mundos. Espero que también te pueda servir. Cualquier duda o aporte te invito a que la dejes en los comentarios :).

También te puede interesar

Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!


12 comentarios

  1. Excelente publicación. Sólo tengo una consulta
    Luego de seguir todos los pasos al pie de la letra y generar el reporte no me genera el archivo pdf ni tampoco me muestra algún error. Al usar la función output() me muestra el siguiente mensaje:

    Array ( [0] => /home/vagrant/Code/reportesjasper/vendor/cossou/jasperphp/src/JasperPHP/../JasperStarter/bin/jasperstarter: 26: /home/vagrant/Code/reportesjasper/vendor/cossou/jasperphp/src/JasperPHP/../JasperStarter/bin/jasperstarter: java: not found )

    Ya verifique que tenga instalado java también verifique que el reporte funcionara con Jaspersoft Studio estoy usando laravel 5.3 y Homestead. Alguna idea de por que ocurre esto lo extraño es que también lo he probado en Xampp y funciona sin problemas.

    ResponderEliminar
    Respuestas
    1. Disculpa la demora en responder, no se si ya sea útil dejar esto por aquí. Te cuento que no he trabajado con Homestead, trabajo en un servidor con Xampp... Pero el error parece indicar que no está reconociendo los comandos de java... Podrías verificar si el comando "java -version" se reconoce desde la terminal, esto debería darte una idea para descartar que ese sea le problema... Si lo reconoce intenta ejecutar el reporte de forma manual desde el terminal con el comando jasperstarter. Saludos y gracias por comentar!

      Eliminar
  2. Podrias hacer un ejemplo completo de como usar esta herramienta. Tambien en como generar un reporte personalizado como una cotizacion. Lo necesito muxho y no hay eso en la web. Gracias muy buena informacion

    ResponderEliminar
    Respuestas
    1. Seguro lo voy a hacer. Es una herramienta muy útil que uso en mi día a día. Gracias por tu comentario :)

      Eliminar
  3. Liliana Excelente ...!!! hace tiempo andaba buscando algo asi, ahora tengo un problema en windows Xampp todo anda más que bien, el tema es cuando lo subo a un apache linux, con la java instalada, no arroja ningún error y tampoco lo compila, has tenido ese problema, desde ya gracias por la herramienta.

    ResponderEliminar
    Respuestas
    1. Hola! Pues precisamente en Linux + Apache es que lo estoy usando en éste momento. Conociendo un poco Linux, asegurate de que no sea un problema de permisos en la carpeta de tu aplicación para generar el archivo. Gracias por comentar!

      Eliminar
    2. hola, buenas si yo estuve viendo este otro paquete https://github.com/copam/phpjasper y para ese caso si recomienda asignarle el 777 al directorio /vendor/copam/phpjasper/src/JasperStarter/bin o al arquivo binário jasperstarter

      Eliminar
  4. Por favor tengo una consulta, he utilizado jasperreports pero siempre desde aplicaciones java, ahora necesito implementar en php con laravel pero no se como se puede hacer para pasar datos de un listado y que los mismos se reflejen en una tabla o subreporte. Estuve intentando pasar como json pero no puedo iterar sobre la lista para desplegarlos. Si te has topado con ese problema y tienes una posible solución te agradeceria muchisimo si lo compartes. Muchas gracias

    ResponderEliminar
    Respuestas
    1. Saludos Alex!
      Super interesante tu pregunta, no lo había hecho hasta ahora pero me dió curiosidad y buscando un poco encontre ésto: http://community.jaspersoft.com/wiki/how-create-report-uses-remote-json-data-source
      Luego de probarlo estoy segura de que en cualquier momento me puede ser de utilidad.
      Gracias por comentar y espero que el link te sirva a ti también.

      Eliminar
  5. Buenísimo ejemplo, y muy fácil de seguir.
    Para alguien que no tiene mucha experiencia con Laravel ni Jasper debo decir que tarde muy poco en implementar un reporte sencillo.
    Como recomendación podrías añadir el link a la documentación de la librería para que si alguien también tuviera una duda mas concreta se pueda referir en ella.
    Saludos!

    ResponderEliminar
    Respuestas
    1. Me alegra Jorge! gracias por la recomendación, los links a la documentación de la librería ya están como enlaces en la descripción de la entrada. Sin embargo, voy a intentar mejorar su ubicación para que tengan más visibilidad. Un saludo!

      Eliminar
  6. Excelente publicacion Lilian yo trabajo con el Framework Openxava donde uso extensamente Ireport, lo cual es excelente hasta ahora y ahora estoy desarrollando con Laravel, extraordinario Framework y estaba buscando algo como esto. voy a probar y comentare mis experiencias. Gracias por tu colaboracion !!!!

    ResponderEliminar

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!