Galera to apanhando um pouco aqui do ireport, é a primeira vez que uso…
É o seguinte eu criei o relatório e já consigo abrir ele da seguinte maneira:
//relatorio é um JasperPrintrelatorio=JasperFillManager.fillReport(nomeRelatorio,parametros,con);JasperViewerviewer=newJasperViewer(relatorio,false);viewer.show();
só q ele é exibido em uma janela do Ireport…como faço pra ele abrir em PDF ??? É preciso exportar e depois mandar um link pro usuário clicar ???
assim não ta rolando…o problema é q to usando JSF em um framework proprietário…até chegar no relatório ele dá o seguinte erro:
java.lang.IllegalStateException: Servlet response already use stream, Writer not possible
vou continuar tentando…
R
RobsonFagundes
se for web da pra fazer assim
try{InputStreamendStream=(InputStream)getServletContext().getResourceAsStream("/WEB-INF/classes/xxxx/relatorios/etiquetaDestinatarios.jrxml");JasperReportjr=JasperCompileManager.compileReport(endStream);JasperPrintjp=JasperFillManager.fillReport(jr,parametros,newJRBeanCollectionDataSource(Vetiq));Stringpath=getServletContext().getRealPath("/");JasperExportManager.exportReportToPdfFile(jp,path+"etiquetaDestinatarios.pdf");// gera a visualizacao(preview) do relatorio -> visualiza a parada no Desktop// JasperViewer.viewReport(jp);// redireciona para o relatorio geradoresponse.sendRedirect("imprimirEtiqueta.jsp");}catch(JRExceptionJREex){System.out.println("Afffffffff ta dando bug nesse Relatorio !!!!!!!!!!!!");JREex.printStackTrace();}
espero q ajude t+
P
paulohrl
O erro q ta dando é porque vc ja ta mandando alguma coisa para sua view. O método (action) que está rodando isso não pode redirecionar mais nada pra view… vai abrir o relatório no visualizador padrão de pdf.
G
Giulliano
na verdade eu quero q ele abra do mesmo jeito que o Viewer do JasperReport…quero q o acrobat reader abra com o relatório dentro…
não queria usar nada de Servlet. Por enquanto achei uma solução tosca que é :
Eu não conheço JSF, então não sei te dizer em que momento ele ta começando a utilizar a stream de saida do servlet e não ta deixando vc jogar o relatorio.
Alguém que saiba melhor JSF vai poder te ajudar melhor nisso. Depois q seu método não usar a saida do servlet, vc tem q referenciar ela e fazer o trecho q te mandei q ai funciona legal, eu uso muito assim e nunca deu pau.
Abraço
G
Giulliano
paulohrl:
Eu não conheço JSF, então não sei te dizer em que momento ele ta começando a utilizar a stream de saida do servlet e não ta deixando vc jogar o relatorio.
Alguém que saiba melhor JSF vai poder te ajudar melhor nisso. Depois q seu método não usar a saida do servlet, vc tem q referenciar ela e fazer o trecho q te mandei q ai funciona legal, eu uso muito assim e nunca deu pau.
Abraço
Então Paulo …o problema é “e se o acrobat estiver em outro caminho” por isso não adinta usar essa solução. Mas é sempre bom aprender novos comandos…rss.
O que rola no JSF é simples cara ele simplesmente é uma abstração das classes HttpServlet assim como o Hibernate abstrai as classes JDBC. ( mais ou menos isso ). Então fica mais fácil de trabalhar sem se preocuapr com request, reponse, session, expressionlanguagem, jstl…etc…
Porém assim como no hibernate, no JSF eu posso ir para um nível mnais baixo e pegar o request/reponse e agora vou ter q criar uma servlet dar um RequestDispatcher e incluir na minha requisição uma servlet com os seus métodos…vamos lá…tentar mais uma vez…
valews…[]'s
P
paulohrl
É cara, o caminho é esse mesmo, você acessar direto o response do HTTPServlet.
Depois posta ai se deu tudo certo.
G
Giulliano
Bom vamos lá:
O que eu estava errando era: usar o RequestDispatcher de um ManagedBean para um Servlet (não funciona).
O que eu fiz então: Do ManagedBean eu gero uma instância do meu Relatório que já faz tudo referente ao relatório (não é a servlet quem preenche relatórios certo) feito isso manda põe essa instância no HttpSession e dá um response.sendRedirect("/suaServlet").
Na Suaservlet vc pega essa instância e aí sim vc poderá “escrever” no response:
privatevoidprocessRequest(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{GerarRelatoriogerarRelatorio=(GerarRelatorio)request.getSession().getAttribute("gerarRelatorio");ByteArrayOutputStreambyteOutPutStream=newByteArrayOutputStream();try{System.out.println("Writing to InPut stream...");JasperExportManager.exportReportToPdfStream(gerarRelatorio.getJasperPrint(),byteOutPutStream);System.out.println("Size of OutPut: "+byteOutPutStream.size());response.setContentLength(byteOutPutStream.size());response.setContentType("application/pdf");//response.setHeader("Content-Disposition","attachment; filename=wpinvenotry-" + new Date() + ".pdf");//response.setHeader("Cache-Control", "no-cache");System.out.println("Writing to OutPut stream...");ServletOutputStreamservletOutPutStream=response.getOutputStream();servletOutPutStream.write(byteOutPutStream.toByteArray(),0,byteOutPutStream.size());System.out.println("Closing stream...");servletOutPutStream.flush();servletOutPutStream.close();}catch(JRExceptionjrex){jrex.printStackTrace();}}
Peguei alguns trechos de outro cara da net…
G
Giulliano
paulohrl:
É cara, o caminho é esse mesmo, você acessar direto o response do HTTPServlet.
Depois posta ai se deu tudo certo.
valew pela força ae…[]'s
P
PinGuaS
cara, eu coloquei essa linha no final e funfou brother