Integración de JasperReports con PHP

13
85527

Integración de JasperReports con PHP

Introducción

En este tutorial vamos a explicar con ayuda de un ejemplo práctico como
podemos integrar JasperReports
en nuestras aplicaciones PHP. JasperReports
es una herramienta escrita en Java de código abierto
(open source) para generar informes, por lo que tendremos que, de alguna
forma, integrar dentro de nuestras páginas PHP llamadas a clases Java.
Para ello vamos a usar un Puente
PHP/Java
. Nuestro compañero Juan
Alonso
hizó hace algún tiempo un tutorial (https://adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=PuentePHPJava)
precisamente sobre este tema, donde nos enseña paso a paso como instalar
y configurar nuestro puente PHP/Java.

Después de leer el anterior tutorial y una vez instalado el puente PHP/Java
en nuestro servidor vamos a lo que nos interesa: integrar JasperReports en nuestros
scripts PHP.

Librerías requeridas

Configuración

Lo primero que tenemos que hacer es importar las librerías necesarias
para usar JasperReports dentro de nuestrás páginas PHP.


  $dir ="D:\\tutorial\\";
  $jrDirLib = "D:\\tutorial\\lib\\";
  	
  $handle = @opendir($jrDirLib);
  
  while(($lib = readdir($handle)) !== false) {
    $classpath .= 'file:'.$jrDirLib.'/'.$lib .';';
  }
  
  java_require($classpath);

Este código carga en el CLASSPATH todas las librerías
situadas en un directorio determinado, donde hemos colocado nuestras librerías
anteriormente mencionadas. Una vez que tenemos nuestro CLASSPATH preparado vamos
a ver como podemos compilar, rellenar y exportar nuestros informes.

Ejemplo práctico

El siguiente código utiliza instrucciones Java para llamar a los métodos
de JasperReports que compilan, rellenan y exportan a PDF un determinado informe.

  $jcm = new JavaClass("net.sf.jasperreports.engine.JasperCompileManager");
  $report = $jcm->compileReport($dir .$informe.".jrxml");
  		
  $jfm = new JavaClass("net.sf.jasperreports.engine.JasperFillManager");
  $print = $jfm->fillReport($report,new Java("java.util.HashMap"),new Java("net.sf.jasperreports.engine.JREmptyDataSource"));
  		
  $jem = new JavaClass("net.sf.jasperreports.engine.JasperExportManager");
  $jem->exportReportToPdfFile($print, $dir .$informe.".pdf");

Una vez ejecutado este script PHP se habrá generado un fichero pdf en el directorio especificado.

A continuación vamos a ver un ejemplo completo montado sobre una pequeña
aplicación PHP.

Integración de JasperReport con PHP

compileReport($dir .$informe.".jrxml"); $jfm = new JavaClass("net.sf.jasperreports.engine.JasperFillManager"); $print = $jfm->fillReport($report,new Java("java.util.HashMap"),new Java("net.sf.jasperreports.engine.JREmptyDataSource")); $jem = new JavaClass("net.sf.jasperreports.engine.JasperExportManager"); $jem->exportReportToPdfFile($print, $dir .$informe.".pdf"); } ?>
Documento:
 

Despúes de seleccionar un determinado documento y pulsar el botón
de «Enviar» se compila, rellena (los informes no acceden a base de
datos por lo que no se «rellenan» realmente) y se exporta a formato
pdf.

¡¡¡ Ya tenemos nuestro informe de ejemplo !!!

Aquí os dejo un zip
con los ficheros utilizados en este tutorial (informes jrxml y página
PHP).

13 COMENTARIOS

  1. que tal oye soy nuevo en esto y me encantariqa
    entederle a esto si podrias postear el codigo entero para poder entederle bien por fa vor te lo agradceria
    infinitamente es que asi no le entiendo mucho me ayudarias mucho si postearas el codigo de ejemplo completo

  2. Yo estaba buscando esto, muchas gracias por el aporte, solo falta que tu puedas hacer consultas y mandarlas a un reporte en especifico. Me ayude de otra pagina para completar este tutorial, porque ya le falta un poco de actualización. Pero muy padre, muchas gracias.

  3. hola a todos, alguien lo ha logrado hacer funcionar, ya que a mi me indica un error con la funcion java_require, sin embargo el javaBridge funciona correctamente pero no logro incluir las librerias necesarias para que funcione el jasperReports, gracias por su ayuda

  4. Hola, estoy tratando de realizar el ejemplo pero se me presenta un problema, ya tengo bien instalado el punte de php con java y lo que me sale cuando se ejecuta el reporte es:

    Fatal error: Uncaught exception \\\’JavaException\\\’ with message \\\’Java Exception java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JasperCompileManager java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JasperCompileManager at java.net.URLClassLoader$1.run(URLClassLoader.java:217) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:186) \\\’ in /var/www/tutorial/index.php:29 Stack trace: #0 /var/www/tutorial/index.php(29): *No Class!*->jbridge(\\\’net.sf.jasperre…\\\’) #1 {main} thrown in /var/www/tutorial/index.php on line 29

  5. Hola a tod@s, Primero gracias por este tutorial me ha sido de mucha utilidad.

    Espero que me puedan ayudar lo que ahora quiero es modificar estas lineas:
    # $dir =\\\»D:\\\\\\\\tutorial\\\\\\\\\\\»;
    # $jrDirLib = \\\»D:\\\\\\\\tutorial\\\\\\\\lib\\\\\\\\\\\»;

    con una direccion así para que se pueda acceder desde el host
    # $dir =\\\»127.0.0.1\\\\\\\\tutorial\\\\\\\\\\\»;
    # $jrDirLib = \\\»127.0.0.1\\\\\\\\tutorial\\\\\\\\lib\\\\\\\\\\\»;

    Es decir no utilizar la ruta fisica? puedo hacer eso?
    Talvez me pueden ayudar?
    Graciasss de verdad por su tiempo! 🙂
    Saludos Ktyk-

  6. Hola. Bien claro el ejemplo. Pero tengo una consulta… luego de generar el PDF, la conexión abierta por ej .jasper se cierra? He visto con librerías como PHP-JRU que la conexión no se cierra y esto produce errores al llegar al límite de conexión, siendo que estas conexiones quedan obsoletas.
    Gracias.

  7. Hola, he instalado el javabridge y me funciona a la perfección pero quiero integrarlo a yii2 y no me funciona con la lógica mvc. podría indicarme como proceder??

  8. Instalé JavaBridge perfectamente e importé las librerias necesarias pero tengo este error:

    Alguien podría ayudarme con esto, se lo agradecería mucho…

    Fatal error: Uncaught [[o:Exception]:»java.lang.Exception: CreateInstance failed: new org.altic.jasperReports.JdbcConnection. Cause: java.lang.ClassNotFoundException: org.altic.jasperReports.JdbcConnection VM: 1.7.0_80@http://java.oracle.com/» at: #-11 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) #-10 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) #-9 java.lang.Class.forName0(Native Method) #-8 java.lang.Class.forName(Unknown Source) #-7 php.java.bridge.Util.classForName(Util.java:780) #-6 php.java.bridge.JavaBridge.CreateObject(JavaBridge.java:469) #-5 php.java.bridge.parser.Request.handleRequest(Request.java:467) #-4 php.java.bridge.parser.Request.handleRequests(Request.java:509) #-3 php.java.bridge.http.ContextRunner.run(ContextRunner.java:143) #-2 php.java.bridge.util.ThreadPool$Delegate.run(ThreadPool.java:60) #-1 php.java.bridge.util.AppThreadPool$Delegate.run(AppThreadPool.java:1) #0 http://localhost:8080/JavaBridge/java/Java.inc(253): java in http://localhost:8080/JavaBridge/java/Java.inc on line 216

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad