Desisto, peço ajuda em executar PDF com JSF

Boa tarde senhores.

peço a ajuda e experiencia de voce a me ajudar nesse problema, nao queria postar esse topico… pois eu ja realizei esse processo varias vezes… mas como estou desde cedo tentando… nao sei mas onde o problema pode estar,

bem, estou tentar executar um relatorio feito no ireport usando JSF.
mas infelizmente nao esta resultando em nada ! em um outro projeto funciona de boa… mas nesse novo nao!

<h:form id="formRels"> <h:commandLink styleClass="botmsg" value="Imprimir" action="generate_report" target="_blank" actionListener="#{ReportLauncherBean.printRelInsumos}" /> <h:commandLink styleClass="botmsg" value="Imprimir2" action="generate_report" target="_blank" actionListener="#{ReportLauncherBean.printRelInsumos2}" /> </h:form>

no navigation rule no faces config:

<from-view-id>/main.jsp</from-view-id>
        <navigation-case>
            <from-action>generate_report</from-action>
            <from-outcome>generate_report</from-outcome>
            <to-view-id>/main.jsp</to-view-id>
        </navigation-case>

no bean com escopo request:

esse primeiro metodo, nao faz nada simplesmente abre em uma outra aba a mesma pagina (esse metodo funciona no meu outro projeto)

public void printRelInsumos(ActionEvent env){
        fill();
        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
        HttpServletResponse response = getResponse();
        Map<String, String> parameters = new HashMap<String, String>();
        String arquivo = getServletContext().getRealPath("/WEB-INF/classes/Reports/relatorio.jasper");
        File reportFile = new File(arquivo);
        byte[] bytes = null;

        try{
            bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, ds);
        }catch(JRException e){
            e.printStackTrace();
        }

        if (bytes != null && bytes.length > 0) {
            ServletOutputStream ouputStream = null;
            try {
                response.setContentType("application/pdf");
                response.setContentLength(bytes.length);
                ouputStream = response.getOutputStream();
                ouputStream.write(bytes, 0, bytes.length);
                ouputStream.flush();
                ouputStream.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
         }

    }

esse metodo, apresenta logo apos ao clicar no botao, mostra o salvar como, pra mim salvar o relatorio ao invez de abrir… porem o relatorio salvo nao abre… da erro!

public void printRelInsumos2(ActionEvent env) throws IOException{
        fill();
        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lista);
        HttpServletResponse response = getResponse();
        Map<String, String> parameters = new HashMap<String, String>();
        String arquivo = getServletContext().getRealPath("/WEB-INF/classes/Reports/relatorio.jasper");
        InputStream reportStream = getFacesContext().getExternalContext().getResourceAsStream(arquivo);
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment;filename=listaInsumos.pdf");
        ServletOutputStream ouputStream = response.getOutputStream();
        try {
            JasperRunManager.runReportToPdfStream(reportStream, ouputStream, parameters, ds);
        } catch (JRException ex) {
            Logger.getLogger(ReportLauncherBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

se alguem puder me ajudar a solucionar esse problema ?
realmente nao entendo ! em um projeto funciona e nesse meu novo nao!

obrigado a todos, um abraço

Se eu fosse voce eu criava uma Servlet que gera o relatorio e o envia pro cliente… assim o relatorio já é mostrado diretamente no browser.

Pelo menos é assim que eu faço.

chamo o servlet direto do formulario ?

tem um exemplo dessa chamada pra mim ?

nao vai sair do ciclo de vida do jsf ?

brigado brow

Voce só envia um redirect para outra extensão e no web.xml voce mapeia essa extensão para servlet que faz isso.

Eu tenho esse projeto só em casa… perdi meu pen-drive a pouco tempo e não tnho mais nada fora de casa… o problema é que eu vou pra facul anoite… eu vou copiar e se ninguem responder até amanhã eu posto.

No seguinte trecho deve estar faltando o responseComplete() ao final.

response.setContentType("application/pdf"); response.setContentLength(bytes.length); ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close();

Uso com frequência a disponibilização de arquivos a partir do JSF. Fiz os seguintes métodos utilitários para isso:

[code] public static HttpServletResponse getServletResponse() {
return (HttpServletResponse)JsfUtils.getFacesContext().getExternalContext().getResponse();
}

public static FacesContext getFacesContext() {
    return FacesContext.getCurrentInstance();
}

public static void download(byte[] arquivo, String nome) throws Exception {
    HttpServletResponse response = getServletResponse();
    response.setContentType(null);
    response.setContentLength(arquivo.length);
    response.addHeader("Content-Disposition", "attachment; filename=" + "\"" + nome + "\"");
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(arquivo, 0, arquivo.length);
    outputStream.flush();
    outputStream.close();
    getFacesContext().responseComplete();        
}[/code]

perfeito… era isso mesmo que estava faltando!!

agora ele abre em outra pagina meu pdf !

mt obrigado a todos aí !

Ressucitando esse TÓPICO.

Help-me por favor pessoal,

estou na peia com PDF, ireport… para gerar relatorio direto do browser…

alguém pode me ajudar ?

Aqui está a minha dúvida:

brother… se sua duvida é igual a minha… a resposta esta nesse mesmo topico!

leia meu topico e veja a resposta do rafaelsantini

abraçao

rbroz,

mano,

já fiz da forma igual a sua, e infelizmente ocorre o seguinte:

não da nenhum erro,

não mostra nada no console,

o relatorio não aparece,

e a camada de visão ( view )

também ñao se mexe,

ou seja…

nada acontece…

vc ta usando algum framework que contenha ajax?

se tiover ajax retire! deixa ele dar o refresh na pagina!

se preferir, eu posso fazer pra vc um mini projeto para execuçao de relatorio por download e pra abrir na pagina.
mas so quando eu chegar no trabalho…

Cara, se vc puder, eu vou agradecer muito.

eu to tentando de várias formas e não estou conseguindo.

vou te enviar meu código.


<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE root PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:c="http://java.sun.com/jstl/core">


	<a4j:keepAlive beanName="abastecimentoRelatorioBean"/>

	<div class="innerTitle">Relatório de Abastecimento</div>
	
	<div class="innerMessage">
		<rich:messages infoClass="green" errorClass="red" />
	</div>

	<table id="headerReport">
		<tr>
			<td  style="padding-right: 5px;">
				<div class="innerTextFilter">Equipamento</div>

				<h:selectOneMenu id="listaClientes" value="#{abastecimentoRelatorioBean.equipamentoId}" style="width: 120px">
			 			<f:selectItems value="#{veiculosBean.listaVeiculos}"/>
				</h:selectOneMenu>

			</td>
			<td  style="padding-right: 5px;"> 
				<div class="innerTextFilter">Placa</div>

				<h:selectOneMenu id="listaTipoVeiculos" value="#{abastecimentoRelatorioBean.placaId}" style="width: 100px">
			 			<f:selectItems value="#{veiculosBean.listaVeiculos}"/>
				</h:selectOneMenu>

			</td>
						
				<td style="padding-right: 5px;">
					<h:outputLabel value="Data"/><br/>
					<rich:calendar id="dataInicioCadastro"  value="#{abastecimentoRelatorioBean.dataAbastecimento}"  datePattern="dd/MM/yyyy"/>
				</td>
				<td style="padding-right: 5px;">
					<h:outputLabel value="Num. Requisicao"/><br/>
					<h:inputText value="#{abastecimentoRelatorioBean.numFicha}" />
				</td>
			
			<td style="padding-left:10px; padding-top:10px;">
				<a4j:commandButton id="btnPesquisar" value="Pesquisar" action="#{abastecimentoRelatorioBean.geraRelatorioPassandoListaDeObjetos}" oncomplete="resizeApp()" styleClass="button" reRender="listaVeiculo,relatorioTableTitulos"/>
			</td>
			
			
			
		</tr>
	</table>
	
	
</ui:composition>

E essa Action


 action="#{abastecimentoRelatorioBean.geraRelatorioPassandoListaDeObjetos}"

aqui está:


public String geraRelatorioPassandoListaDeObjetos() throws ClassNotFoundException, SQLException, JRException, IOException {
		
		
			
			
		// Conexão com o banco para o segundo relatório
		this.criaConexao();
		conexao = getConexao();
		
		// criação dos parametros
		Map<String, Object> map = new HashMap<String, Object>();
		
		
		// conexão com o banco que será utilizada pelo subrelatório
		map.put("REPORT_CONNECTION", conexao);
		//map.put("IMAGE",diretorioReal+"/images/loma.jpg");
		
		// pego o caminho do diretório onde se encontra o subrelatório
		
		//map.put("SUBREPORT_DIR", getDiretorioReal("/pages/relatorios/relatorios/"));
		
		ArrayList<Abastecimento> relatorio =  new ArrayList<Abastecimento>(); 
			
		relatorio = (ArrayList<Abastecimento>) abastecimentoService.retrieveAll();
			
			//getListaAlunos(conexao);
		
		JRBeanCollectionDataSource ds = new
		JRBeanCollectionDataSource(relatorio);
		
		
		/*
		* Mando o jasper gerar o relatório. Nesse caso passo o map,
		* já que ele tem dois parâmetros que serão utilizados
		*/
		
		
		  
		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/relatorios/RelatorioAbastecimento.jasper";  
		  
		JasperReport reportx = (JasperReport) JRLoader.loadObject(caminhoRelatorio);  
		  
		ServletOutputStream responseStream = response.getOutputStream();  
		  
		byte[] ReportData = JasperRunManager.runReportToPdf(reportx,map,ds);  
		  
		if (ReportData != null && ReportData.length>0){  
	
			
		response.setHeader("Content-Disposition","attachment; filename=relatorio.pdf");    
		response.setContentType("application/pdf");   
			
		//response.setContentLength(ReportData.length);  
		  
		  try{  
		    responseStream.write(ReportData,0,ReportData.length);  
		    responseStream.flush();  
		    responseStream.close();  
		  
		    context.renderResponse();  
		    context.responseComplete();  
		  
		  }catch(Exception e){  
		     e.printStackTrace();  
		  
		     }  
		  
		} 
          
     
		
		
		//gerarRelatorio(caminhoRelatorio,print);
		
		
		// Gero o PDF
		
		//preenchePdf(print);
		
		
		return "exibeRelatorio";
		}
	
	

Abraços.