JSF: Como retornar uma saída em formato binário (Excel ou PDF por exemplo) usando faces?

Olá,

gostaria de saber se é possível (acredito que deva ser) retornar valores binários, como por exemplo arquivos Excel, PDF usando JSF.
Em nossa aplicação são gerados alguns relatórios nos formatos Excel ou PDF que gostariamos de retornar ao usuário sem a necessidade de escrever um servlet só para isto. (gostariamos de usar somente o servlet do faces em nossa aplicação)

Até agora, só encontrei como fazer a saída usando um Servlet separado (por exemplo no caso da utilização do Jasper Reports), no entanto não encontrei nenhum material explicando como retornar este tipo de saída no faces.
Alguém já teve de fazer algo parecido?

Que tal experimentar o sendRedirect do objeto response?
Boa sorte

é só fazer o seguinte (o código esta sendo escrito aqui, por tanto pode conter erros)

HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
Writer w = res.getWriter();
.....
FacesContext.getCurrentInstance().responseComplete();
return null;

isto deve resolver o teu problema :smiley:

Ressucitando!!!

Urubatan e demais, estou com uma dúvida sobre esse assunto, eu já tenho um arquivo Excel gerado em um determinado momento pela minha aplicação, agora quero apenas abrir o mesmo no browser, usando o sendRedirect do objeto Response, não obtive sucesso…

Quem pode me dar uma força?

Abraço

não sei mas acho que os principais browser como firefox e IE não podem abrir diretamente excel não. Mas se usar como explicaram lá em cima possivelmente vai dar a opção de baixar o arquivo, aí o cara le da forma que lhe for mais conveninete.

Consegui abrir no browser…

Valeu

Ola Felipe!!

Sei que o topico é antigo, mas tenho o mesmo problema!

Preciso abrir um pdf no browser

Voce poderia colocar aqui a solução?

Abraços,

Entaum cara faz da seguinte maneira !!!

Cria um método como o abaixo na sua classe de gerar o rlatório


public byte[] toPdf(String sourceFile)throws RelatorioException, DataSourceNotSetException
	{
		byte[] bytes = null;
		try
		{
			if (dataSource == null) {
				throw new DataSourceNotSetException();
			}

			bytes = JasperExportManager.exportReportToPdf(getRelatorioPreenchido());
					
		}
		catch(JRException e){
			throw new RelatorioException(e);
		}
		return bytes;
	}

Depois na integração com seu Bean faz como descrito abaixo.

               /**
		 * Gera o Relatório somente em array de bytes
		 */
		byte[] b = rel.toPdf(diretorio);
		
		HttpServletResponse res =   (HttpServletResponse)
                     FacesContext.getCurrentInstance().getExternalContext().getResponse();
		res.setContentType("application/pdf");
               /**
		 * Código abaixo gerar o relatório e disponibiliza diretamente na página
		 */
		res.setHeader("Content-disposition", "inline;filename=arquivo.pdf");
               /**
		 * Código abaixo gerar o relatório e disponibiliza para o cliente baixar ou salvar
		 */
		res.setHeader("Content-disposition", "attachment;filename=arquivo.pdf");
		res.getOutputStream().write(b);
		res.getCharacterEncoding();
		FacesContext.getCurrentInstance().responseComplete();

Espero ter ajudado!!!

flw!!!

Legal!!

Existe algumas duvidas ainda.

Quem é o dataSource do primeiro metodo?

O “diretório” é uma string com o caminho completo?
tipo “c:\relatorios\arquivo.pdf” ??

Tambem no primeiro metodo (toPdf) o parametro recebido chama-se
sourceFile (que recebe o diretorio) mas não é utilizado em
momento algum. (boiei)

O bean de integração que vc esta falando é um managedBean??
Se não, teria problemas em utilizar o codigo em um managedBean??

Desculpe as perguntas bobas, mas é que estou começando com jsf agora.
Voce ja me ajudou muito, se puder responder as duvidas acredito que poderei implementar com facilidades os relatórios.

T+

Boa noite pessoal,

Ressucitando esse tópico,

eu estou com um problema parecido,

alguém poderia me ajudar ???

Aqui está meu problema: