Ajuda no Jasper+JSF+RichFaces+Facelets

7 respostas
Tchello

Bom dia pessoal!

Bom, tenho o seguinte ambiente:

NetBeans 6.5, JSF 1.2, Facelets, jaspereports (com iReport 3.0) e RichFaces 3.3.1.

Em certo ponto do meu sistema preciso gerar um relatório, com o jasper e exibi-lo em um ModalPanel do RichFaces.
O que consegui fazer, até agora, foi abrir esse relatório em outra aba do navegador, bonitinho.
Mas ainda estou empacado em como abri-lo no ModalPanel, pra dar um efeito mais profissional a aplicação.
Alguém tem alguma idéia de como isso pode ser feito?!

Aqui está o código que o abre em outra aba:

...
//criação do data...
...
JRDataSource ds = new JRBeanArrayDataSource(data);

            /*  Informa o parâmetro do diretório real da aplicação
             * para as imagens no relatório.
             */
            String realPathImg = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getRealPath("/img/");
            parameters.put("pathImages", realPathImg);

            String realPath = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getRealPath("/WEB-INF/classes/reportFile/relatorioCompraVenda.jasper");
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(realPath);

            HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

            PrintWriter printWriter = response.getWriter();
            JRHtmlExporter htmlExporter = new JRHtmlExporter();
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);

            response.setContentType("text/html");
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
            htmlExporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT, jasperPrint);
            htmlExporter.setParameter(JRHtmlExporterParameter.OUTPUT_WRITER, printWriter);
            htmlExporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image?image=");
            htmlExporter.exportReport();

            FacesContext.getCurrentInstance().responseComplete();

Chamada do método:

...
<h:commandButton image="/img/Printer_Picture45x.png" styleClass="btnBottom" id="cmdBtnPrintOrder"
                                                 disabled="#{GeracaoPedidoCompraBean.activeBtn}" action="#{GeracaoPedidoCompraBean.imprimirPedido}"
                                                 onclick="document.getElementById('formOrderGenerate:outputLinkOrder').click();"/>

<h:outputLink id="outputLinkOrder" target="_blank" rendered="false">gerar</h:outputLink>
...

Qualquer idéia será de grande ajuda!

Abraços!

7 Respostas

M

Olá Tchello, tudo bem?

De uma olhada na tag a4j:mediaOutput, acho que ela deve resolver o seu problema!

Pena que não tenho nenhm exemplo!

Abraços

Tchello

markinho:
Olá Tchello, tudo bem?

De uma olhada na tag a4j:mediaOutput, acho que ela deve resolver o seu problema!

Pena que não tenho nenhm exemplo!

Abraços


Hmmmm!

Muito obrigado markinho, verificarei e posto aqui os resultados.

Abraços!

Tchello

Nossa cara, milhares de testes e buscas no google e to chegando perto de conseguir.

Consigo exibir o relatório em forma de imagem jpeg mas o tamanho ta ficando gigante, tem como limitar isso?!

Queria mesmo MESMO era exibir o pdf ali dentro, mas muitas pesquisas resultaram em: mta gente tem essa vontade, algumas apontam possíveis soluções que todos testaram e não funcionam direito =(

Eis o código:

//esse aqui exibe o relatorio na forma de imagem
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
                BufferedImage image = (BufferedImage) JasperPrintManager.printPageToImage(jasperPrint, 0, 2.0f);

                ImageIO.write(image, "jpg", out)               ;
                //esse exibe como pdf. ps: não funciona =/
                /*byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, ds);
                out.write(bytes);*/

O MediaOutPut ficou assim:

<a4j:mediaOutput element="img" cacheable="false" session="true" id="imgModalRelatorioImpressao"
                        createContent="#{GeracaoPedidoCompraBean.imprimirPedido}" mimeType="image/jpeg"/>

Enfim, alguém tem alguma idéia de como limitar o tamanho da imagem e/ou como fazer pro pdf funcionar?
Juro que pesquisei MESMO, mas ta soda encontrar a solução do pdf =/

Abraços!

M

Cara, fiquei pensando em uma solução para o seu problema.

E tive uma idéia porém não sei se irá funcionar!

Tente colocar um iframe dentro do modalPanel, e faça com antes … como se tivesse abrindo em outra aba, porém o iframe estará dentro do modalPanel!

Acho que é essa a solução!

Espero que você consiga!

Abraços e boa sorte!

Tchello

Cara, o mediaoutput funcionou muito bem!
Só pra exibir PDFs que não funciona e o google só encontra pessoas que tbm nao conseguiram, mas enfim =/
Então, o problema do scroll eu resolvi com scrolling divs, deram conta do recado certinho!

Enfim, o único problema que tenho agora é que o mediaoutput só executa o método na primeira vez!
É que a imagem que quero exibir nele é dinamicamente gerada de acordo com uns parametros setados na pagina, ou seja, ela pode variar várias vezes mas depois da primeira vez gerada o metodo não é chamado mais, mesmo mandando rerenderizar o modalpanel (ele se encontra em um modal) onde ele está contido.
Tentei setar os atributos session=“false” e cacheable=“false” mas continua tendo esse comportamento.

Alguém tem ideia do que possa ser?!

Abraços e muito obrigado pessoal!!

Tchello

Putz!
É um problema do firefoca isso:
http://markmail.org/message/xa7jzsfje4ltksg4#query:related%3Axa7jzsfje4ltksg4+page:1+mid:mwav6gydguo4ywaj+state:results

Não entendi ao certo a gambiarra sugerida, onde exatamente eu deveria gerar o hascode?!
Na verdade nem uso aquele Object Data da assinatura do métod do “createContent”. Seria nele?
Abraços!

brunolmfg

Seguinte,

uma sugestão é utilizar o jasperreportjsf. Ele utiliza a abordagem de através de tags ser efetuado a renderização do relatório. Acredito que seja um abordagem mais interessante do que a do a4j:mediaOutput.

Sua utilização é bem simples: jr:report renderiza como um iframe e jr:reportLink renderiza como um link. E também é necessário a configuração do datasource [3].

Toda a configuração e utilização estão descritas em [1], [2] e [3].

Espero que ajude.

[1] http://jasperreportjsf.sourceforge.net/web/getting_started.html
[2] http://jasperreportjsf.sourceforge.net/web/rendering_reports.html
[3] http://jasperreportjsf.sourceforge.net/web/datasources/index.html

Criado 26 de junho de 2009
Ultima resposta 13 de jan. de 2010
Respostas 7
Participantes 3