Para generar desde Apache Tomme, en pdf un reporte construido con IReport de jasper, se requiere primero que todo, para no tener ninguna inconsistencia, la misma versión de librerías en la cual se construyó el reporte.
Partimos de la base que ya existe el archivo construido que para este ejemplo se llama “etiquetas.jasper” y que ha sido probado y validado en IReport Designer de jaspersoft. El reporte tiene la conexión a una base de datos oracle.La estructura del proyecto y la ubicación del archivo se encuentran como se muestra la imagen a continuación:
La consulta y los parámetros que recibe dicho reporte son tres (3) como se muestra a continuación:
A continuación tenemos una clase Etiqueta.class que contiene el código que realizara la invocación del reporte y su respectiva generación en pdf.
import java.sql.Connection; import java.sql.DriverManager; import java.util.HashMap; import java.util.Map; import javax.faces.context.FacesContext; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import org.upbbga.siau.model.dto.Parametros; import org.upbbga.utilitario.excepciones.UPBException; /** * Clase encargada de imprimir la etiqueta en un reporte. * * @author javier.mantillap */ public class ImpresionEtiqueta extends Parametros { private final String etiquetaDesde; private final String etiquetaHasta; public ImpresionEtiqueta(String etiquetaDesde, String etiquetaHasta) { this.etiquetaDesde = etiquetaDesde; this.etiquetaHasta = etiquetaHasta; } public void generarReporte() throws UPBException { try { String cadenaConexion = "jdbc:oracle:thin:@servidor.prueba.co:1521:BASEDATOS"; Class.forName("oracle.jdbc.OracleDriver"); Connection connection = DriverManager.getConnection(cadenaConexion, "usuarioBD", "clave"); Map args = new HashMap(); String logoEtiqueta = FacesContext.getCurrentInstance().getExternalContext(). getRealPath("/vista/reportes/activosfijos/logoEtiqueta.png"); args.put("COD_ACTIVO_DESDE", this.etiquetaDesde); args.put("COD_ACTIVO_HASTA", this.etiquetaHasta); args.put("RUTA_LOGO", logoEtiqueta); String path = FacesContext.getCurrentInstance().getExternalContext(). getRealPath("/vista/reportes/activosfijos/etiquetas.jasper"); JasperPrint reporte = JasperFillManager.fillReport(path, args, connection); HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance(). getExternalContext().getResponse(); String archivo = this.etiquetaDesde + "_" + this.etiquetaHasta + ".pdf"; httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + archivo); ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream(); JasperExportManager.exportReportToPdfStream(reporte, servletOutputStream); FacesContext.getCurrentInstance().responseComplete(); } catch (Exception e) { throw new UPBException(e.getMessage(), e); } } }
Espero sirva como ejemplo para cuando tengan que invocar desde java, reportes construidos en IReport. Cualquier duda con gusto la atenderé vía email. Buen día