Drukowanie z flasha?

Szczerze mówiąc wątpiłem czy jest taka możliwość :) i czy jest to w miarę proste,  jednak poczułem rozczarowanie gdy wpis w wyszukiwarce google flash+print zwrócił mi masę interesujących wyników…
Wdrożenie pierwszej wersji nie trwało nawet chwili i już po kliknięciu w „grafikę drukarki” mogłem zobaczyć co mi printer może zmalować w wygenerowanym pdf-ie…

_root.printClip.printButton.onRelease = function()
{
    var myPrintJob:PrintJob = new PrintJob();
    var result:Boolean = myPrintJob.start();
    myPrintJob.addPage(_root,
       {xMin:-2, xMax:680, yMin:-2, yMax:500},
       {printAsBitmap:true}
    );
    myPrintJob.send();
    delete myPrintJob;
};

Teraz krótkie objaśnienia :)

ActionScript, zarówno ten 2 i 3 ma fajną klasę co się zowie PrintJob, odwalająca faktycznie większość roboty…
PrintJob służy oczywiście do drukowania z klipów flasha.
Jej podstawowy wygląd :

var myPrintJob:PrintJob = new PrintJob();

Dzięki czemu tworzymy obiekt klasy PrintJob().

Zanim zaczniemy jednak drukować, musimy wywołać metodę start na naszym obiekcie:

var startujDrukarko:Boolean = myPrintJob.start();

Teraz już możemy dodać stronę do drukowania, konstrukcja tego polecenia wygląda następująco:

myPrintJob.addPage(cel, obszarDrukowania, opcje, numerKlatki)

Jak widać addPage klasy PrintJob ma cztery obiekty:

  • cel – listwa czasowa na której znajduje się element który chcemy wydrukować
  • obszarDrukowania – jest to obiekt posiadający cztery zmienne, np: {xMin:1, xMax:200, yMin:2, yMax:200} – określa po prostu obszar klipu jaki zostanie wydrukowany
  • opcje: zasadniczo ma dwa ustawienia… {printAsBitmap:true/false}… jeśli podamy true, będzie drukowany jako bitmapa, dzięi czemu zachowane zostaną np. przezroczystości, cienie… chyba warto dać true :)
  • numerKlatki – numer klatki :)

Trzeba jednak dodać, że aby wszystko ruszyło, wystarczy podać tylko cel…

Zapisałem, zrekompilowałem klip i klikam print… działa… prawie… Film się ciacha gdzieś na 9/10 części… Chyba nie oddam tego klientowi :)
Aby było tak jak być powinno, należy przed puszczeniem klipu do druku przeskalować odpowiednio drukowany element…

Po przeróbkach kod skryptu obsługującego button wygląda następująco:

_root.printClip.printButton.onRelease = function()
{
    var myPrintJob:PrintJob = new PrintJob();
    var myPrintMC:MovieClip = _root;
    myPrintMC._xscale = 87;
    myPrintMC._yscale = 87;
    var result:Boolean = myPrintJob.start();
    myPrintJob.addPage(myPrintMC,
      {xMin:-2, xMax:680, yMin:-2, yMax:500},
      {printAsBitmap:true}
    );
    myPrintJob.send();
    delete myPrintJob;
    myPrintMC._xscale = 100;
    myPrintMC._yscale = 100;
};

Przypisałem po prostu klip _root do nowej zmiennej którą następnie przeskalowałem tak by się pojawiła w całości na standardowej stronie.
Niestety, skalowanie takie sprawiło że cały film się zmniejszał przez co musiałem na koniec wywołać jeszcze przywrócenie wielkości filmu do 100% wielkości.
Grunt że działa :)

Leave a Reply