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
- Librería de JasperReports (http://jasperforge.org/).
- JDK 1.3 o posterior.
- Librería Jakarta Commons Digester Component (http://jakarta.apache.org/commons/digester/)
- Librería Jakarta Commons BeanUtils
Component (http://jakarta.apache.org/commons/beanutils/) - Librería Jakarta Commons Collections Component (http://jakarta.apache.org/commons/collections/)
- Librería Jakarta Commons Logging Component (http://jakarta.apache.org/commons/logging/)
- Si queremos conexión JDBC con base de datos tenemos
que tener el Driver JDBC 2.0. - Si queremos exportar nuestros informes a PDF necesitamos
la librería iText (http://www.lowagie.com/iText/) - Si queremos exportar nuestros informes a XLS necesitamos
la librería Jakarta POI (http://jakarta.apache.org/poi/)
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 |
|
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).
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
Gracias por este aporte, saludos
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.
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
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
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-
q buen aporte!
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.
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??
buen aporte.. x favor podrías hacer un video tutorial de este tema.. por favor.. por que no entiendo bien el proceso..gracias
Hola tengo una consulta: se puede ejecutar un reporte desde un hosting?
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
y como puedo relacionar jasper soft con laravel por favor, podria guiarme, ya tengo mi bd en postgres