Bha, uma das coisas mais importante de qualquer sistema, são os relatórios. Então eu não poderia deixar de falar sobre eles e como gerar PDF através de gráficos do Flex.

Neste exemplo explico como gerar PDF através de um gráfico do Flex, utilizando o HTML2PDF. Uma biblioteca em PHP que utiliza o FPDF. Esta biblioteca tem a vantagem de você poder gerar um código HTML com toda estrutura do PDF e enviar para a biblioteca que o converte. Esta facilidade agregada com a facilidade de gerar gráficos com o Flex, torna este exemplo pequeno e simples de ser aplicado a qualquer outro projeto.

É gerado um gráfico do tipo LineChart, e este gráfico é copiado pela função “copiaJPG()“, codificado em 64 bits pela função encodeImageAsBase64 e enviado por HTTPService como uma string. esta String é recebida pelo PHP, que o decodifica com a função base64_decode, e é salvo com o nome de “img.jpg“.

Abaixo o código da função que captura e envia a imagem e a função que recebe a imagem no servidor:

Arquivo main.mxml
private function copiaJPG(source:IBitmapDrawable):void {
    var ohSnap:ImageSnapshot = ImageSnapshot.captureImage(source, 0, new JPEGEncoder(100.0));
    graficoString = ImageSnapshot.encodeImageAsBase64(ohSnap);
    form1.send();
}
.......
<mx:HTTPService id="form1" method="POST" resultFormat="text"
                           result="{AbrirPDF(event.result)}"
                           url="/code/053/br/php/pdf/recebeIMG.php">
    <mx:request>
        <IMG>{graficoString}</IMG>
    </mx:request>
</mx:HTTPService>
Arquivo br/php/pdf/recebeIMG.php
$nomeArquivo = str_replace("//", "/", "imagemRel/img.jpg");
if ($setaArquivo = @fopen($nomeArquivo, 'w'))
{
    @fwrite($setaArquivo, base64_decode( $_POST['IMG']));
}

Quando o servidor responde que a imagem esta salva, a função AbrirPDF é invocada, e uma URL é chamada para enviar o PDF para download.

arquivo main.mxml
private function AbrirPDF(e:Object):void
{
    navigateToURL(new URLRequest("/code/053/br/php/pdf/geraPDF.php"), "download");
}

O arquivo “br/php/pdf/geraPDF.php“, monta um HTML e envia para a função “WriteHTML” que transforma todo o HTML em PDF.

Abaixo segue arquivo completo.

Para ver o código fonte clique aqui.

Gostou? Não esqueça de curtir!

Ou compartilhe o link com seus amigos

Compartilhar no Facebook Compartilhar no Google + Compartilhar no Twitter Compartilhar no LinkedIn

29 comentários

  1. Celso

    Muito obrigado pelo seu esforço em publicar artigos em Flex, nós meros aprendizes agradecemos você.

  2. Alemão

    Obrigado pelo comentário

  3. Ricardo Poblete

    when i click on download, nothing happens

  4. Alemão

    English
    I was called the PDF within an IFRAME, and in this case the brouser was running internally.

    Português
    Eu estava chamava o PDF dentro de um IFRAME, e neste caso o brouser estava executando internamente.

  5. Ricardo Poblete

    I tried again and it worked. Great job :-)

    Congratulations.

  6. Arthur Gouveia

    Olá!

    Cara, gostaria de saber se caso eu enviasse para o PHP não apenas o componente do gráfico, mas sim o Canvas no qual ele e outros componentes estão inseridos, seria impresso o Canvas e todos os componentes que estiverem dentro dele...

    Preciso gerar um PDF e tal, mas meu gráfico sem os dados que estão ao lado não fica tão útil...

    Grato!

  7. Alemão

    Na função  copiaJPG(source:IBitmapDrawable), você apenas envia o ID do objeto que queres enviar. Pode ser um Canvas inteiro, um DataGrid, uma aplicação inteira, ou qualquer outro outro objeto.

    O PHP receberá como imagem, e se precisares mexer em algum item póderás utilizar a biblioteca GD para isto.

  8. Celão

    Fala Alemão,

    Muito obrigado pelo post, foi de grande, imensa utilidade.
    Só tenho uma dúvida: quando eu passo o ID de um datagrid, ele corta o resultado, pegando apenas o que está visível e desconsiderando o resto do conteúdo que está escondido na scrollbar.
    Isso já era de se esperar pelo nome da função ImageSnapshot.captureImage, ou seja, snapshot.

    Eu queria saber se há alguma forma de simplesmente pegar o conteúdo inteiro do datagrid e mandar pro php?

    Abçs

  9. Alemão

    Ola Celão

    Com relação ao Datagrid, há duas maneiras de trata-lo. A primeira é gerra todo os dados do Datagrid em Tabela.

    A segunda, é esticar o datagrid de modo a ficar completamente visível. Neste ponto passar o ID.

  10. Celão

    Alemão,

    Obrigado pela ajuda.
    O que fiz, foi tirar essa parte de snapshot e no navigateToUrl eu chamei um php que gerava a tabela em html, gera o pdf e exibe os headers pra download.
    Ou seja, fiz tudo pelo php mesmo, achei mais simples.

    Abração

  11. [...] Fevereiro 11, 2009   Tava dando uma olhada nuns links de flex e encontrei este post. [...]

  12. Ronaldo

    Alemão,
    Porque quando eu chamo a geraPDF.php ele abre uma janela para download e usando o site http://code.mxml.com.br/.... ele abre na propria janela?

  13. Alemão

    @Ronaldo Em ambos ele abre em nova janela.

  14. Anderson Abdalla

    Olá Alemão! Cara, primeiro gostaria de lhe parabenizar pelo site que está sendo de grande utilidade para nós que tentamos fazer alguma coisa em Flex. Preciso de um e-mail seu para contato direto. Obrigado.

  15. Marcos

    Show de bola... Agora em jsp vc pode dar uma dica como ficaria???
    Valeu cara..

  16. Iron

    Tem algum exemplo de impressão usando o .NET

    Obrigado.

  17. Alemão
  18. Iron Man

    Desculpa, me expressei errado.

    No .net estamos usando o CristalReport para gerar relatórios e usamos o Flex para parte visual do projeto.

    Existe um comando do CristalReport que exporta em stream o relatório PDF, só que agora eu preciso pegar essa stream do .net e jogar para o flex, para o cliente ter a opção de visualizar ou salvar o pdf.

    A minha restrição é que eu não posso gravar o pdf no servidor.

    O que me indicam?

  19. Alemão

    @Iron Tem que ver se a ferramenta possui este recurso.

  20. Fabio

    Olá, você saberia me dizer se é possível imprimir em impressora matricial pelo Flex ? Estou tetando mas com pau as impressões..

  21. Eduardo Kraus

    @depende muito de como estas fazendo! Se estas gerando PDF deves o fazer com as margens da impressora.

  22. Fellipe Augusto

    Amigo, você sabe se teria como eu fazer isso com o Java?

    Preciso salvar a Snapshot de um grafico e enviar pro java salvar ela, mas n sei como fazer isso!

  23. Eduardo Kraus

    Sim, no server apenas crie uma classe que recebe e salva.

  24. Fellipe Augusto

    Entao chapa, eu fiz aqui tudo pah, mas o problema é: Na hora que o flex manda o ByteArray para o Java receber como byte[], ele vem um valor muito estranho!
    Acho que o problema esta quando o flex converte essa img em String pra mandar pro java.

  25. Cícero

    olá Alemao, parabenss pelo post
    Uma duvida tem como gerar um pdf a partir de array de bytes vindo de um socket? ou ate aceito uma sugestao melhor.

    Abraço!

  26. Eduardo Kraus

    @Cícero é possível sim.

  27. Anderline

    Muito massa, você sabe se tem um biblioteca que faça o mesmo só que para o back-end em Java? Agradeço...

  28. Eduardo Kraus

    Java Report.

Deixe uma resposta