Factura con Jasper PHP

Son muchos los desarrolladores que solicitan producir informes (documentos y listados) en formato PDF y una de las herramientas preferidas para hacer todo tipo de informes es Jasper Report (versión community).

El problema más «grave» que tiene esta solución es que se requiere desplegar una aplicación java en nuestros equipos y si tienes contratado un hosting PHP, no vas a poder desplegar aplicaciones java.

Si puedes desplegar aplicaciones java y requieres de muchos tipos de informes valora esta solución ya que dispone de un Api Restfull, que puedes desde PHP (PHPRunner) solicitar el informe y obtenerlo para facilitarle dicho informes a tu usuarios de la aplicación PHP (si necesitas más información escríbeme un email y te explico cómo lo puedes hacer. Es muy sencillo y eficiente).

Para todos aquellos que nos gusta disponer de una solución 100% PHP, ya hace tiempo que me indicaron que existía un desarrollo https://github.com/QuilhaSoft/JasperPHP, no  tiene desarrollado el 100% de la funcionalidad, pero es funcional en un porcentaje alto para las definiciones de los «report» de Jasper.

Ya sabéis que no soy partidario de los informes en PDF, creo que los informes se deben pasar a formato Excel y no quedarse en PDF, pero hay muchos colegas que me solicitan la elaboración de informes en PDF y me he puesto a estudiarlo y a hacer este ejemplo que puede facilitar mucho la elaboración de informes en formato PDF.

No voy a explicar qué es la solución de Jasper Report, hay mucho escrito, videos explicativos, etc., por lo que sólo indicaré 2 características:

  • Dispone de un herramienta  visual «Jasper Studio» que nos permite diseñar y probar los informes y es gratis.
  • Dispone de una aplicación que nos permite ejecutar dichos informes. En nuestro caso, esta aplicación la vamos a sustituir por JasperPHP

Objetivo

Diseñar informes con Jasper Studio y ejecutar dichos informes en nuestra aplicación PHPRunner. La salida de estos informes es exclusivamente PDF.

DEMO: http://fhumanes.com/jasper_xml/

JasperPHP no funciona con PHP 8.X, por eso, he creado jasper_xml  utilizando PhpJasperXML, que funciona perfectamente en las ultimas versiones de PHP.

Para el ejemplo he tomado la aplicación «invoice» en donde explico varias formas de imprimir una factura y hago esto mismo con un informe de Jasper.

Solución Técnica

Como he indicado, esta solución consta de 2 partes:

  • La elaboración del informe que como resultado se obtiene la definición de ese informe en un fichero con extensión JRXML. Dicho informe lo obtenemos con Jaspersoft Studio.
  • La ejecución de dicho informes mediante la librería JasperPHP. Esta librería la he modificado para adaptarla a PHPRunner, por lo que es mejor utilizar el ejemplo de este artículo.

Para ejecutar el ejemplo lo que hay que hacer es consultar las facturas (invoice):

Y el resultado es un documento de estas características:

 

En el ejemplo facilito este conjunto de directorios y ficheros:

En donde se explica los 3 directorios importantes que he incluido para ejecutar esta solución.

El código PHP para ejecutar el informe está en el fichero «factura_pdf.php», que contiene:

<?php
use JasperPHP\Report;
use JasperPHP\ado\TTransaction;
use JasperPHP\ado\TLogger;
use JasperPHP\ado\TLoggerHTML;

//use \NumberFormatter;
//use PHPexcel as PHPexcel; // experimental
/**
 * classe TJasper
 *
 * @author   Rogerio Muniz de Castro <[email protected]>
 * @version  2018.10.15
 * @access   restrict
 * 
 * 2015.03.11 -- create
 * 2018.10.15 -- revision and internationalize, add TLogger classes
 * */
class TJasper {

    private $report;
    private $type;
    private $param;

    /**
     * method __construct()
     * 
     * @param $jrxml = a jrxml file name
     * @param $param = a array with params to use into jrxml report
     */
    public function __construct($jrxml, array $param) {
        $GLOBALS['reports'] = array();
        $xmlFile = $jrxml;
        $this->type = (array_key_exists('type', $param)) ? $param['type'] : 'pdf';
        $this->param = $param;
        $this->report = new JasperPHP\Report($xmlFile, $param); // $GLOBALS['reports'][$xmlFile];
        JasperPHP\Instructions::prepare($this->report);
    }

    public function outpage($filename = 'report.pdf') {
        $this->report->generate();
        $this->report->out();
        $pdf = JasperPHP\Instructions::get();
        $pdf->Output($filename, "I");           // Name of file of PDF       
    }

    public function setVariable($name, $value) {
        $this->report->arrayVariable[$name]['initialValue'] = $value;
    }
}

$idfactura = $_SESSION['idfactura'] ; 	// invoice identification to obtain
$param = array();                 		// Parameter
$param['P1'] = $idfactura ;

require(__DIR__.'/../jasperPHP_20211004/autoload.php');

$report_name = 'invoice2.jrxml';  		// File of Report

TTransaction::open(__DIR__.'/../jasperDatabase/'.'factura.ini');  		// DataBase of Report

TTransaction::setLogger(new TLoggerHTML('log.html')); // DEBUG

// Config TJasper
JasperPHP\Report::$proccessintructionsTime = 'inline'; // if uncomented this line intructions are proccessed after each database row
JasperPHP\Report::$defaultFolder = __DIR__.'/../app.jrxml';
JasperPHP\Report::$locale = 'es_es'; // Default "en_us"
JasperPHP\Report::$dec_point = ',';
JasperPHP\Report::$thousands_sep = '.';
JasperPHP\Report::$columnHeaderRepeat = false;

$jasper = new TJasper($report_name,$param);

$filename = "factura_".$idfactura.".pdf";
$jasper->outpage($filename);
?>

Se explica en el ejemplo cómo podemos cambiar los símbolos de puntuación para adaptarlos a nuestro idioma.

Con Jaspersoft Studio hay que tener mucho cuidado porque esta solución sólo ejecuta lo básico, por lo que puedes diseñar un informe y luego al ejecutarlo no aparecer multitud de objetos que has definido, pero con paciencia puedes identificar qué es lo que funciona y lo que no funciona. También está la documentación del producto que indica qué es lo que tiene implementado hasta este momento.

Os dejo los fuentes del ejemplo para que lo ejecutéis en vuestros equipos y podéis consultarme a través de email [email protected].  Ya os digo de antemano, que no soy experto en Jaspersoft Studio y que tendréis que visualizar videos en Youtube de cómo diseñar aquello que necesitáis.

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner