Взаимодействие с принтером

Весьма полезной, хотя и редко используемой на практике, возможностью Flash-плейера является распечатка содержимого SWF-фильма на принтере. Обычно она применяется, если нужно перенести на бумагу чек за покупку в сетевом магазине, карту, на которой показан путь к офису, бланк или анкету. Профессиональные аниматоры и дизайнеры иногда используют возможности печати, чтобы можно было включить утвержденный заказчиком дизайн сайта или вид героев в договор (иначе в самый последний момент заказчик может отказаться от проекта, сославшись на то, что он был реализован совсем не так, как ему хотелось).

Имеется несколько вариантов того, как может быть распечатан SWF-фильм или какой-то его
фрагмент.

• Команда Print меню File браузера. Наименее техничный вариант, При этом, во-первых, фильм будет распечатан как часть HTML-страницы. Во-вторых, многие браузеры не способны выводить на бумагу SWF-фильм (на его месте будет просто серый квадрат). В-третьих, браузер распечатает именно то, что отображается в данный момент. Вывести на бумагу таким способом только чек или анкету не представляется возможным.

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

Довольно техничным ходом является блокирование команды Print контекстного меню (дабы не вводить пользователя в искушение ее задействовать).


Для этого на кадр основной временной диаграммы следует поместить метку !#Р. Эту команду можно просто удалить из меню, используя возможности класса ContextMenu.

• Можно применить функции печати ActionScript (если фильм проигрывается в старом плейере) или появившийся во Flash 7 класс PrintJob. Оптимальный вариант с точки зрения степени контроля за тем, что будет выведено на бумагу. Так, при этом вы можете распечатать лишь нужные области фильма или кадры вложенных клипов, графика может быть распечатана и как векторная, и как растровая.

В этом параграфе мы рассмотрим элементы ActionScript, служащие для распечатки фильма или отдельных его фрагментов на принтере. Вначале поговорим о функциях печати, которые использовались для контроля вывода на бумагу до Flash MX 2004. Затем мы обсудим класс PrintJob, который является оптимальным инструментом печати начиная со Flash 7.

Функции печати
Во Flash 4 появились четыре функции печати: print(), printAsBitmap(), printNum(), printAsBitmap-Num(). Они имеют схожий синтаксис и принципы использования, а различаются по двум позициям.

• Функции print() и printAsBitmap() могут распечатать кадры любого клипа.


Функции printNum() и printAsBitmapNum() предназначены для распечатки кадров основных временных диаграмм проигрываемых в плейере фильмов.

• Функции print() и printNurnO распечатывают графику как векторную. С одной стороны, это означает, что все, нарисованное непосредственно во Flash кривыми Безье, будет распечатано очень качественно. С другой стороны, данные функции не поддерживают прозрачность, а также цветовые смещения экземпляров, задаваемые при помощи меню Color Инспектора Свойств или с использованием класса Color. Растровые изображения при распечатке print() или printNum() будут довольно размытыми.

Функции printAsBitmap() и printAsBitmapNum() распечатывают графику как растровую. При этом несколько снижается качество вывода на бумагу векторной графики. Зато нет проблем с прозрачностью, цветовыми смешениями и растровыми изображениями, присущих функциям print{) и printNum().

Какую функцию предпочесть, вы должны определить исходя из особенностей решаемой задачи. Наиболее универсальная функция — printAsBitmap().

Все функции печати имеют следующий синтаксис:

printFunction(target, bounding_box); где:

• target — ссылка на временную диаграмму, кадры которой должны быть распечатаны.


В случае функций print() и printAsBitmap() она адресуется при помощи имени соответствующего клипа, в случае printNum() и printAsBitmapNum() — номером уровня, на котором располагается фильм. По умолчанию на бумагу выводятся все кадры, причем каждый кадр помещается на индивидуальный лист. Если нужно распечатать лишь отдельные кадры, то следует поместить на них метку #р. Если плейер обнаружит наличие таких меток, он распечатает лишь отмеченные ими кадры;

• bounding_box — параметр, определяющий, какая область кадров будет выведена на печать.

Задать эту область можно следующими способами:

o выделив на временной диаграмме кадр, размещенные на котором элементы занимают область печати (bounding_box="bmovie"). Ее границы будут заданы исходя из описанного вокруг этих элементов прямоугольника. Чтобы выделить такой кадр, на него нужно поместить метку #b. Распечатываться этот кадр не будет.

Режим печати «bmovie» принят по умолчанию. Если он активен, но ни одного кадра с меткой #b на временной диаграмме нет, то распечатка проводится исходя из стандартных размеров фильма. При печати изображения масштабируются так, чтобы занять максимальную площадь листа (однако искажение при этом не происходит);

o можно найти кадр, графика на котором занимает наибольшую площадь, и исходя из нее задать границы распечатываемой области (boundirig_box="bmax").


Этот режим гарантирует, что не обрежется часть графики;

o каждый кадр можно распечатывать так, чтобы его содержимое было выведено на печать полностью, заняв максимальное пространство листа (bounding_box="bframe"). В этом режиме коэффициент масштабирования графики разных кадров может быть различным.

Помимо функций печати, Flash-плейер поддерживает псевдопротокол print, который может быть использован в ссылках или параметре функции getURL(). По своим особенностям он практически полностью аналогичен функции print():

getURL("print:#bmovie", "_root");

Чтобы функции печати выполнили свою задачу, все элементы временной диаграммы должны быть загружены.

Функции печати выводят на бумагу кадры клипа, даже если его отображение отключено при помощи свойства _visible. Это дает возможность скрывать распечатываемые элементы (например, совсем необязательно отображать в фильме бланк заказа).

Flash-плейер умеет работать как с PostScript-принтерами (PostScript — язык, разработанный компанией Adobe и предназначенный для описания векторной графики), такие принтерами, не поддерживающими этот язык. Однако если принтер не знает PostScript, то разница между функциями print() и printAsBitmap() стирается, так как в любом случае перед печатью векторная графика преобразуется в растровый формат.

Класс PrintJob
Данный класс появился во Flash MX 2004.


Он предоставляет все те же возможности, что и рассмотренные ранее функции печати, плюс несколько новых настроек. Так, класс Print Job более приспособлен для работы с динамическим содержимым, позволяет также распечатывать графику без изменения ее размеров (функции печати масштабируют распечатываемые изображения под размер листа). При его использовании все настройки выводятся в одном диалоговом окне. Свойства класса PrintJob дают возможность определять такие характеристики печати, как размер и ориентацию листа.

Начиная со Flash 7 использовать функции печати не рекомендуется ввиду наличия более мощного инструмента — класса PrintJob. Применять их стоит лишь в том случае, если вы хотите учесть пользователей, у которых установлена более старая версия плейера. Начать распечатку при помощи класса PrintJob нужно с создания его объекта:

var printing:PrintJob=new PrintJob();

Затем нужно отправить запрос на печать операционной системе. Для этого служит метод start():

printing.start();

В результате вызова метода start() появится диалоговое окно, в котором пользователь сможет подтвердить начало печати, а также задать основные настройки. Если пользователь нажмет ОК, то метод start() возвратит true. Также при этом будут определены свойства класса PrintJob: paperHeight и paperWidth (ширина и высота листа бумаги), pageHeight и pageWidth (ширина и высота области листа, в которой реально производится печать, т. е. они позволяют учесть поля), orientation (ориентация листа бумаги: «portrait» — книжная, «landscape» — альбомная). Данные свойства доступны только для чтения, однако порой они могут быть полезны, если распечатываемый элемент должен быть динамически настроен под текущие установки принтера. Если пользователь нажмет кнопку Cancel, то метод start() возвратит false.

Если пользователь подтвердит начало печати, то следует указать, какой фрагмент какого кадра какой временной диаграммы следует распечатать. Для этого предназначен метод addPage(). Его синтаксис:

рrintJob_obj.addPage(target, area, options, frameNumber); где:

• target — ссылка на временную диаграмму, кадр которой следует распечатать. Уровни плейера адресуются целыми числами, имена клипов нужно передавать в строковом формате;

• ares —необязательный параметр, служащий для задания области кадра, которая должна быть распечатана. Ее граничные координаты (определенные относительно собственной системы координат временной диаграммы) должны быть присвоены свойствам xMin, xMax, yMin, yMax передаваемого в качестве данного параметра объекта. Если аргумент area не будет задан, то кадр будет распечатан полностью, исходя из стандартных размеров фильма;

• options — необязательный параметр, принимающий в качестве значения объект с единственным свойством printAsBitmap. Если присвоить этому свойству true, то графика будет распечатана как растровая, если false, то PostScript-принтеры выведут графику на бумагу как векторную. По умолчанию графика распечатывается как векторная;

• frameNumber — номер кадра, который должен быть распечатан. Одной командой addPage() можно вывести на печать только один кадр. Чтобы распечатать N кадров, N раз должен быть вызван метод addPage().

Если информация о подлежащей распечатке странице благополучно поместилась в буфер принтера, то метод addPage() возвратит true. Если же была допущена ошибка (например, вызову addPage() не предшествовала активизация метода start()), то возвращено будет false.

Изображение с кадра переносится на лист без масштабирования с сохранением присущих ему в фильме пропорций. Выравнивается оно по левому верхнему углу листа (с учетом полей). Если вы хотите, чтобы изображение заняло весь лист, то соответствующую временную шкалу следует отмасштабировать, основываясь на свойствах pageWidth и pageHeignt (после отправки задания принтеру ее можно вернуть к исходным размерам, в итоге никаких видимых изменений не произойдет).

Масштабирование в сторону уменьшения стоит проводить, если размер подлежащей печати области кадра превышает размер листа бумаги (иначе часть изображения обрежется).

После того как в буфер принтера будут отправлены все необходимые страницы, можно начинать непосредственно распечатку. Для этого следует вызвать метод send().

Например:
var printing:PrintJob=new PrintJob();
if (printing.start()) {
// Масштабируем фильм под размер бумаги
_root._xscale=_root._yscale=printing.pageWidth/Stage.width;
// Распечатываем два первых кадра _root
printing.addPage(0, {xMin:0, yMin:0, xМах:Stage.width, yMax:Stage.height),
null, 0);
printing.addPage(0, {xMin:0, yMin:0, xMax:Stags.width, yMax:Stage.height},
null, 1);
printing.send(); // Отправляем команду начала печати
// Возвращаем фильм к обычному масштабу
_root._xscale=_root._yscale=1;
}

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Взаимодействие со средой разработки
Взаимодействие со средствами чтения с экрана
Объект CustomActions
Определение размеров фильма и величины окна плейера
Получение информации об использующемся аппаратном и программном обеспечении