« Графики и диаграммы на веб-страницах. Часть 4 | Мультимедиа-программирование вместе с Red 5 server. Часть 1 » |
AlivePDF. Создание pdf-документов из flash
И Flash и PDF - давно известные всем технологии с четко очерченным набором возможностей и сферой применения. Может показаться, что эти сферы настолько различны, что ничего общего у flash и pdf быть не может. Однако это не так. И как всегда случается на стыке двух технологий, “смесь” pdf и flash не только возможна, но и очень интересна.Чтобы сразу закрыть вопрос о дальнейшем содержимом статьи, я хочу сказать, о чем я не собираюсь рассказывать. Во-первых, я не будут рассказывать о методиках внедрения внутрь pdf-документов flash-роликов. Это возможно, и при использовании соответствующего программного обеспечения (adobe acrobat, но только не reader) сводится к нажатию всего одной кнопки “Добавить внутрь pdf-странички flash ролик”. Более того, если вы рассматриваете задачу генерации pdf-документов на лету, т.е. в виде какого-то серверного или desktop-приложения, то это также возможно и автор имел опыт работы с java и itext. Также я не буду рассказывать о том, как можно конвертировать pdf-файлы в swf-файлы и обратно. Опять таки все сводится к наличию большого количества бесплатных и платных инструментов. Здесь я могут только порекомендовать познакомиться с swftools (домашний сайт проекта http://www.swftools.org/). Swftools – это набор бесплатных утилит для различных операционных систем, которые позволяют преобразовывать pdf-файлы и картинки (png, jpg, gif) в swf-ролики. В том случае, если вам захочется выполнить преобразование в swf произвольного документа (например, файла msword), то рекомендую обратиться к adobe flashpaper (http://www.adobe.com/products/flashpaper/). Так после установки flashpaper у вас на компьютере появится новый виртуальный принтер, на который можно распечатать любой документ. После завершения “печати” откроется диалоговое окно flashpaper и предложит вам сохранить сформированный файл либо как pdf-документ, либо как swf-ролик. Во втором случае, приятно, что вы получаете в свое распоряжение не “голый” flash-ролик, но небольшое интерактивное приложение с кнопками навигации по swf-документу, функцией масштабирования изображения и т.д. В том случае, если вы хотите сделать pdf или любой другой документ доступным для просмотра любым пользователем internet, то я рекомендую попробовать такой online сервис как http://www.scribd.com/. После регистрации вам будет предоставлена форма загрузки на сервер файлов (поддерживается pdf, файлы ms office и open office). После чего загруженный вами файл становится доступным для просмотра любому пользователю (если вы только не пометили файл как “частный”). Ваш документ в форме swf-ролика может быть просмотрен любым пользователем, даже если у него нет на компьютере pdf reader или ms office. Также как и в случае с flashpaper будут доступны кнопки навигации по документу, функция “поделиться файлом с друзьями” и т.д. Одним словом, scripd – замечательный сервис для хранения документов. Еще одна из интересных задач связанных с конвертирование документов в flash-формат – это создание презентаций. Конечно, сам flash и был предназначен изначально для создания красочных, интерактивных демонстраций, анимационных роликов. Но работа эта требует определенной квалификации и гораздо лучше, если подготовка презентации будет выполнена в ms powerpoint, с последующим преобразованием файла презентации в flash-ролик, который можно внедрить на html-страничку. Подобный сценарий может быть выполнен с помощью упоминавшегося ранее онлайн-сервиса http://www.scribd.com/, либо “настольного” приложения http://www.ispring.ru/. Итак все же, о какой сфере интеграции flash и pdf я хочу рассказать, если это не задачи конвертирования форматов или внедрения в pdf-файлы flash-роликов? Тема сегодняшней статьи это то, как flash-ролик может создать “с нуля” (сгенерировать) pdf-файл с помощью библиотеки AlivePDF. Но сначала пару слов, зачем все это нужно.
Всякий раз, когда возникает разговор о необходимости подготовки документов для печати с использованием сложного макетирования и форматирования материалов, на первые роли выходит pdf. И не важно то, на каком устройстве (desktop или мобильные компьютеры) или на какой операционной системе вы откроете подготовленный файл pdf. Вы всегда можете быть уверены в том, что он будет выглядеть именно так, как планировал автор. Что касается flash, то здесь большинство “молодых” интернет пользователей считает, что сфера flash – это все возможные баннеры и анимация. В действительности flash следует рассматривать шире и, прежде всего, как платформу, в рамках которой могут выполняться приложения. Эта платформа (flash player) легко внедряется как в веб-странички, так и доступна для запуска desktop-приложений. Фактически, если у вас есть какая-то хорошая идея по разработке и продвижению приложения, то вы можете “доставить” конечный продукт наибольшему количеству пользователей, во-первых, в форме online-сервиса. Т.е. пользователь подключается к internet, открывает в браузере ваш сайт и работает либо с flash-приложением, либо с javascript-приложением. Однако не все приложения имеют смысл делать как online. И причина в этом не только в затратах на подключение к internet, но, прежде всего, в том, что веб-приложения по своей природе ограничены в доступе к средствам операционной системы. Нет доступа к панели задач, system tray, нет прямого доступа к файловой системе и т.д. Именно по этой причине появился такой продукт как adobe air. Важным моментом является, то что написанные “под” air desktop проекты могут быть с небольшими затратами перенесены внутрь веб-страниц и обратно. Таким образом, разработка приложений на flash/flex/air очень выгодна возможностью одновременной разработки как online-версии приложения, так и ее более “продвинутой” настольной версии, активно использующей все плюсы интеграции с операционной системой. Совсем недавно мне пришлось разрабатывать “толстый” клиент для корпоративного приложения. Что делало это приложение не столь важно – главное то, что результатом его работы были, в том числе, и все возможные отчеты: отчеты о финансах, о товарах, о затраченных ресурсах и т.д. Когда возник вопрос о том, в каком формате подготавливать документы отчетов перед печатью или рассылкой их по почте, то не было никаких сомнений, что это должен быть pdf. Даже такие “дизайнерские” приложения как онлайн-галлерея изображений или конструктор интерьеров помещений, нуждается в возможности экспорта результатов работы в pdf-файл для последующей печати или отправке по email.
Технически, есть огромное количество библиотек позволяющих генерировать “на лету” pdf-документы; и доступны эти библиотеки для различных языков: java, .net, php. Например, разрабатывая даже flash-интерфейс для online-приложения, вы можете делегировать ответственность по созданию pdf-файла с отчетом к серверному скрипту на php или java. Но если вспомнить, что изначально я поставил цель создания двух версий приложения, т.е. online и настольной версии, работающей без подключения к internet и максимально общего у них кода. То нам потребуется такой инструмент, который позволит создавать pdf-документы без помощи расположенных на сервер утилит – т.е. библиотека создания pdf-файла должна быть написана на actionscript и выполняться внутри flashplayer. Именно об этом я и хочу рассказать на примере работы с библиотекой AlivePDF.
Начнем с того, что загрузим с сайта http://www.alivepdf.org/ архив с библиотекой. После того как мы распакуем архив, то получим в свое распоряжение не только скомпилированный файл библиотеки AlivePDF.swc, но и каталог с исходными кодами. Также у нас в распоряжении будет каталог с документацией по всем классам библиотеки и, что самое приятное, два небольших примера для adobe flash cs3 и для adobe air. Никаких отличий между этими двумя примерами нет, за исключением нюанса связанного с сохранением сгенерированного pdf-документа. Дело в том, что air-приложения имеют прямой доступ к файловой системе компьютера и могут сохранить pdf-файл хоть на ваш рабочий стол. А вот “обычные” flash-ролики в доступе к файловой системе ограничены. Поэтому для онлайн-приложений приходится использовать трюк, когда сгенерированный pdf-файл отправляется на веб-сервер лишь только за тем, чтобы браузер клиента мог получить ссылку на этот pdf-файл и загрузить его обратно на компьютер клиента. Подробнее о методике сохранения pdf-файла будет написано ближе к концу статьи.
Весь последующий код я специально писал в среде adobe flash cs3, как более знакомой для массового пользователя. Но вы, конечно, можете пользоваться любой средой разработки, хоть flashdevelop, хоть adobe flex builder или intellij idea (начиная с восьмой версии idea поддерживает разработку flex и air-приложений). Для Adobe Flash CS3 заходим в меню “Edit -> Preferences -> закладка ActionScript -> кнопка ActionScript 3 Settings”. В появившемся диалоговом окне выбираем путь к каталогу, где находятся исходники AlivePDF (в исходном архиве это Core/SWC – Sources). После чего вы создаете новый проект с типом ActionScript3 и импортируете основные пакеты библиотеки alivepdf:
import org.alivepdf.display.*;
import org.alivepdf.fonts.*;
import org.alivepdf.images.*;
import org.alivepdf.layout.*;
import org.alivepdf.pages.*;
import org.alivepdf.pdf.*;
import org.alivepdf.saving.*;
var myPDF:PDF = new PDF(Orientation.PORTRAIT, Unit.MM, Size.A4)
myPDF.setTitle("My Simple PDF document");
myPDF.setAuthor("black zorro");
myPDF.setSubject("pdf investigation")
myPDF.setKeywords("Perspectives, High technologies");
myPDF.setMargins(50, 10, 50, 10);
// масштабируем по ширине страницы и размещаем содержимое в две колонки с первой страницей справа
myPDF.setDisplayMode(Display.FULL_WIDTH, Layout.TWO_COLUMN_RIGHT);
// видим на экране выделенную область первой страницы
myPDF.setDisplayMode(Display.RECTANGLE, Layout. SINGLE_PAGE, PageMode.USE_OUTLINES, 1, new Rectangle(0,0, 100, 100));
// масштаб в 200%
myPDF.setDisplayMode(Display.REAL, Layout.TWO_PAGE_LEFT, PageMode.USE_OUTLINES, 2);
var firstPage:Page = new Page(Orientation.PORTRAIT, Unit.MM, Size.A4);
myPDF.addPage(firstPage);
myPDF.setFont(FontFamily.HELVETICA, Style.BOLD_ITALIC, 18);
myPDF.textStyle ( new RGBColor ( 0xff0000 ) );
myPDF.writeText(50, "Click here to visit my site 1", "http://site.site");
myPDF.addMultiCell(100, 10, "Некоторый очень длинный текст", 1, "R");
myPDF.setXY(10, 10);
myPDF.writeText(10, "Absolutely Positioned Text");
Сначала я вызвал метод lineStyle, который настраивает характеристики всех рисуемых в дальнейшем линий (цвет и толщина линий). Затем я включаю режим заливки фона рисуемых фигур методом beginFill (цвет фона). В арсенале AlivePdf есть как “высокоуровневые” функции, рисующие сразу всю фигуру целиком (в примере круг), так и рисующие фигуру из отдельных линий. Во втором случае я последовательно задаю координаты всех вершин полигона и завершаю рисование (функция end).
myPDF.lineStyle(new RGBColor(0x0000ff ), 2);
myPDF.beginFill(new RGBColor(0xff0000));
// рисуем круг
myPDF.drawCircle(100, 100, 50)
// рисуем прямоугольник
myPDF.moveTo ( 50, 50 );
myPDF.lineTo ( 100, 50 );
myPDF.lineTo ( 100, 100 );
myPDF.lineTo ( 50, 100 );
myPDF.end()
myPDF.endFill();
myPDF.drawPolygone ([100, 100, 120, 100, 120, 120]);
[Embed( source="/assets/foxmoving.jpg", mimeType="application/octet-stream" )]
private var foxImage:Class;
myPDF.addPage();
myPDF.addImageStream(new foxImage() as ByteArray,100, 100, 500, 500);
К примеру, flash-приложение, представляющее собой конструктор дизайна интерьера, может скопировать нарисованный на себе же проект квартиры в pdf-файл:
myPDF.addImage(this, 0, 0, 0, 0, ImageFormat.PNG);
Последнее действие, которое будет выполнено после завершения подготовки pdf-файла – так это его сохранение. Во-первых, файл можно отправить для сохранения на сервер:
myPDF.save(Method.REMOTE, "http://my-site.com/script.php", "inline", "AlivePdfDemo.pdf");
В случае, если вы создаете air приложение, имеющее прямой доступ к файловой системе, то можно сохранить pdf-документ сразу на жесткий диск, например, так:
var f:FileStream = new FileStream();
var file: File = File.desktopDirectory.resolvePath("AliveDemo.pdf");
f.open(file, FileMode.WRITE);
var bytes:ByteArray = myPDF.save(Method.LOCAL);
f.writeBytes(bytes);
f.close();
« Графики и диаграммы на веб-страницах. Часть 4 | Мультимедиа-программирование вместе с Red 5 server. Часть 1 » |