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

9 respostas
kicolobo

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?

9 Respostas

xgucax

Que tal experimentar o sendRedirect do objeto response?
Boa sorte

urubatan

é 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:

felipeguerra

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

renatocustodio

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.

felipeguerra

Consegui abrir no browser…

Valeu

J

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,

Lord

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!!!

J

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+

EuclidesFilizola

Boa noite pessoal,

Ressucitando esse tópico,

eu estou com um problema parecido,

alguém poderia me ajudar ???

Aqui está meu problema:

Criado 8 de março de 2007
Ultima resposta 20 de abr. de 2011
Respostas 9
Participantes 8