Desenvolvimento - ActionScript

Flash - Controlando impressão pelo ActionScript 2.0

A matéria dessa semana é um pedido de um dos meus leitores, o Danilo Farias lá de Piracicaba-SP, no e-mail que ele me enviou ele pedia informações de como imprimir diretamente do Flash eis aqui uma solução.

por Igor Costa



A matéria dessa semana é um pedido de um dos meus leitores, o Danilo Farias lá de Piracicaba-SP, no e-mail que ele me enviou ele pedia informações de como imprimir diretamente do Flash. Eis aqui uma solução.

Primeiramente gostaria de comentar a respeito de impressão, existem várias formas para se imprimir conteúdo web, seja através do próprio navegador, do botão direito do mouse sobre uma parte do filme que você gostaria de imprimir, e até mesmo a velha e famosa tecla do "print-screen".

Então, tendo essas opções em mãos, vamos comentar as vantagens e desvantagens de cada uma delas.

1. Lógico que várias pessoas conseguem imprimir diretamente do navegador, seja ele qual for, ou lingua só ir lá no arquivo (file), imprimir (print) e pronto, vai aparecer a caixa de diálogo de impressão, bem rápido você tem aquele conteúdo pronto para ser entrege e impresso, mas uma das desvantagens é que você não controla o que você gostaria de imprimir, então o que fazer? Nesse caso não existe uma solução concreta, isso sem eu ter mencionado se o filme tiver movieclips que não param nunca, algum loop na página. Como sairá no papel? Vamos então descartar essa possibilidade.

2. No botão direito do mouse ou como vocês preferem dizer (right-click), é uma boa alternativa e bem melhor que a anterior, mas eu vos digo logo de ante-mão. Quem garante que isso vai imprimir como você realmente queira? Porque quando o filme do Flash é compilado ele executa todo o arquivo swf como se fosse 1 só, e se dentro desse existir um loadMovie ou um LoadVars, quem garante que todo esse conteúdo vai ser impresso? Então vamos descartar essa opção também que não é válida para o nosso caso.

3. Print-Screen é até que é bom para mostrar algum conteúdo, mas caso você que é designer e gosta sempre de inventar coisas novas ou malucas, digo já, você precisará de um editor de imagens ou fotos para que o conteúdo de tela capturado seja visto como você queira.("Fábio Lody" desculpa pelas palavas nada contra"), então você gasta muito mais para ter mais trabalho.

Visto as três opções e sendo que nenhuma delas formaram uma solução satisfatória, vem agora a quarta e definitiva solução para o nosso caso.

Nada menos que o ActionScript. Só poderia ser obviamente ele que vai resolver nossas solução, basta colocar-mos a ação e a classe no local certo para que o usuário ou visitante que esteja vendo a sua página possa imprimir o conteúdo que ele deseja sem ter trabalhos adicionais, para o resultado que ele almeja.

As vantagens de controlar impressão por Actionscript é que você pode facilmente imprimir um conteúdo definindo na sua classe por níveis ou especificar qual MovieClip você queira imprimir. Imprimir o conteúdo especificado como vetor, que é bem melhor e mais viável a impressão do que em bitmap, você pode usar várias formas de impressão como desejar em em partes do seu filme, frames, ou cenas.

Você deve estar se perguntando por que não mencionei as desvantagens, eu simplesmente insisto em dizer que não tem desvantagens, a não ser que você encare 1 ou 2 horas a mais na confecção do seu filme, seja considerado perca de tempo, ai sim você pode listar como desvantagem.

Ok, OK, já falei demais, metamos então as mãos em cena e façamos jûs ao que foi dito até agora.

Para fazer tudo isso que citei acima na quarta opção, para a criação de um conteúdo típico para impressão nada mais do que usar a Classe PrintJob não faça. Sigua os pequenos passos abaixo:

Para começar a usar vá ao Flash MX 2004 ou MX 2004 pro

1. Crie um novo documento, tanto faz ser ou não um arquivo *.as ou *.fla.

2. Caso escolha a opção de arquivo *.fla abra o painel de ações (F9)

Feito esses pequenos pulos de passos criaremos então nossa classe, primeiro de tudo precisamos citar que tipo instancia irá ser criada.

A instância que irei usar para minha classe será a impressao. então digito a primeira linha abaixo:

var impressao:PrintJob = new PrintJob();

Criada a variável de instância da qual a linha acima irá fazer referência a instância impressao.

OK, Ok você vai me perguntar agora onde eu coloco isso que acabei de digitar, ô menino(a) coloca isso no primeiro frame da sua primeira camada, não faça nada apenas isso.

Então, continuando, para chamar o objeto PrintJob e dizer a ele o que ele vai imprimir, qual cena, MC, frame, etc, precisamos adicionar o método addPage(). Mas antes de usá-lo precisamos primeiro adicionar um método para começar a impressão start(), caso contrário não vai imprimir nada, então façamos a continuação

1| var impressao:PrintJob = new PrintJob();
2| var resultado:Boolean = impressao=start();

Na segunda linha adicionada o que fiz? Criei uma instância e chamei ela de resultado da qual ela não irá retornar nenhum valor para mim, por que a ela dei o método start() para começar a impressão.

O que acabei de informar nada mais é do que a mesma coisa que acontece quando a caixa de diálogo da impressora é aberta quando você faz a requisição para imprimir um determinado documento lá embaixo, dependendo do sistema operacional vão existir 2 botões 1 com um label OK ou Imprimir e o outro cancelar ou Cancel, o primeiro irá ser nossa instância de resultado igual a true e o cancel ou o cancelar será nossa instância em false.

Caso você queria controlar melhor sua classe e adicionar mais controle você pode usar um if else que resolve se problema de maneira simples, vejamos:

1| var impressao:PrintJob = new PrintJob();
2| var resultado:Boolean = impressao.start();
3| // inicar a condição com if e else
4| if (resultado) {
5| // inicio de impressão com sucesso
6| // adicione suas páginas a serem impressas aqui
7| } else {
8| // resultado da impressão não aceita ou cancelada
9| }

O código acima dá mais um pouco de controle ao que será impresso isso é muito bom e o Flash não executará nenhum MC ou frame antes de receber da caixa de diálogo uma resposta seja ela verdadeira ou falsa.

Até agora você aprendeu a criar sua classe com o PrintJob, usar o método de iniciar impressão e controle de execução do seu filme.

Comentado anteriormente acima o método addPage(), para adicionar qual parte do filme será impressa. Para usar o método addPage(), ele segue uma sintaxe de uso, que é a seguinte abaixo:

1| impressao.addPage(target,printArea, options, frameNumber);

O método addPage segue essa lógica de sintaxe para funcionar perfeito, ela pode até ser costumizada, não sendo necessário seguir o padrão enxergado, sendo opcional o uso de alguns desses parâmetros exceto o target ("lógico"); Vamos comentar os parametros que esse método tem.

.target - Esse parâmetro define qual o alvo será atingido, se você digitar números o compilador do filme vai entender que você está definindo por níveis de camadas, mas se for digitado strings como "asprint", sem aspas ele vai entender que será o movieclip instanciado que será impresso.

.printArea - Esse parâmetro é especificado por 4 propriedades internas, a xMin, xMax, ymin, yMax. Essas propriedades vai determinar a área que será impressa dentro do alvo mencionado.

.options - Nas opções você define se você quer que ele imprima como bitmap ou vetor, nesse caso ele é um valor booleano definido pela palavra chave printAsBitmap, da qual vai ser impressa e se igualada a true vai imprimir bitmap se false imprime como vetor. Se caso você deixe esse opção em branco ela vai imprimir como vetor.

.frameNumber - Imprime caso você especifique qual frame você quer que ele imprima, lembrando que ele aceita apenas por números de frames e não em labels.

Vamos agora praticar, voltando ao que foi digitado anteriormente

1| var impressao:PrintJob = new PrintJob();
2| var resultado:Boolean = impressao.start();
3| // inicar a condição com if e else
4| if (resultado) {
5| trace ("Impressão inicada");
6| // inicio de impressão com sucesso
7| minhaimpressao.addPage("imprima_mc");
8| } else {
9| trace ("Impressão cancelada pelo usuário");
10| // resultado da impressão não aceita ou cancelada
11| }

Com o código acima digitado no primeiro frame do seu filme, vamos criar um movieclip qualque e instancia-lo como "imprima_mc", sem aspas.

Veja que usei um comando trace para aparecer no painel de output a mensagem designada. Agora dê um ctrl+enter para testar seu filme e veja a caixa de diálogo da impressora aberta, requisitando um valor a ser esperado.

Pronto você acaba de concluír uma etapa de nosso aprendizado, caso você já esteja cansado e não aguenta mais ler, ok, eu entendo sua necessidade brévia e básica de saber controlar seu filme. Mas você ai que está querendo mais vamos, adiante e ver o que a classe tem a nos oferecer.

Vamos agora usar outro exemplo, adicionando as propriedades do parametro de opções e printArea

Crie outro filme com as mesmas características do anterior, mude uma imagem ou algo assim e crie um movieclip, nele instancei de imprima_mc

1| var impressao:PrintJob = new PrintJob();
2| var resultado:Boolean = impressao.start();
3| // inicar a condição com if e else
4| if (resultado) {
5| trace ("Impressão inicada");
6| // inicio de impressão com sucesso
7| minhaimpressao.addPage("imprima_mc",null,{printAsBitmap:true},5);
8| } else {
9| trace ("Impressão cancelada pelo usuário");
10| // resultado da impressão não aceita ou cancelada
11| }

Na linha 7 como vocês podem ver eu usei a sintaxe completa do método addPage(); para imprimir meu MC. A palavra null para quem não conheçe é tipo assim diz que não tem valor é inteira, não que seja variável int, mas que seja usado ou impresso por completo, escolhi a opção de imprimir como bitmap e o número de frames pedir que fosse impresso até o 5.

Agora vamos usar o parametro printArea mais específico e detalhado, no exemplo abaixo que segue a mesma lógica dos anteriores.

1| var impressao:PrintJob = new PrintJob();
2| var resultado:Boolean = impressao.start();
3| // inicar a condição com if e else
4| if (resultado) {
5| trace ("Impressão inicada");
6| // inicio de impressão com sucesso
7| minhaimpressao.addPage("imprima_mc",0,{xMin:50, xMax:134, yMin:21, yMax:160});
8| } else {
9| trace ("Impressão cancelada pelo usuário");
10| // resultado da impressão não aceita ou cancelada
11| }

Pronto tá ai o código, você pode usar uma determinada especificação para a impressão, determinando o tamanho que você quer usar.

Seguindo esse mesmo raciocínio você pode adicionar quantas páginas quiser e especificar cada uma delas da maneira que desejar.

Pronto estamos chegando ao final da nossa matéria então lembrando o que vimos pratique assim diz o noso amigo Neto, quanto mais se pratica se aprende.

Qualquer dúvida só enviar e-mail e não esqueça de participar da lista de discussão do ActionScript-Brasil no endereço abaixo:

ActionScirpt-Brasil
site :http://br.groups.yahoo.com/group/actionscript-brasil/
assinar: actionscript-brasil-subscribe@yahoogrupos.com.br

Igor Costa

Igor Costa - Igor Costa é consultor e desenvolvedor freelancer com 7 anos na plataforma Flash, escreve para o linha de código e revistas IT relacionadas, Igor é ex-membro Team da Macromedia para Flash. em seu site igorcosta.com, você encontra um pouco mais sobre o autor.
Atualmente presta consultoria e desenvolve em São Paulo Capital onde escolheu para morar.