Generación de Informes con JasperReports en PHP

2
14970

Generación de Informes con JasperReports en PHP

Índice de contenidos.

1. Introducción

En un anterior tutorial de Alfonso
os mostrábamos la forma de invocar a informes de JasperReports desde una aplicación PHP. En esta ocasión vamos a extender el funcionamiento de la aplicación
para poder conectar el informe a una fuente de datos (base de datos) pasándole parámetros, etc.

Para implementar la solución he utilizado el código fuente GPL de http://zeronine.org/lab/index.php/Main_Page con algunas pequeñas modificaciones.

Este código contiene una aplicación web para la generación de informes. Todo el código cliente está en PHP excepto una clase Java encargada de la carga
de propiedades de la base de datos y la creación de la conexión JDBC. Esta clase será invocada desde la página PHP en el momento de la generación del informe.

La aplicación web es compatible para ejecutarse en un servidor web Tomcat. Se define en el web.xml la configuración necesaria para que funcione el código PHP
con el puente. Manos a la obra.

Para descargar el código fuente del tutorial pincha aquí

2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM, 320 GB HD).
  • Sistema operativo: Windows 7
  • PHP-Java-Bridge 6.1.2.1
  • JasperReports 3.5.3
  • PHP 5.3.2
  • Tomcat 6.0.13

3. Configuración

El código fuente del tutorial corre en un Apache Tomcat sin necesidad de tener el JavaBridge.war instalado, esto lo explicamos en otro
tutorial. La opción que explicábamos
en ese tutorial servía para montar el puente PHP-Java en un Tomcat. En esta ocasión añadiremos las librerías del PHP-Java Bridge a nuestro proyecto para
no depender de cómo esté configurado el servidor web, es decir si está corriendo el JavaBridge.war en el mismo servidor.
Esto lo hacemos para que la instalación de nuestra aplicación sea mucho más sencilla porque todos los recursos los incluiremos en nuestro war.

Lo primero será añadir al directorio /lib de nuestro proyecto los jars del puente php-java que sacaremos del war que nos descargamos de la página
web oficial (http://php-java-bridge.sourceforge.net/pjb/). En concreto debemos añadir los siguientes: JavaBridge.jar, php-script.jar y php-servlet.jar. Además
de estas librerías también son necesarias las de jasperReports, jfreeChart, Apache POI (exportación a Excel), etc.

Por otro lado tenemos que añadir a nuestro web.xml los siguientes recursos encargados de la comunicación entre PHP y Java:

4. Código fuente

El código fuente en PHP se divide en 2 fuentes: jasperReport.php y loader.php.

El jasperReport.php contiene funciones para realizar las operaciones de carga del informe,
compilación, ejecución y exportación. Exporta el informe a tres formatos: PDF, XLS y binario.

Desde el anterior código se utiliza una clase denominada JdbcConnection.java encargada de la carga de las propiedades de la base de datos que
definamos en un .properties y de crear la conexión JDBC.

El fichero .properties donde guardamos las propiedades de la base de datos es:

El loader.php se encarga de recoger la lista de parámetros que van en la request y crear el mapa de parámetros del report. Llama a las distintas
funciones de jasperReports.php para la compilación y ejecución del informe. Aquí se definen algunos parámetros como el nombre del esquema de la base
de datos, por si tuviéramos varios y quisiéramos llamar a otro, y el directorio donde se encuentran los informes. También se definen dos variables
que indican la ruta al Java.inc ($javaBridge) y el directorio donde están las librerías (en nuestro caso en WEB-INF/lib. Para nuestra configuración
las dejamos en blanco.

Por último creamos una página de pruebas que simula un formulario con algunos parámetros a enviar al informe, en nuestro ejemplo únicamente un título. También
sacamos un combo para seleccionar el formato del informe (PDF ó Excel) y el nombre del informe en otro combo. Si el título contuviera espacios habría que escaparlos ya que van en la URL y fallaría.

La página de pruebas es la siguiente:

El ejemplo recoge a través de una función JavaScript los parámetros del formulario y los añade a la url de un popup el cual realiza la llamada al loader.php que
nos devuelve el informe en el formato escogido. Lo más importante es la generación de la url y los parámetros pasados al loader.php:

http://localhost:8080/jasperreports/loader.php?type=pdf&report=informe1&title=AdictosAlTrabajo

  • type: Formato del informe. Aceptados pdf, xls y object
  • report: Nombre del informe. Se corresponde con el nombre físico del informe, en este caso informe1.jrxml
  • title:: Parámetro title (en el informe se recoge con $P{title}). A continuación se pueden añadir más parámetros separados con &

5. Conclusiones

Como hemos visto, la posibilidad de ejecutar informes de JasperReports desde código PHP es posible. Seguro que se puede extender y generalizar mucho más el ejemplo
pero como prueba de concepto es suficiente. Espero que os resulte de ayuda.

Un saludo. Juan.

2 Comentarios

  1. Hola Juan, he seguido tu articulo al pie de la letra pero no he podido llegar al final con todo funcionando. En este momento me esta saliendo el siguiente error.

    Agradezco tu ayuda. Tengo cierta experiencia con php pero con Java soy un completo novato.

    Segun lo que puedo deducir es por una mala ubicacion del archivo JdbcConnector.java, pero no se donde ponerlo.

    java stack trace: java.lang.Exception: CreateInstance failed: new com.autentia.utils.JdbcConnector. Cause: java.lang.ClassNotFoundException: com.autentia.utils.JdbcConnector VM: 1.6.0_20@http://java.sun.com/ at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at php.java.bridge.Util.classForName(Util.java:1512) at php.java.bridge.JavaBridge.CreateObject(JavaBridge.java:435) at php.java.bridge.Request.handleRequest(Request.java:458) at php.java.bridge.Request.handleRequests(Request.java:500) at php.java.bridge.http.ContextRunner.run(ContextRunner.java:140) at php.java.bridge.ThreadPool$Delegate.run(ThreadPool.java:60) Caused by: java.lang.ClassNotFoundException: com.autentia.utils.JdbcConnector … 10 more

  2. Buenos Dias.. me parecen geniales vuestros aportes a todo este tema.. me gustaria saber si me pudierais decir .. en vez de utilizar una base de dagtos, como pordira hacerlo para leer un fichero JSON????
    Existen ejemplos????

    Gracias de todas formas,

Dejar respuesta

Please enter your comment!
Please enter your name here