Galera estou com um problema com o uso de OutputStream. Programo em JSF, e estou gerando relatórios dinâmicos numa página JSP. Eu preciso salvar esse relatório em PDF, até aí td bem, eu estava salvando em disco, e depois puxando o link para o navegador. Não resolveu meu problema, pq não sei por qual motivo o relatório que era baixado era o penúltimo que havia sido gerado, e não o que eu tinha gerado na hora.
Dei uma pesquisada na net, e muitas pessoas me falaram pra criar o PDF na memória e fazer o download direto da memória. Eu tentei, mas não estou conseguindo. O meu código está ± assim:
this.memoryPDF = new ObjectOutputStream(new FileOutputStream("teste"));
JasperExportManager.exportReportToPdfStream(jasperPrint,this.memoryPDF);
aí eu crio o PDF na memória (não tenho certeza se estou fazendo da maneira certa)
e depois para efetuar o download não sei o que eu faço. será que é alguma coisa desse tipo???
response.setContentType("apllication/pdf");
response.sendRedirect(""+response.getOutputStream());
Desde já agradeço a ajuda de vocês, e peço que se alguém tiver algum exemplo parecido para postar.
obrigado.
algo próximo disso. Você deve colocar o pdf em memória no output do servlet. Primeiro eu faria um:
httpServletResponse.setContentType("application/pdf");
httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"SEU_ARQUIVO_SEI_LA.pdf\"");
porque ele nem sai da página que está solicitando o relatório (não substitui a mesma por um arquivo pdf.
Depois faria algo como:
ServletOutputStream outputStream = httpServletResponse.getOutputStream();
httpServletResponse.setContentLength(bytes.length);
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();
Ou algo próximo a isso…
abraços,
otávio
Fala Otávio, então é o seguinte. Como eu mostrei no primeiro post, eu crio o pdf no OutputStream. O meu problema é que eu não sei como passar para o response.sendRedirect o endereço desse arquivo que foi criado na memória. eu já tentei de várias maneiras e sempre dá o mesmo erro:
HTTP Status 404 - meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f
type Status report
message /meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f
description The requested resource (/meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f) is not available.
Apache Tomcat/5.5.17
Eu não tenho experiência com o uso de Servlets. Você pode me dar um exemplo bem simples de como faria isso ??
obrigado.
PS - Detalhe, a classe onde estou rodando esse script é um Bean, e não um servlet. Não sei se tem algum problema.
você não redireciona. você cospe ele pra tela. olha o exemplo que eu te dei.
alias no exemplo faltou uma coisa.
byte[] bytes = null;
bytes = JasperRunManager.runReportToPdf(relatorio, parametros, dataSource);
Ou seja, jogo o output pra um array de bytes, para depois mandar pra resposta do servlet