Ireport - PDF sem salvar no disco. Como? [RESOLVIDO]

Ola, pessoal.

Eu jah cheguei a fazer duas implementações para gerar o relatorio, uma que salva um pdf no disco e redireciona a pagina para o pdf e outra que gera um stream e manda exibir o stream no navegador

colocarei o codigo dos mesmos:

public class RelatorioAtendimentoHora extends HttpServlet {
    private static final long serialVersionUID = -3362859697343829111L;
    private Logger logger = Logger.getLogger(RelatorioAtendimentoHora.class);
    private byte[] pdfRelatorioAtendimentoHoraSAPE;

    @SuppressWarnings("unchecked")
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        String sep = File.separator;

        logger.info("Criando uma conexão ...");
        DBConnectMySQL dao = null;
        try {
            dao = new DBConnectMySQL();
        } catch (Exception ex) {
            logger.error(ex);
            logger.error("Pilha do erro: ");
            for (int i = 0; i < ex.getStackTrace().length; i++) {
                logger.error(ex.getStackTrace()[i]);
            }
        }
        logger.info("Conexão: " + dao.getConnection());

        String path = getServletContext().getRealPath("/");
        String pathJasper =
                new StringBuilder()
                    .append(path)
                    .append("content")
                    .append(sep)
                    .append("reports")
                    .append(sep)
                    .toString();
        String pathImages =
                new StringBuilder()
                    .append(path)
                    .append("content")
                    .append(sep)
                    .append("images")
                    .append(sep)
                    .toString();

        logger.info("Inserindo parametros no Map ...");
        Map parametros = new HashMap();
        parametros.put("SUBREPORT_DIR", pathJasper);
        parametros.put("IMAGES_URI", pathImages);
        parametros.put("DATAINICIAL", req.getParameter("dataInicial"));
        parametros.put("DATAFINAL", req.getParameter("dataFinal"));

        // PRIMEIRA IMPLEMENTACAO - ESTA GRAVANDO NO DISCO
        try {
            logger.info("Caminho      : " + path);
            logger.info("CaminhoJasper: " + pathJasper);
            logger.info("CaminhoImages: " + pathImages);
            logger.info("Parametros   : " + parametros);
            logger.info(pathJasper + "RelatorioAtendimentoHoraSAPE.pdf");
            
            logger.info("Criando impressão ...");
            JasperPrint impressao = JasperFillManager.fillReport(
                    new StringBuilder()
                        .append(pathJasper)
                        .append("RelatorioAtendimentoHoraSAPE.jasper")
                        .toString(),
                    parametros,
                    dao.getConnection()
                    );

            logger.info("Exportando o pdf ...");
            JasperExportManager.exportReportToPdfFile(
                    impressao,
                    new StringBuilder()
                        .append(path)
                        .append("Relatorio")
                        .append(sep)
                        .append("RelatorioAtendimentoHoraSAPE.pdf")
                        .toString()
                    );
            
            logger.info("Redirecionando para o pdf ...");
            res.sendRedirect("RelatorioAtendimentoHoraSAPE.pdf");
        } catch (Exception ex) {
            logger.error(ex);
            logger.error("Pilha do erro: ");
            for (int i = 0; i < ex.getStackTrace().length; i++) {
                logger.error(ex.getStackTrace()[i]);
            }
        } finally {
            if (dao != null && dao.getConnection() != null) {
                try {
                    dao.connectionClose();
                } catch (SQLException ex) {
                    logger.error(ex);
                    logger.error("Pilha do erro: ");
                    for (int i = 0; i < ex.getStackTrace().length; i++) {
                        logger.error(ex.getStackTrace()[i]);
                    }
                }
            }
        }
        // PRIMEIRA IMPLEMENTACAO TERMINA AQUI

    //SEGUNDA IMPLEMENTACAO - GERANDO UM STREAM E EXIBINDO NO NAVEGADOR
        try {
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(pathJasper + "RelatorioAtendimentoHoraSAPE.jasper");
            pdfRelatorioAtendimentoHoraSAPE = JasperRunManager.runReportToPdf(jasperReport, parametros, dao.getConnection());
        } catch (JRException ex) {
            logger.error(ex);
            logger.error("Pilha do erro: ");
            for (int i = 0; i < ex.getStackTrace().length; i++) {
                logger.error(ex.getStackTrace()[i]);
            }
        }

        logger.info("Caminho      : " + path);
        logger.info("CaminhoJasper: " + pathJasper);
        logger.info("CaminhoImages: " + pathImages);
        logger.info("Parametros   : " + parametros);
        logger.info("Pdf          : " + pdfRelatorioAtendimentoHoraSAPE);
        logger.info(pathJasper + "RelatorioAtendimentoHoraSAPE.pdf");

        //Parametros para nao fazer cache e o que será exibido..  
        res.setContentType("application/pdf");
        res.setHeader("Cache-Control", "no-store");
        res.setHeader("Pragma", "no-cache");
        res.setDateHeader("Expires", 0);

        //Envia para o navegador o pdf..  
        ServletOutputStream servletOutputStream = res.getOutputStream();
        servletOutputStream.write(pdfRelatorioAtendimentoHoraSAPE);
        servletOutputStream.flush();
        servletOutputStream.close();
    }
}

a implementacao ideal, para mim, seria a segunda, porque nao iria ser necessario guardar nada no hd … quando eu gero os arquivos no hd eu preciso gerar arquivos com nomes diferentes, para o caso de varias pessoas requerirem o mesmo relatorio

pois bem … o problema dessa segunda implementacao eh que ela nao esta funcionando em todos os browsers … testei aqui com o internet explorer 6.0 e ele nao exibe o relatorios soh uma pagina em branco - nenhum erro

queria saber o que preciso mudar no meu codigo para a segunda implementacao funcionar em qualquer browser

ajuda :frowning: :frowning: :frowning:

[]'s

EDIT
as duas implementacoes estao no mesmo codigo, mas elas nao funcionam juntas, soh para deixar claro :slight_smile: - ou usa uma ou outra, coloquei as duas nessa mesma classe soh para poupar espaco

Consegui resolver o problema, testei com IE 6 e 7 e firefox 3.0 … nesses dois funcionou

O problema eh que IE eh uma droga :slight_smile:

e nao reconhece o cabecalho que o java manda quando eu fazia do jeito que tava lah.

eu alterei o o cabecalho para ficar assim no codigo java:

        res.setContentType("application/pdf");
        res.setHeader ("Pragma", "public");
        res.setHeader("Cache-control", "must-revalidate");

e funcionou :confused: … esse IE

descricao mais detalhada do problema aqui

aqui o codigo da nova classe do relatorio:

public class RelatorioAtendimentoHora extends HttpServlet {
    private static final long serialVersionUID = -3362859697343829111L;
    private Logger logger = Logger.getLogger(RelatorioAtendimentoHora.class);
    private JasperReport jasperReport;
    private byte[] pdfRelatorioAtendimentoHoraSAPE;

    /**
     * 
     * @param req
     * @param res
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    @SuppressWarnings("unchecked")
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

        String sep = File.separator;

        logger.info("Criando uma conexão ...");
        DBConnectMySQL dao = null;
        try {
            dao = new DBConnectMySQL();
        } catch (Exception ex) {
            logger.error(ex);
            logger.error("Pilha do erro: ");
            for (int i = 0; i < ex.getStackTrace().length; i++) {
                logger.error(ex.getStackTrace()[i]);
            }
        }
        logger.info("Conexão: " + dao.getConnection());

        String path = getServletContext().getRealPath("/");
        String pathJasper =
                new StringBuilder()
                    .append(path)
                    .append("content")
                    .append(sep)
                    .append("reports")
                    .append(sep)
                    .toString();
        String pathImages =
                new StringBuilder()
                    .append(path)
                    .append("content")
                    .append(sep)
                    .append("images")
                    .append(sep)
                    .toString();

        logger.info("Inserindo parametros no Map ...");
        Map parametros = new HashMap();
        parametros.put("SUBREPORT_DIR", pathJasper);
        parametros.put("IMAGES_URI", pathImages);
        parametros.put("DATAINICIAL", req.getParameter("dataInicial"));
        parametros.put("DATAFINAL", req.getParameter("dataFinal"));
    
        try {
            logger.info("Criando relatório jasper ...");
            jasperReport = (JasperReport) JRLoader.loadObject(pathJasper + "RelatorioAtendimentoHoraSAPE.jasper");
            logger.info("Preenchendo stream de bytes ...");
            pdfRelatorioAtendimentoHoraSAPE = JasperRunManager.runReportToPdf(jasperReport, parametros, dao.getConnection());
        } catch (JRException ex) {
            logger.error(ex);
            logger.error("Pilha do erro: ");
            for (int i = 0; i < ex.getStackTrace().length; i++) {
                logger.error(ex.getStackTrace()[i]);
            }
        }

        logger.info("Caminho      : " + path);
        logger.info("CaminhoJasper: " + pathJasper);
        logger.info("CaminhoImages: " + pathImages);
        logger.info("Parametros   : " + parametros);
        logger.info("Pdf          : " + pdfRelatorioAtendimentoHoraSAPE);
        
        logger.info("Setando cabeçalho HTML ...");
        res.setContentType("application/pdf");
        res.setHeader ("Pragma", "public");
        res.setHeader("Cache-control", "must-revalidate");


        logger.info("Enviando stream para o navegador ...");
        ServletOutputStream servletOutputStream = res.getOutputStream();
        servletOutputStream.write(pdfRelatorioAtendimentoHoraSAPE);
        servletOutputStream.flush();
        servletOutputStream.close();
    }
}