Muitas vezes temos que imprimir algo no nosso projecto flex, mas não sabemos bem como o fazer… ora, e se tivessemos diversos templates para imprimir o que quisermos ? facil não? pois é, neste tutorial vou explicar um processo bem simples de termos os nossos relatórios já praticamente prontos a receber dados para serem impressos… vamos por partes, criem um novo projecto com o nome testRelatorio. e depois criem uma pasta na raiz (normalmente src) desse projecto chamada print e dentro dessa pasta print criem uma nova pasta assets…
No meu exemplo uso o logo do blog, se quiserem seguir o tutorial, copiem a seguinte imagem e colem a seguinte imagem nessa pasta assets:

Logo
Vamos agora criar um novo componente. Menus: File->New->MXML Component e escolham as seguintes definições:
Cliquem em Finish
Temos o nosso template, vamos colocar nesse template todo o código em baixo :
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="595" height="842" backgroundColor="#FDF8F8" backgroundAlpha="1">
- <mx:Canvas x="33" y="34" width="526" height="775" id="safeArea">
- <mx:Text y="10" text="Header" width="288" height="117" id="DOC_HEADER_TEXTO" color="#030303" right="10" fontFamily="Verdana" fontSize="13" fontStyle="italic" textAlign="right"/>
- <mx:Canvas x="0" y="192" width="526" height="583" id="DOC_CONTEUDO">
- </mx:Canvas>
- </mx:Canvas>
- <mx:Image x="33" y="34" source="@Embed(source='assets/logo.png')" id="DOC_LOGO"/>
- <mx:Label x="33" y="185" text="Titulo" width="526" height="27" fontWeight="bold" fontStyle="normal" textAlign="center" fontSize="13" color="#CD3E06" id="DOC_TITULO"/>
- <mx:Label y="805" text="Rodape" width="526" textAlign="center" horizontalCenter="0" id="DOC_RODAPE" color="#919394"/>
- </mx:Canvas>
E pronto, temos o nosso template pronto, com areas de logo, header, titulo, conteudo e rodape, que deve estar como a imagem:
voltamos à nossa aplicação criada no inico do projecto (testRelatorio.mxml) e vamos colar este código:
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFDFD, #FFFDFD]">
- <mx:Script>
- <![CDATA[
- import mx.collections.ArrayCollection;
- [Bindable]
- private var dados:ArrayCollection = new ArrayCollection([{titulo: "Livro a", cod: "#5345", preco: "50 €"},{titulo: "CADER B", cod: "#553", preco: "12 €"},{titulo: "LIVRO FLEX", cod: "#5885", preco: "30 €"}]);
- ]]>
- </mx:Script>
- <mx:DataGrid dataProvider="{dados}" width="350" horizontalCenter="0" verticalCenter="0" id="minhaDataGrid">
- <mx:columns>
- <mx:DataGridColumn headerText="Cod." dataField="cod" width="30"/>
- <mx:DataGridColumn headerText="Artigo 1" width="270" dataField="titulo"/>
- <mx:DataGridColumn headerText="Preco" dataField="preco" width="50"/>
- </mx:columns>
- </mx:DataGrid>
- <mx:Button label="Imprime" width="350" horizontalCenter="0" verticalCenter="90"/>
- </mx:Application>
Devemos ter algo como:
Agora só falta a nossa função de imprimir.
vamos colocar no nosso testeRelatorio.mxml a seguir ao nosso arrayCollection:
- import print.template;
- import mx.printing.FlexPrintJob;
- [Embed(source="print/assets/logo.png")]
- private var logotipo:Class
- private function imprime():void {
- var modelo:template = new template;
- modelo.visible=false;
- addChild(modelo);
- modelo.DOC_HEADER_TEXTO.text="Exmo. Sr. Antunes Costa\n\nRelatorio resumido das compras por pagar!";
- modelo.DOC_LOGO.source=logotipo; //convem ser uma imagem já embebida, podemos usar caminho, mas a class é mais rapida a ser carregada e impede que haja falta de foto na impressão.
- modelo.DOC_TITULO.text="RELATORIO FALTAS!"
- modelo.DOC_RODAPE.text="Listagem de falhas de pagamento. Para mais informações contacte +225 554 25485";
- modelo.DOC_CONTEUDO.addChild(minhaDataGrid); //adicionamos a datagrid como child do nosso conteudo
- //adicionamos o modelo para ficar no stage, invisivel.
- //declaramos o trabalho de impressão
- var printJob:FlexPrintJob = new FlexPrintJob();
- //iniciamos o trabalho de impressão
- if(printJob.start()) {
- //adicionamos a nossa pagina para imprimir
- printJob.addObject(modelo);
- //enviamos o trabalho para a impressora
- printJob.send();
- //removemos o nosso modelo do stage
- removeChild(modelo);
- }
- }
e colocamos no nosso botão de imprimir, dentro da sua tag, o click=”imprime()”;
- <mx:Button label="Imprime" width="350" horizontalCenter="0" verticalCenter="90" click="imprime()"/>
Pronto, salvem a vossa aplicação e corram o exemplo, cliquem em imprimir e vejam o quanto facil foi
Se quiserem podem criar outros templates, das mais variadas formas e exemplos.. sendo que devem importa-lo e adiciona-lo ao stage sempre invisivel para não estragar a vossa aplicação… neste exemplo a datagrid desaparece porque a mudei de child…adicionando-a ao template. Se quiserem sempre visivel, criem uma nova datagrid igual no template.mxml com o nome DOC_DATAGRID e a quando da impressão adicionem-lhe o mesmo dataprovider:
modelo.DOC_DATAGRID.dataProvider=dados;
e voilá!
Dica. Se quiserem imprimir em pdf, ou usam o AlivePDF ou usam um driver da adobe para juntar uma impressora de pdf’s que envia o trabalho de impressão para esse driver que grava em pdf.
Podem ver o exemplo online com o códig fonte disponivel aqui
Espero que seja util.
Abraço.












13 Comentários
Parabéns pelo post, muito informativo, objetico e esclarecedor.
Abraço,
Silva Developer
Obrigado!
Abraço.
Mário muito bom! Abraço.
Muito bom Mario.
Ajudou bastante!
Boa noite Mário,
Este exemplo está muito bom!
Mas quando clico em imprimir escolho pdf e não faz nada.
Verificei que se comentar a linha “modelo.DOC_CONTEUDO.addChild(minhaDataGrid);” imprime tudo!
O que pode ser?? Tenho a versão 10 do flash, será isso??
E imprimir em multiplas páginas, podes ajudar-me?
Obrigado.
José Carlos Fonseca
Fafe - Portugal
Mas está a imprimir como? usando um driver de impressora de pdf’s?
Sim, quando clico no botao imprime surge o ecrã das impressoras e escolho a “Adobe pdf”, dou nome ao doc e confirmo.
Nesta altura começa a criar o pdf. Ao fim de alguns segundos esta janela fecha-se e não tenho o pdf criado.
Obrigado.
José Carlos Fonseca
Fafe - Portugal
Estranho… tente instalar e usar um dos drivers seguintes:
pdf995 Printer Driver - http://www.pdf995.com/download.html
Virtual Pdf Printer - http://www.download.com/1770-20_4-0.html?query=Virtual+PDF+Printer&tag=404&searchtype=downloads
ou o pdf creator ou até mesmo o cutePdf printer nessa mesma pagina…
teste depois conte o que aconteceu….
Já agora, usa que sistema operativo ?
Mário, já instalei o virtual pdf printer e mesmo assim não dá.
O estranho é que se eu usar o teu exemplo que tens nesta página funciona mesmo com a printer que tinha.
O sistema operativo é o XP Pro.
Humm.. mas se funcionava antes, o Sistema Operativo nada tem a ver, você seguiu todos os passos detalhadamente? adicionou bem os childs ?
Se estiver tudo correcto não sei o que se estará a passar… é que esse exemplo que tenho em cima funciona bem aqui…
Se puderes, envia-me o código fonte pra dar uma vista de olhos: admin[at]msdevstudio[ponto]com
cumps
De facto o código é exactamente o que tens no exemplo. Quando disse que funcionava é se eu usar o teu exemplo online.
Não faz mal, vou fazer o print da datagrid, para já, sem num cabeçalho ou rodapé. Obrigado na mesma, o teu exemplo já ajudou bastante.
Aproveito para pedir ajuda noutra questão, por acaso não tens nenhum exemplo em flex + mysql de pesquisa avançada?
Obrigado.
Olá, muito útil esse exemplo, funcionou legal aqui, mas se o datagrid tem muitos dados, e cria a scrollbar, só é impresso os primeiros dados visualizados (imprime até a scrollbar do datagrid). Como resolver isso? Gostaria que fosse impresso o restante dos dados em outras páginas. Obrigado por sua atenção.
Boas Reginaldo, esse é o problema… que também acontece numa caixa de texto no html normal, se imprimir uma pagina web com uma caixa de texto html e se esta tiver scrollbars vai verificar que o seu conteudo não será totalmente impresso…
uma das soluções é antes de imprimir verificar a altura da sua datagrid e no que diz respeito a multi-paginas as coisas complicam-se aplicadas a este exemplo, mas veja:
http://therush.wordpress.com/2007/01/06/flex-datagrid-printing/
http://flexed.wordpress.com/2006/12/26/customgrid-v10-or-searchgrid-v20/
este segundo link é um componente que permite imprimir a datagrid completa…
cumps.