/* * * Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute - Graduate School and Research in Engineering. * See the file license.txt for copyright permission. * */ package relatorio; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; import net.sf.jasperreports.j2ee.servlets.ImageServlet; import exception.relatorio.RelatorioException; public class RelatorioHtml { private String caminhoRelatorioHTML; public RelatorioHtml() { } public RelatorioHtml(String pathRelatorioHTML) { this.caminhoRelatorioHTML = pathRelatorioHTML; } /** * metodo responsavel pelo preenchimento do relatorio, a partir do arquivo jasper compilado, do nome do arquivo html, * e considerando os dados sob a forma de List e os par�metros * * @param nomeArquivo * @param streamRelatorio * @param parametros * @param dados * @throws RelatorioException */ public void download(String nomeArquivo, InputStream streamRelatorio, Map parametros, List dados) throws RelatorioException { String caminhoRelatorio = caminhoRelatorioHTML + nomeArquivo; System.out.println("CAMINHO RELAT�RIO: " + caminhoRelatorio); File relatorio = new File(caminhoRelatorio); byte[] buffer = null; try { FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getResponse(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=\"" + nomeArquivo + "\""); if (parametros == null) { parametros = new HashMap(); } //Neste ponto, a nossa lista preenchida com o modelo � entregue ao Jasper, que cria um DataSource com ela JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dados); //Aqui � onde ocorre de fato o preenchimento do relat�rio, com os par�metros e DataSource passados JasperPrint impressao = JasperFillManager.fillReport(streamRelatorio, parametros, dataSource); //Ponto onde o relat�rio com os dados montados � exportado para o formato HTML JasperExportManager.exportReportToHtmlFile(impressao, caminhoRelatorio); FileInputStream fis = new FileInputStream(relatorio); OutputStream os = response.getOutputStream(); response.setContentType("text/html"); JRHtmlExporter htmlExporter = new JRHtmlExporter(); request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, impressao); htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, impressao); htmlExporter.setParameter(JRExporterParameter.OUTPUT_WRITER, os); htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "/gesplan/image?image="); htmlExporter.exportReport(); int read = 0; buffer = new byte[1024]; while ((read = fis.read(buffer)) != -1) { os.write(buffer, 0, read); } os.flush(); os.close(); fis.close(); FacesContext.getCurrentInstance().responseComplete(); } catch (Throwable ex) { ex.printStackTrace(); throw new RelatorioException(ex); } finally { buffer = null; } } }