icono_twiter icono LinkedIn
Juan Alonso Ramos

Consultor tecnológico de desarrollo de proyectos informáticos.

Ingeniero en Informática, especialidad en Ingeniería del Software

Puedes encontrarme en Autentia: Ofrecemos de servicios soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2010-06-10

Tutorial visitado 5.247 veces Descargar en PDF
Generación de Informes con JasperReports en PHP

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.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2010-06-21-22:38:36

Autor: fmartinez

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