Se esta querendo aprender ou iniciar novos projetos em Flex, clique aqui

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

29 comentários

Deixe uma resposta

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

     
  2. 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!

     
  3. @Cícero é possível sim.

     
  4. 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.

     
  5. 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!

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

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

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

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

     
  10. 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?

     
  11. Tem algum exemplo de impressão usando o .NET

    Obrigado.

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

     
  13. 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.

     
  14. @Ronaldo Em ambos ele abre em nova janela.

     
  15. 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?

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

     
  17. 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

     
  18. 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.

     
  19. 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

     
  20. 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.

     
  21. 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!

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

    Congratulations.

     
  23. 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.

     
  24. when i click on download, nothing happens

     
  25. Obrigado pelo comentário

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