[RESOLVIDO ] Ireport gera relatorio, mas como faz para download?

Boa noite pessoal,

eu fiz um método para que fosse gerado meu relatorio através do click, e não ficasse salvo dentro do meu projeto.


public void gerarRelatorio(String caminhoRelatorio, JasperPrint print) throws IOException, JRException{
		
		
		FacesContext context = FacesContext.getCurrentInstance();

		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

		ServletOutputStream responseStream = response.getOutputStream();

		InputStream caminho = getClass().getResourceAsStream(caminhoRelatorio);

		response.setContentType("application/pdf");
		
		response.setHeader("Content-Disposition","attachment; filename=\"relatorio.pdf\"");
	
		JasperExportManager.exportReportToPdfStream(print,responseStream);

		responseStream.flush();

		responseStream.close();

		context.renderResponse();

		context.responseComplete();

		JasperViewer.viewReport(print, false);

	
		
		
	}

Porém eu queria saber como eu faço para que o usuário ao clicar em “gerar relatorio” , pudesse fazer o download do arquivo.

E ainda tem outro problema, Não sei se é porque eu tenho o ireport instalado, mas com esse meu método, ao invés dele abrir o arquivo no Acrobat Reader , ele abre no jasper View,

isso está certo ?

E ae moçada,

alguém para poder me ajudar ?

Isso ajuda?

byte[] lReportData = JasperRunManager.runReportToPdf(pathRelatorios
            + "report.jasper",vParametros,new JRBeanCollectionDataSource(list));
        
        if (lReportData != null && lReportData.length > 0){
            //response é um HttpServletResponse
            response.setContentType("application/pdf");
            response.setContentLength(lReportData.length);
            ServletOutputStream outputStream;
            try {
                outputStream = response.getOutputStream();
                outputStream.write(lReportData, 0, lReportData.length);
                outputStream.flush();
                outputStream.close();
            } catch (Exception e) {
                throw new JRException(e);
            } 
        }

Bom, testei da seguinte maneira:


String caminho = getDiretorioReal("/pages/relatorios/relatorios/RelatorioAbastecimento.jasper");
		
		JasperReport report = (JasperReport) JRLoader.loadObject(caminho);
		
		FacesContext context = FacesContext.getCurrentInstance();

		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

		ServletOutputStream responseStream = response.getOutputStream();
		
		byte[] lReportData = JasperRunManager.runReportToPdf(report,map,ds);  
	          
	        if (lReportData != null && lReportData.length > 0){  
	            //response é um HttpServletResponse  
	            response.setContentType("application/pdf");  
	            response.setContentLength(lReportData.length);  
	              
	            try {  
	            	responseStream = response.getOutputStream();  
	            	responseStream.write(lReportData, 0, lReportData.length);  
	            	responseStream.flush();  
	            	responseStream.close();
	            	
	            	context.responseComplete();
	            	
	            } catch (Exception e) {  
	                throw new JRException(e);  
	            }   
	        }  

e ele não me traz nenhum erro, mas também não me da nenhum sinal de vida,

não diz se o relatorio foi gerado, não avisa nada… coisa nenhuma… fica tudo parado…

o console do eclipse fica todo em branco.

e na view, nada acontece… !!!

alguem poderia me ajudar ???

Nada galera. ?

Bom dia,

ainda estou com esse problema.

Alguém pra me salvar ?

cara eu estava com o mesmo problema seu ai achei esse tutorialzinho que me ajudou pra caramba

segue meus códigos:


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
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.type.WhenNoDataTypeEnum;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author mpolverini
 */
@ViewScoped
@ManagedBean
public class Rel implements Serializable {

    public StreamedContent getSampleReportPDF() {

        InputStream relatorio = null;

        try {

            String pdfFile = "C:\\sampleReport.pdf";

            ByteArrayOutputStream Teste = new ByteArrayOutputStream();

            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("Report/sampleReport.jasper"));
            jasperReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);

            List<Funcionario> list = new ArrayList<Funcionario>();

            Funcionario f = new Funcionario();

            Cargo c = new Cargo();

            c.setDescricao("CARGOOOOOO");
            c.setId(1);

            f.setId(1);
            f.setNome("NOME 01");
            f.setCargo(c);
            f.setEmail("EMAIL");

            list.add(f);

            f.setId(2);
            f.setNome("NOME 02");
            f.setCargo(c);
            f.setEmail("EMAIL");

            list.add(f);

            f.setId(3);
            f.setNome("NOME 03");
            f.setCargo(c);
            f.setEmail("EMAIL");

            list.add(f);

            f.setId(4);
            f.setNome("NOME 04");
            f.setCargo(c);
            f.setEmail("EMAIL");

            list.add(f);


            JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(list);
            HashMap<String, Integer> params = new HashMap<String, Integer>();
            JasperPrint print = JasperFillManager.fillReport(jasperReport, params, datasource);

            JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();

            exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, Teste);
            exporter.exportReport();

            relatorio = new ByteArrayInputStream(Teste.toByteArray());

        } catch (JRException ex) {
            Logger.getLogger(Rel.class.getName()).log(Level.SEVERE, null, ex);
        }

        return new DefaultStreamedContent(relatorio);


    }
}
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <p:panel header="Teste Report">
                <p:commandButton rendered="true" id="exportar1" value="PDF" ajax="false">
                    <p:fileDownload value="#{rel.sampleReportPDF}" />
                </p:commandButton>
            </p:panel>
        </h:form>
    </h:body>
</html>

Espero ter ajudado =)

Beleza cara.

só está dando problema no seguinte

quando eu tento fazer essa linha



  relatorio = new ByteArrayInputStream(Teste.toByteArray()); 

ele pede para que eu mude o objeto relatorio para 'ByteArrayInStream" .

e ae ?

Bem, ajeitei já essa parte.

agora me vem outro problema,

eu não tenho a classe “DefaultStreamContent” e nem a StreamedContent.

Ainda tem outro problema,

esse exemplo não servirá porque é para JSF 2.0,

e eu estou utilizando JSF 1.2 …

Então as classes DefaultStreamContent e StreamedContent são do primeface (Uso a 2.2.1) e uso o jsf 2.0, de uma olhada em versões anteriores se o prime funciona no 1.2

Pode ser também a versão da biblioteca,

qual versão vc utiliza ?

2.2.1 Primefaces e 2.04 Morraja JSF

Bom,

eu agora fiz o método da seguinte forma:


FacesContext context = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

String diretorioReal = session.getServletContext().getRealPath("");

String caminhoRelatorio = diretorioReal+ "/pages/relatorios/RelatorioAbastecimento.jasper";

this.craConexao();
conexao = getConexao();

Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();

map.put("REPORT_CONNECTION",conexao);

ArrayList&lt;Abastecimento&gt; relatorio = new ArrayList&lt;Abastecimento&gt;();

relatorio = (ArrayList&lt;Abastecimento&gt;) abastecimentoService.retrieveAll();

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(relatorio);

JasperReport reportx = (JasperReport) JRLoader.loadObject(caminhoRelatorio);

ServletOutputStream responseStream = response.getOutputStream();

byte[] ReportData = JasperRunManager.runReportToPdf(reportx,map,ds);

if (ReportData != null && ReportData.length&gt;0){

 response.setHeader(&quot;Content-Disposition&quot;,&quot;attachment; filename=\&quot;relatorio.pdf\&quot;&quot;);
 response.setContentType(&quot;application/pdf&quot;);
 response.setContentLength(ReportData.length);

  try{
    responseStream.write(ReportData,0,ReportData.length);
    responseStream.flush();
    responseStream.close();

    context.renderResponse();
    context.responseComplete();

  }catch(Exception e){
     e.printStackTrace();

     }

}

e me gerou o seguinte erro:


java.lang.NoSuchMethodError: com.lowagie.text.Image.plainWidth() F

Bom, já resolvi esse primeiro erro,

pois era uma imagem que eu estava tentando colcoar via MAP, mas eu retirei apenas para ver se o relatorio aparecia.

e INFELIZMENTE ,não apareceu.

ou seja,

eu clico em gerar,

e ele não faz nada, não mostra nenhum erro, não aparece o relatório, a interface grafica não mexe em nada…

e etc…

nada… me da sinal de vida… ¬¬

Agora deu o seguinte erro no firefox conforme imagem abaixo.


Fala Euclides,

Essa imagem aí do firefox não é erro, na verdade é a representação binária do arquivo. Isso significa que o relatório foi enviado ao browser, mas o browser não chamou o aplicativo pdf.

Acho que deve ser problema no header da resposta. Seu código anterior tem aspas:

response.setHeader("Content-Disposition","attachment; filename=\"relatorio.pdf\"");  
response.setContentType("application/pdf"); 

Remova as aspas do filename e ver se funciona:

response.setHeader("Content-Disposition","attachment; filename=relatorio.pdf");  
response.setContentType("application/pdf"); 

Senão tente também mudar de attachment para inline.

Boa tarde gilmar,

continua do mesmo jeito.

Coloquei do jeito que vc falou e também tentei com o “inline”.

e nada…

Por um a caso vc tem um leitor pdf instalado nesse computador em questão?
O firefox reconhece algum aplicativo associado ao tipo de arquivo pdf?
Quais são os headers enviados no retorno? (faça: na página com caracteres estranhos click como botão direito>propriedades da página)
Em salvar como, a página, vc consegue salvar um pdf?

tenho sim.

Gilmar,

se vc ler a primeira página desse post,

o método que eu utilizo funciona.

só que ele chama JasperViewer.show()

… e qual o problema nisso ???

ele ao invés de abrir o relatorio em um adobe acrobat, por exemplo,

ele já abre o jasper… do JasperReport,

vc está me entendendo ?