Capitulo 06 iReport
Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0
Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form
Puedes descargarlo en pdf
https://www.dropbox.com/sh/yzivtufjce1h57g/AAAJzegPVBxFtiqzEOlIAdsoa?dl=0
Encuesta
https://docs.google.com/forms/d/1WG7uzOe17V4u36fC05V3ijYEPZ8fhJD1NPUrkNBS0Jk/alreadyresponded?usp=send_form
En este capĆtulo mostraremos la forma de crear reportes de una manera muy sencilla utilizando iReport.
Pasos:
- Descargar el plugin iReport
- Crear reporte
- Desarrollar el cĆ³digo para imprimir reporte.
Descargamos el plugin de iReport para NetBeans
Descomprimir el archivo .zip
Desde el menĆŗ de NetBeans Tools-->Plugins-->PestaƱa Downloaded-->Presionar el botĆ³n Add Plugins
En el proyecto seleccionar Build with dependences
Nos ubicamos en resources -->clic derecho y seleccionar New-->Categories: Other→ File Types: Folder
Crear el paquete reportes dentro de resources
Nos ubicamos en reportes y seleccionar New→Other
Seleccionar Categories: Report
File Types: Empty report
dar el nombre
se muestra el diseƱador de reportes
Revisamos los atributos del Entity Estatus.java
Abrimos el reporte y en Field agregamos los tres fields. Clic derecho seleccionar Add Field
se genera el nombre field1
renombrar a idestatus, estatus,esinicial
En la paleta le cambiamos el tipo de dato en las propiedades
Propiedad Field Class
Arrastramos los campos a la secciĆ³n Detail1, de manera automĆ”tica se coloca en la columna el tĆtulo.
Arrastras label Static Text desde la paleta a la secciĆ³n Page Header
En el texto colocamos ESTATUS y las propiedades seleccionamos Bold, para que lo coloque en negrita.
En Tools arrastramos Current date para agregar la fecha del sistema.
compilamos el reporte
En la barra se genera el mensaje de compilaciĆ³n exitosa
Se muestra el reporte compilado
CREAR CDI/BEANS PARA MANEJO DE IMPRESIONES
CDI Beans GestorImpresion.java lo usaremos para gestionar las diversos mƩtodos para realizar las impresiones.
Crearemos los mƩtodos con dos parƔmetros List<?> t , colocamos el ? para que podamos pasar cual list de objetos al mƩtodo, y String ruta, es la ruta del reporte, HashMap para los parƔmetros que usaremos en los reportes.
- imprimir(List<?> t,String ruta,HashMap hashmap) ,imprime la lista de objetos pasados
- pdf(List<?> t, String ruta, HashMap hashmap), genera un pdf
- docx(List<?> t, String ruta, HashMap hashmap), genera un archivo docx
- xlsx(List<?> t, String ruta, HashMap hashmap), genera un archivo xlsx
- odt(List<?> t, String ruta, HashMap hashmap), genera un archivo odt
- ppt(List<?> t, String ruta, HashMap hashmap), genera un archivo ppt
- preparar(List<?> t, String ruta, HashMap hashmap), se utiliza internamente para configurar el entorno del reporte.
De esta manera podemos invocar el reporte desde el controller, donde pasaremos la lista de objetos
public String imprimir() {
String ruta = "/resources/reportes/estatus.jasper";
HashMap parameters = new HashMap();
gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);
return null;
}
Crear el CDI Beans
- Desde menĆŗ File, seleccione New
- en Categories, seleccione Java Server Faces
- en File Types, seleccione JSF ManagedBeans
- Class Name: GestorImpresion
- Package com.avbravo.scrumweb.generales
- Scope: request
CĆ³digo completo de GestorImpresion.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
/**
*
* @author avbravo
*/
@Named
@RequestScoped
public class GestorImpresion {
JRBeanCollectionDataSource ds;
FacesContext facesContext;
ServletContext scontext;
JasperPrint jasperPrint;
/**
* Creates a new instance of GestorImpresion
*/
public GestorImpresion() {
}
public String imprimir(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
byte[] bytes = baos.toByteArray();
if (bytes != null && bytes.length > 0) {
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.setContentType("application/pdf");
response.setHeader("Contentdisposition", "inline; filename=\"relatorioPorData.pdf\"");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();
}
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
public String pdf(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Contentdisposition", "attachment;filename=report.pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
public String docx(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Contentdisposition", "attachment;filename=report.docx");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JRDocxExporter docxExporter = new JRDocxExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
servletOutputStream);
docxExporter.exportReport();
FacesContext.getCurrentInstance().responseComplete();
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
public String xlsx(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Contentdisposition", "attachment;filename=report.xlsx");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JRXlsxExporter docxExporter = new JRXlsxExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
servletOutputStream);
docxExporter.exportReport();
FacesContext.getCurrentInstance().responseComplete();
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
public String odt(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Contentdisposition", "attachment;filename=report.odt");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JROdtExporter docxExporter = new JROdtExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
servletOutputStream);
docxExporter.exportReport();
FacesContext.getCurrentInstance().responseComplete();
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
public String ppt(List<?> t, String ruta, HashMap hashmap) {
try {
preparar(t, ruta, hashmap);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Contentdisposition", "attachment;filename=report.pptx");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JRPptxExporter docxExporter = new JRPptxExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
servletOutputStream);
docxExporter.exportReport();
FacesContext.getCurrentInstance().responseComplete();
} catch (JRException | IOException e) {
JSFUtil.addErrorMessage(e.getMessage());
}
return null;
}
private void preparar(List<?> t, String ruta, HashMap hashmap) {
try {
ds = new JRBeanCollectionDataSource(t);
facesContext = FacesContext.getCurrentInstance();
facesContext.responseComplete();
scontext = (ServletContext) facesContext.getExternalContext().getContext();
jasperPrint = JasperFillManager.fillReport(scontext.getRealPath(ruta), hashmap, ds);
} catch (Exception e) {
JSFUtil.addErrorMessage(e.getMessage());
}
}
}
Editar EstatusDataController.java , inyectar GestionImpresion y agregar el mƩtodo imprimir().En este indicaremos la ruta del reporte, la lista de entitys y el HashMap con los parƔmetros. E invocamos al mƩtodo correspondiente en GestionImpresion
@Inject
GestorImpresion gestorImpresion;
public String imprimir() {
String ruta = "/resources/reportes/estatus.jasper";
HashMap parameters = new HashMap();
gestorImpresion.imprimir(estatusFacade.getEstatusList(), ruta, parameters);
return null;
}
/*
*imprimir un solo entity
*/
public String imprimir() {
List<Estatus> list = new ArrayList<>();
list.add(estatus);
String ruta = "/resources/reportes/estatus.jasper";
HashMap parameters = new HashMap();
gestorImpresion.imprimir(list, ruta, parameters);
return null;
}
Editamos estatuslist.xhmtl, agregamos un footer con el boton imprimir, utilizamos en este caso immediate=”true”, para evitar que se realicen las validaciones, ya que desamos mostrar el reporte directamente.
<f:facet name="footer">
<p:commandButton immediate="true" id="printButton" value="#{app['boton.print']}" action="#{estatusDataController.imprimir()}" icon="ui-icon-print" ajax="false" />
</f:facet>
</p:dataTable>
</p:dialog>
Cuando ejecutamos el proyecto y seleccionamos estatuslist, se muestra el botĆ³n Imprimir
al presionarlo se muestra el reporte para imprimir
Comments
SeguĆ los pasos y funciona a la perfecciĆ³n en un ambiente de desarrollo.
Pero en producciĆ³n al intentar visualizar el archivo pdf el navegador arroja un mensaje de error ""Format error : Not a PDF or corrupted"
Deberia modificar alguna linea para obtener la ruta ?
O el problema se da porque al generar el archivo .WAR los archivos que estan en la carpeta recursos son omitidos ?
Saludos
Realice todos los pasos y funciona a la perfeccion en un ambiente de desarollo.
El problema esta al momento de generar el archivo .war y subir a la aplicacion al servidor para produccion , es entonces cuando al momento de visualizar el reporte el navegador arroja elmensaje de "Format error : Not a PDF or corrupted" .
Eso se debe a que los archivos que estan en la carpeta recursos son omitidos al momento de hacer el deploy o deberia cambiar alguna linea para obtener la ruta exacta de los reportes ?
Desde ya muchas gracias-
Saludos.