iReport sobre Struts – Paso 3 : Generar el informe desde Java
Ahora tenemos la plantilla (.jrxml) y la plantilla compilada (.jasper). La plantilla la podemos compilar también en tiempo de ejecución pero no es lo habitual.
Para entender mejor cómo funciona Jasper Reports puedes consultar la siguiente imagen (sacada de aquí):
Nosotros utilizaremos JasperRunManager.runReportToPdf para generar el informe en PDF desde el jasper que hemos generado. Colocamos el informe .jasper en nuestro directorio (yo lo he creado en un paquete llamado "informes"). Creamos una clase que nos genere el pdf es.lycka.holamundoStruts138Jasper.utilidades.GenerarPDF :
package es.lycka.holamundoStruts138Jasper.utilidades;
import java.util.HashMap;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;
import es.lycka.holamundoStruts138Jasper.model.Informe;
public class GenerarPDF {
public byte[] generarInforme (Informe informe) {
byte[] pdf = null;
String rutaInforme = "/es/lycka/holamundoStruts138Jasper/informes/informe.jasper";
HashMap<String, Informe> parametros = new HashMap<String, Informe> ();
parametros.put("informe", informe);
try {
JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getResource(rutaInforme));
pdf = JasperRunManager.runReportToPdf(masterReport, parametros, new JREmptyDataSource());
} catch (Exception e) {
e.printStackTrace();
}
return pdf;
}
}
Ahora modificamos el InformeBO para invocar este método :
public byte[] generarInforme (Informe informe) throws Exception {
return (new GenerarPDF ()).generarInforme(informe);
}
Ahora tenermos que hacer que nuestro action nos devuelva el pdf en la response. Para ello hacemos que el método execute nos devuelva null, y ahora implementamos el método que dejamos vacío, mostrarFichero
private void mostrarPDF (byte[] informePDF, HttpServletResponse response) throws IOException {
//Incializamos el array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ServletOutputStream out = response.getOutputStream();
bos.write(informePDF);
response.setContentType("application/pdf");
//para que el pdf se pueda ver en microsoft explorer
response.setHeader("Cache-Control", "cache");
//para que aparezca el diálogo abrir/guardar
response.setHeader("Content-Disposition", "attachment; filename=informe.pdf");
response.setHeader("Pragma", "cache");
response.setContentLength(bos.size());
out.write(bos.toByteArray());
out.flush();
bos.close();
out.close();
response.flushBuffer();
}
Vale, haz la prueba y ya está. He subido el war de este proyecto a hordit, ahí puedes ver la estructura de los ficheros y las fuentes.
Joer ha costado ! Muchas gracias al Espín y a Chema que se curraron todo esto.


