IReport gera pdf direto na tela?

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 JasperPrint
relatorio = JasperFillManager.fillReport(nomeRelatorio, parametros, con);
	JasperViewer viewer = new JasperViewer(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 ???

obs.: não estou usando servlets. ( JSF )

Eu uso assim pra mandar direto o pdf sem gravar:

JasperPrint jp = JasperFillManager.fillReport(pathjasper, parameters, jrCol);  
byte[] relatorio = JasperExportManager.exportReportToPdf(jp);
response.setContentType("application/pdf");
response.getOutputStream().write(relatorio);

Espero que ajude.

[quote=paulohrl]Eu uso assim pra mandar direto o pdf sem gravar:

JasperPrint jp = JasperFillManager.fillReport(pathjasper, parameters, jrCol);  
byte[] relatorio = JasperExportManager.exportReportToPdf(jp);
response.setContentType("application/pdf");
response.getOutputStream().write(relatorio);

Espero que ajude.[/quote]

Vou testar aqui…já te falo…

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…

se for web da pra fazer assim

 try {
          
            InputStream endStream = (InputStream) getServletContext().getResourceAsStream(
                    "/WEB-INF/classes/xxxx/relatorios/etiquetaDestinatarios.jrxml");

            JasperReport jr = JasperCompileManager.compileReport(endStream);

            JasperPrint jp = JasperFillManager.fillReport(jr, parametros, new JRBeanCollectionDataSource(Vetiq));

            String path = 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 gerado
            response.sendRedirect("imprimirEtiqueta.jsp");

        } catch (JRException JREex) {
            System.out.println("Afffffffff ta dando bug nesse Relatorio !!!!!!!!!!!!");
            JREex.printStackTrace();
        }

espero q ajude t+

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.

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

String adobeReader = "/Program Files/Adobe/Reader 8.0/Reader/AcroRd32.exe ";
Runtime.getRuntime().exec(adobeReader + JasperRunManager.runReportToPdfFile(nomeRelatorio, parametrosRelatorio, con));

e se o exe do Acrobat estiver em outro caminho?

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

[quote=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[/quote]

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

É cara, o caminho é esse mesmo, você acessar direto o response do HTTPServlet.

Depois posta ai se deu tudo certo.

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:

    private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	GerarRelatorio gerarRelatorio = (GerarRelatorio) request.getSession().getAttribute("gerarRelatorio");
	ByteArrayOutputStream byteOutPutStream = new ByteArrayOutputStream();

	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...");
	    ServletOutputStream servletOutPutStream = response.getOutputStream();
	    servletOutPutStream.write(byteOutPutStream.toByteArray(), 0, byteOutPutStream.size());

	    System.out.println("Closing stream...");
	    servletOutPutStream.flush();
	    servletOutPutStream.close();
	    
	} catch (JRException jrex) {
	    jrex.printStackTrace();
	}
    }

Peguei alguns trechos de outro cara da net…

[quote=paulohrl]É cara, o caminho é esse mesmo, você acessar direto o response do HTTPServlet.
Depois posta ai se deu tudo certo.[/quote]

valew pela força ae…[]'s

cara, eu coloquei essa linha no final e funfou brother

FacesContext.getCurrentInstance().responseComplete();

depois do close manja

ficou assim no final

        output.flush();
        output.close();

        FacesContext.getCurrentInstance().responseComplete();

espero que abençoe a galeraew