Desarrollo WEB.


Las practicas de programación orientadas a la web son muy cambiantes en el tiempo. Es necesario conocer e implementar tecnologías, conocer lenguajes,integrar comunidades,usar Ides, etc, recientes, para responder al mercado que se acerca.

domingo, 8 de diciembre de 2013

Ejecutar Reportes Ireport (java) desde una Aplicación Web php


Cuando surgió la necesidad de ejecutar un reporte .jasper desde una aplicación web php, inicie un proceso de investigación y cacharreo con herramientas que me permitieran llamar un reporte java desde un recurso php. Esta forma sirve tanto para linux como para windows.

Al inicio solo encontré en la red javabridge, pero pasado el tiempo sin obtener resultados después de ensayar muchas formas, decidí ir a una herramienta que hace mucho tiempo había escuchado y hasta leído, una herramienta de caucho(resin) que nos permite ejecutar una aplicación php dentro de un servidor de aplicaciones web en mi caso glassfish. 

Quercus me saco del apuro, lo que hice, y que muchos en la red no enfrentaron fue, no tener que depender de un servidor apache, en mi caso dependía de lampp, configure php.ini, instale recursos javabridge de todas las formas y métodos, y solo encontré problemas, al final de la noche me decidí y empece a usar quercus para ver como desde allí podía llamar los reportes, ya que al estar dentro de un contenedor de aplicaciones java me permitiría ir directamente a los recursos de java y así fue.

el mecanismo para realizar este procedimiento es sencillo.
  • PHP: los recursos normales instalados en el servidor físico o maquina de trabajo linux
  • Quercus: recurso para ejecutar una aplicación php dentro de un servidor de aplicaciones java
    • Descarga: descargar de http://quercus.caucho.com/Quercus_x.x.x.war
    • Instalación: 
      • desplegar el Quercus_x.x.x.war desde la consola de administración de glassfish.
    • Librerías: Copiar las librerías necesarias dentro del web-inf del proyecto quercus desplegado, todas las usadas en jasperreport para exportar el pdf, para conexión el driver conector postgres, y alticJasper.jar parar realizar la conexión desde php al conector y el jasperreport.
  • Glassfish: servidor de aplicaciones web J2EE, JSE, etc.
  • Jasperreport: tecnología para realizar reportes java enlazados a bases de datos 

Código php usado para llamar el reporte .jasper, adaptado de la red.



//directorio de los reportes
$dir = "/home/iproject/glassfish-3.1.2.2/glassfish/domains/domain1/applications
/quercus-4.0.37/EAOptimaERP_v1.2_Contabilidad/reportes";
//Especificamos el nombre del reporte
$informe = "/reporte";

    try {


//Creamos la conexión JDBC
        $Conn = new Java("org.altic.jasperReports.JdbcConnection");

//Seteamos el driver mysql
        $Conn->setDriver("org.postgresql.Driver");

//Especificamos los datos de la conexión
        $Conn->setConnectString("jdbc:postgresql://localhost:5432/
optimaerp_db");
        $Conn->setUser("postgres");
        $Conn->setPassword("");

// Creamos una variable tipo arreglo que contendrá los parámetros 
        $parametrosMap = new Java("java.util.HashMap");
        $parametrosMap->put("usuario", new Java('java.lang.String','YovanySuarez'));

//Creamos el objeto JasperReport que permite obtener el reporte
        $sJfm = new Java("net.sf.jasperreports.engine.JasperFillManager");

//Guardamos el reporte en una variable $print para luego exportarla
        $print = $sJfm->fillReportToFile($dir . $informe . ".jasper", 
$parametrosMap, $Conn->getConnection());

//pdf en el directorio donde están los reportes
        $sJem = new Java("net.sf.jasperreports.engine.JasperExportManager");
        $sJem->exportReportToPdfFile($print, $dir . $informe . ".pdf");

//abre el archivo generado desde el explorador
        if (file_exists($dir . $informe . ".pdf")) {
            header("Content-disposition: attachment;filename=" . $informe . ".pdf");
            header("Content-Type: application/pdf");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: " . @filesize($dir . $informe . ".pdf"));
            header("Pragma: no-cache");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Expires: 0");
            set_time_limit(0);
            @readfile($dir . $informe . ".pdf") or die("error.");
        }
    } catch (JavaException $ex) {
        echo "error ";
        $trace = new Java("java.io.ByteArrayOutputStream");
        $ex->printStackTrace(new Java("java.io.PrintStream", $trace));
        print "java stack trace: $trace\n";
    }