Задачи среды выполнения Flash и системная печать

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Так как среда выполнения Flash отправляет страницы интерфейсу печати операционной системы, необходимо понимать, какими задачами управляет среда выполнения Flash, а какими — собственный интерфейс печати операционной системы. Среда выполнения Flash может запускать задание печати, считывать некоторые параметры страницы с принтера, передавать содержимое задания печати в операционную систему и проверять, не отменено ли задание печати пользователем или системой. Другие процессы, такие как отображение диалоговых окон принтера, отмена отправленного задания печати или сообщение состояния принтера, управляются операционной системой. Среды выполнения Flash могут реагировать на возникновение проблем, связанных с запуском или форматированием задания печати, но могут сообщать лишь о некоторых свойствах или условиях интерфейса печати операционной системы. Код необходимо разработать таким образом, чтобы он реагировал на эти доступные свойства и условия.

Работа с исключениями и возвращаемыми значениями

Необходимо убедится, что метод PrintJob.start() возвращает значение true , прежде чем вызывать методы addPage() и send() , на тот случай, если пользователь решил отменить задание печати. Проверить, не отменены ли эти методы, перед продолжением выполнения можно с помощью инструкции if .

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

Если метод PrintJob.start() возвращает значение true , пользователь выбрал команду «Печать» (либо она инициирована средой выполнения Flash, например Flash Player или AIR). В таком случае можно вызывать методы addPage() и send() .

Кроме того, чтобы облегчить управление процессом печати, среда выполнения Flash выдает исключения для метода PrintJob.addPage() , чтобы можно было перехватывать ошибки и предоставлять пользователю сведения и возможные пути решения. Если выполнение метода PrintJob.addPage() завершается ошибкой, можно вызвать другую функцию или остановить текущее задание печати. Для перехвата таких исключений нужно внедрить вызовы addPage() в оператор try..catch , как показано ниже. В этом примере [params] — это место для параметров, которые определяют фактическое содержимое, предназначенное для печати.

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

После запуска задания печати можно добавлять содержимое с помощью метода PrintJob.addPage() и следить за появлением исключений (например, если пользователь отменил задание печати). Если выдается ошибка, можно добавить в инструкцию catch логику, которая будет предоставлять пользователю (или среде выполнения Flash) сведения и возможные решения, или же можно отменить текущее задание печати. В случае успешного добавления страницы можно перейти к отправке страниц принтеру с помощью метода PrintJob.send() .

Если среда выполнения Flash сталкивается с проблемой при отправке задания печати принтеру (например, если принтер отключен), такое исключение также можно перехватить и получить дополнительные сведения или основу для возможных решений (например, путем вывода текстового сообщения или показа предупреждения в рамках анимации). Например, можно присвоить новое содержимое текстовому полю, внедренному в оператор if..else , как показано ниже.

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

Рабочий пример см. в разделе « Пример печати: масштабирование, обрезка и динамическая настройка ».

Работа со свойствами страницы

Когда пользователь нажимает кнопку «ОК» в диалоговом окне «Печать» и метод PrintJob.start() возвращает значение true , можно получить свойства, определенные параметрами принтера. К таким параметрам относится ширина и высота бумаги ( pageHeight и pageWidth ), а также ориентация содержимого на бумаге. Так как настройки принтера не контролируются средой выполнения Flash, их нельзя изменять. Однако их можно использовать для согласования содержимого, отправляемого принтеру, с текущими настройками. Дополнительные сведения см. в разделе « Настройка размера, масштаба и ориентации страницы ».

Выбор векторной или растровой визуализации

Задание печати можно настроить вручную так, чтобы каждая страница передавалась спулеру как векторная графика или как растровое изображение. В некоторых случаях векторная печать генерирует меньший по размеру файл подкачки и позволяет получить более качественное изображение, чем при растровой печати. Однако если содержимое включает растровое изображение и требуется сохранить альфа-прозрачность и цветовые эффекты, страницу необходимо печатать как растровое изображение. Кроме того, если принтер не использует драйвер PostScript, он автоматически преобразует векторную графику в растровое изображение.

Растровая печать задается путем передачи объекта PrintJobOptions в качестве третьего параметра PrintJob.addPage() .

Для версий Flash Player и AIR, предшествующих AIR 2, задайте для параметра printAsBitmap объекта PrintJobOptions значение true , как показано ниже:

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

Если третий параметр не определен, задание печати будет использовать значение по умолчанию, то есть векторную печать.

Для AIR 2 и более поздних версий используйте свойство printMethod объекта для указания метода печати. Для этого свойства допустимы три значения, которые заданы как константы в классе PrintMethod:

  • PrintMethod.AUTO : автоматический выбор наиболее подходящего метода печати в зависимости от печатаемого содержимого. Например, если на странице содержится текст, выбирается метод векторной печати. Однако, если изображение водяного знака с альфа-прозрачностью накладывается на текст, выбирается метод растровой печати для сохранения прозрачности.

  • PrintMethod.BITMAP : принудительный выбор метода растровой печати вне зависимости от содержимого

  • PrintMethod.VECTOR : принудительный выбор метода векторной печати вне зависимости от содержимого

Время ожидания инструкций задания печати

ActionScript 3.0 не ограничивает объект PrintJob одним кадром (как это было в предыдущих версиях программы ActionScript). Однако поскольку операционная система отображает информацию о состоянии печати пользователю после нажатия кнопки «ОК» в диалоговом окне «Печать», необходимо как можно быстрее вызвать методы PrintJob.addPage() и PrintJob.send() , чтобы отправить страницы в спулер печати. Задержка при обращении к кадру, содержащему вызов PrintJob.send() , приведет к задержке процесса печати.

В ActionScript 3.0 установлен предел времени ожидания, равный 15 секундам. Поэтому время между двумя значимыми инструкциями в последовательности задания печати не может превышать 15 секунд. Другими словами, предел времени ожидания сценария (15 секунд) применяется к следующим интервалам:

  • между вызовом PrintJob.start() и первым вызовом PrintJob.addPage() ;

  • между одним вызовом PrintJob.addPage() и следующим вызовом PrintJob.addPage() ;

  • между последним вызовом PrintJob.addPage() и вызовом PrintJob.send() .

Если любой из этих интервалов длится более 15 секунд, следующий вызов метода PrintJob.start() для экземпляра PrintJob возвращает значение false , а следующее обращение к методу PrintJob.addPage() для этого экземпляра PrintJob вызывает в проигрывателе Flash Player или AIR исключение при выполнении.