5
respostas

Problema ao Gerar o Relatório

Pessoal ao solicitar a impressão do relatório ele baixa automaticamente, no entanto eu gostaria que ele abrisse em um pop-up ou em outra aba, alguém pode me ajudar? seguem meus códigos

CLASSE QUE GERA O RELATORIO


package relatorio;

import classes.Documento;
import classes.Memorando;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author Rafael Nobre
 */
public class Relatorio {

    private HttpServletResponse response;
    private FacesContext context;
    private ByteArrayOutputStream baos;
    private InputStream stream;
    private Connection con;

    public Relatorio() {
        this.context = FacesContext.getCurrentInstance();
        this.response = (HttpServletResponse) context.getExternalContext().getResponse();
    }

    public void getRelatotio(List<Memorando> lista, Long id) {
        stream = this.getClass().getResourceAsStream("/jasper/memorando.jasper");
        Map<String, Object> params = new HashMap<String, Object>();
        baos = new ByteArrayOutputStream();

        params.put("idDocumento", id);
        try {
            JasperReport report = (JasperReport) JRLoader.loadObject(stream);
            JasperPrint print = JasperFillManager.fillReport(report, params, getConexao());
            JasperExportManager.exportReportToPdfStream(print, baos);
            response.reset();
            response.setContentType("aplication/pdf");
            response.setContentLength(baos.size());
            response.setHeader("Content-disposition", "inline; filename=relatorio.pdf"); //se quiser forçar o download do relatorio mudar de inline para attachment
            response.getOutputStream().write(baos.toByteArray());
            response.getOutputStream().flush();
            response.getOutputStream().close();
            context.responseComplete();
            fecharConexao();
        } catch (JRException ex) {
            new RuntimeException("Exceção no metodo GetRelatorio do Relatorio");
        } catch (IOException ex) {
            new RuntimeException("Exceção no metodo GetRelatorio do Relatorio");
        }
    }

    public Connection getConexao() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/antares", "root", "");
            return con;

        } catch (SQLException | ClassNotFoundException ex) {
            System.out.println("Exceção na conexao");
        }

        return con;
    }

    public void fecharConexao() {
        try {
            con.close();
        } catch (SQLException ex) {
            System.out.println("Exceção ao fechar conexao");
        }
    }

}
5 respostas

MEU MÉTODO NA CLASSE BEAN

public void imprimir(Long id){
        Relatorio relatorio = new Relatorio();
        List<Memorando> lista = new ArrayList<>();
        lista.add(memorando.buscaPorId(id));

        relatorio.getRelatotio(lista, id);
    }

Meu input no JSF

<h:commandButton class="btn btn-success" value="Visualizar" action="#{memorandoBean.imprimir(lista.id)}"
                                         onclick="this.form.target='_blank'" />

Fala Rafael, tudo bem ?

Eu tentaria tirar o header do content disposition pra ver se o cliente web, como você já solicita abertura ("_blank"), já exibe o conteúdo da resposta em nova aba, ao invés de efetuar o download.

Tentei mas não deu certo, inclusive deixou até de baixar o pdf

Imaginava que deixaria de baixar mesmo. Mas qual o conteúdo recebido como resposta ?