Zadania środowiska wykonawczego Flash a drukowanie w systemie

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Ponieważ środowiska wykonawcze Flash wysyłają strony do interfejsu drukowania w systemie operacyjnym, ważne jest odróżnienie zadań wykonywanych przez środowiska wykonawcze Flash od zadań realizowanych przez własny interfejs drukowania systemu operacyjnego. Środowiska wykonawcze Flash mogą zainicjować zadanie drukowania, odczytać niektóre ustawienia strony, przekazać treść zadania drukowania do systemu operacyjnego i sprawdzić, czy system lub użytkownik nie anulował zadania drukowania. Inne procesy, takie jak wyświetlanie okna dialogowego właściwego dla drukarki, anulowanie zbuforowanego zadania drukowania lub zgłaszanie statusu drukarki, są obsługiwane przez system operacyjny. Środowiska wykonawcze Flash mogą zareagować na problem przy inicjowaniu i formatowaniu zadania drukowania, ale zwracają tylko wybrane właściwości i zgłaszają tylko niektóre stany interfejsu drukowania w systemie operacyjnym. Programista powinien zadbać o to, aby jego kod reagował na te właściwości lub stany.

Praca z wyjątkami i powrotami

Przed wywołaniem metod addPage() i send() należy sprawdzić, czy metoda PrintJob.start() zwróciła true , na wypadek, gdyby użytkownik anulował zadanie drukowania. Prosty sposób na wstępne sprawdzenie, czy nie doszło do anulowania tych metod, polega na ujęciu ich w instrukcję if , co zilustrowano poniżej:

if (myPrintJob.start()) 
{ 
    // addPage() and send() statements here 
}

Jeśli wywołanie PrintJob.start() zwróciło wartość true , użytkownik wybrał polecenie Drukuj (lub środowisko wykonawcze Flash, np. Flash Player lub AIR, zainicjowało polecenie Drukuj). Możliwe jest zatem wywoływanie metod addPage() i send() .

Ponadto, aby usprawnić zarządzanie procesem drukowania, środowiska wykonawcze Flash generują wyjątki przy wykonywaniu metody PrintJob.addPage() , dzięki czemu możliwe jest wychwytywanie błędów i udostępnianie informacji oraz opcji użytkownikowi. Jeśli wywołanie PrintJob.addPage() zakończy się niepowodzeniem, można wywołać inną funkcję lub zatrzymać bieżące zadanie drukowania. Odpowiednie wyjątki przechwytuje się, osadzając wywołania addPage() w instrukcji try..catch , co ilustruje poniższy przykład: W przykładzie tym zapis [params] zastępuje parametry określające faktyczną treść przeznaczoną do wydrukowania:

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error,  
    } 
    myPrintJob.send(); 
}

Po uruchomieniu zadania drukowania można dodawać treść za pomocą metody PrintJob.addPage() i sprawdzać, czy spowoduje to wygenerowanie wyjątku (na przykład, jeśli użytkownik anuluje zadanie drukowania). W razie wystąpienia wyjątku odpowiednia logika instrukcji catch może udostępniać użytkownikowi (lub środowisku wykonawczemu Flash) informacje i opcje albo zatrzymać bieżące zadanie drukowania. Po pomyślnym dodaniu strony można przystąpić do wysyłania stron do drukarki przy użyciu metody PrintJob.send() .

Jeśli środowisko wykonawcze Flash Player napotka problem podczas wysyłania zadania drukowania do drukarki (np. drukarka jest w trybie offline), również można przechwycić odpowiedni wyjątek i udostępnić użytkownikowi informacje lub dodatkowe opcje (np. wyświetlić komunikat lub alert w animacji). Poniższy przykładowy kod ilustruje przypisanie nowego tekstu do pola tekstowego w instrukcji if..else :

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error.  
    } 
    myPrintJob.send(); 
} 
else 
{ 
    myAlert.text = "Print job canceled"; 
}

Działający przykład można znaleźć w rozdziale Przykład z drukowaniem: skalowanie, obcinanie i reagowanie .

Praca z właściwościami strony

Gdy użytkownik kliknie przycisk OK w oknie dialogowym Drukowanie, a metoda PrintJob.start() zwróci wartość true , dostępne stają się właściwości wynikające z ustawień drukarki. Należą do nich szerokość strony, wysokość strony, ( pageHeight i pageWidth ) oraz orientacja wydruku na papierze. Ponieważ są to ustawienia drukarki, na które nie ma wpływu środowisko wykonawcze Flash, odpowiednich właściwości nie można zmodyfikować. Można je natomiast wykorzystać w celu treści wysyłanej do drukarki do bieżących ustawień. Więcej informacji zawiera sekcja Ustawianie rozmiaru, skali i orientacji .

Wybór renderowania wektorowego lub bitmapowego

W ramach zadania drukowania każda strona może być buforowana jako grafika wektorowa lub obraz bitmapowy. W niektórych przypadkach drukowanie wektorowe pozwala na zmniejszenie objętości pliku buforowania i zapewnia lepszą jakość wydruku. Jeśli jednak treść zawiera obraz bitmapowy i chcemy zachować przezroczystość alfa lub efekty kolorowe, należy wydrukować stronę jako bitmapę. Ponadto drukarki nieobsługujące języka PostScript automatycznie konwertują grafikę wektorową na bitmapy.

Wydruk bitmapy jest określany przez przekazanie obiektu PrintJobOptions jako trzeciego parametru metody PrintJob.addPage() .

W przypadku programu Flash Player i środowiskach AIR starszych niż AIR 2 należy ustawić parametr printAsBitmap obiektu PrintJobOptions na wartość true w następujący sposób:

var options:PrintJobOptions = new PrintJobOptions(); 
options.printAsBitmap = true; 
myPrintJob.addPage(mySprite, null, options);

Jeśli wartość trzeciego parametru nie zostanie określona, w zadaniu drukowania przyjęta zostanie opcja domyślna, czyli drukowanie wektorowe.

W przypadku środowiska AIR 2 i nowszych aby określić metodę drukowania, należy użyć właściwości printMethod obiektu PrintJobOptions. Ta właściwość akceptuje trzy wartości, które są zdefiniowane jako stałe w klasie PrintMethod:

  • PrintMethod.AUTO : Automatycznie wybiera najlepszą metodę drukowania na podstawie drukowanej treści. Na przykład, jeśli strona zawiera tekst, zostanie wybrana metoda druku wektorowego. Jeśli jednak pod tekstem jest umieszczony obraz znaku wodnego zawierającego przezroczystość alfa, wybrany zostanie druk bitmapowy pozwalający na zachowanie przezroczystości.

  • PrintMethod.BITMAP : Wymusza drukowanie bitmapowe bez względu na treść

  • PrintMethod.VECTOR : Wymusza drukowanie wektorowe bez względu na treść

Synchronizacja czasowa instrukcji związanych z zadaniem drukowania

Język ActionScript 3.0 nie ogranicza obiektu PrintJob do pojedynczej klatki (tak było w poprzednich wersjach języka ActionScript). Ponieważ jednak system operacyjny wyświetla informacje o statusie drukowania po kliknięciu przycisku OK w oknie dialogowym Drukowanie, jak najszybciej należy wywołać metodę PrintJob.addPage() i PrintJob.send() w celu wysłania stron do programu buforującego. Jeśli zakres opóźnienia obejmuje klatkę, w której wywoływana jest metoda PrintJob.send() , nastąpi opóźnienie procesu drukowania.

W języku ActionScript 3.0 istnieje limit czasu skryptu wynoszący 15 sekund. Dlatego odstępy czasu między kolejnymi kluczowymi instrukcjami w sekwencji zadania drukowania nie mogą przekraczać 15 sekund. Innymi słowy, 15-sekundowy limit czasu skryptu obowiązuje dla następujących przedziałów czasu:

  • między PrintJob.start() a pierwszym wywołaniem PrintJob.addPage() ;

  • między PrintJob.addPage() a następnym wywołaniem PrintJob.addPage() ;

  • między ostatnim wywołaniem PrintJob.addPage() a wywołaniem PrintJob.send() .

Jeśli którykolwiek z tych przedziałów czasowych trwa więcej niż 15 sekund, następne wywołanie metody PrintJob.start() w instancji klasy PrintJob zwróci false , a następnie wywołanie metody PrintJob.addPage() z w instancji klasy PrintJob spowoduje wygenerowanie wyjątku przez program Flash Player lub środowisko AIR.