Добавление PDF-содержимого в приложения AIR

Adobe AIR 1.0 и более новых версий

Приложения для Adobe® AIR® могут выполнять визуализацию не только SWF- и HTML-, но и PDF-содержимого. Приложения AIR осуществляют визуализацию PDF с помощью класса HTMLLoader, механизма WebKit и подключаемого модуля Adobe® Reader® для обозревателей. В приложении AIR PDF-содержимое может либо растягиваться по всей длине и ширине, либо заполнять какую-то часть интерфейса. Внешний модуль Adobe Reader для браузера управляет отображением PDF-файлов в приложениях AIR. Изменения, внесенные в интерфейс панели инструментов Reader (например, элементы управления позицией, привязками и видимостью), сохраняются при последующем просмотре PDF-файлов и в приложениях AIR и в браузере.

Важная информация. Для визуализации PDF в среде AIR пользователю необходимо установить Adobe Reader или Adobe® Acrobat® версии 8.1 или более поздней.

Определение возможности отображения PDF

Если у пользователя не установлено ПО Adobe Reader или Adobe Acrobat 8.1 или более поздней версии, то PDF-содержимое не будет отображаться в приложении AIR. Чтобы определить, будет ли у пользователя отображаться PDF, прежде всего проверьте свойство HTMLLoader.pdfCapability. Его значением будет одно из следующих значений класса HTMLPDFCapability:

Константа

Описание

HTMLPDFCapability.STATUS_OK

Обнаружена подходящая версия (8.1 или более поздняя) Adobe Reader, PDF-содержимое может быть загружено в объект HTMLLoader.

HTMLPDFCapability.ERROR_INSTALLED_READER_NOT_FOUND

ПО Adobe Reader не обнаружено. Объект HTMLLoader не будет отображать PDF-содержимое.

HTMLPDFCapability.ERROR_INSTALLED_READER_TOO_OLD

ПО Adobe Reader обнаружено, но его версия устарела. Объект HTMLLoader не будет отображать PDF-содержимое.

HTMLPDFCapability.ERROR_PREFERRED_READER_TOO_OLD

Обнаружена подходящая версия (8.1 или более поздняя) Adobe Reader, но версия Adobe Reader, отвечающая за обработку PDF-содержимого, старше, чем 8.1. Объект HTMLLoader не будет отображать PDF-содержимое.

Если в системе Windows в данное время запущено ПО Adobe Acrobat или Adobe Reader версии 7.x или более новой, то будет использоваться именно эта версия, даже если установлена более поздняя, поддерживающая PDF. В этом случае, если значение свойства pdfCapability равно HTMLPDFCapability.STATUS_OK, то, когда приложение AIR попытается загрузить PDF, устаревшая версия Acrobat или Reader выведет предупреждение (в приложении AIR при этом не будет сгенерировано исключение). Если такая ситуация возможна, постарайтесь сообщить своим конечным пользователям, что необходимо закрыть Acrobat перед запуском приложения. Например, подобное сообщение можно вывести, если PDF-файл не загружается за разумное время.

AIR, установленная на ОС Linux, выполняет поиск Adobe Reader, используя путь (PATH), экспортированный пользователем (если он содержит команду acroread), а также в каталоге /opt/Adobe/Reader.

Следующий код определяет, может ли система пользователя отображать PDF-содержимое в приложении AIR. Если система пользователя не поддерживает отображение PDF, отслеживается код ошибки, соответствующий объекту ошибки HTMLPDFCapability.

if(HTMLLoader.pdfCapability == HTMLPDFCapability.STATUS_OK)  
{ 
    trace("PDF content can be displayed"); 
} 
else  
{ 
    trace("PDF cannot be displayed. Error code:", HTMLLoader.pdfCapability); 
} 

Загрузка PDF-содержимого

PDF можно добавлять в приложения AIR путем создания экземпляра HTMLLoader, задания его размеров и загрузки пути к PDF-файлу.

Ниже показано, как загрузить PDF с внешнего сайта. Замените URLRequest путем к доступному внешнему PDF-файлу.

var request:URLRequest = new URLRequest("http://www.example.com/test.pdf"); 
pdf = new HTMLLoader(); 
pdf.height = 800; 
pdf.width = 600; 
pdf.load(request); 
container.addChild(pdf);

Содержимое также может быть загружено через URL-адреса файлов и характерные для AIR схемы URL-адресов, например app и app-storage. Так, ниже показано, как загрузить файл test.pdf в подкаталог PDFs каталога приложения:

app:/js_api_reference.pdf

Дополнительную информацию о схемах URL-адресов см. в разделе Схемы URI.

Сценарии передачи PDF

С помощью JavaScript можно управлять PDF-содержимым точно так же, как это делается на веб-странице в обозревателе.

Расширения JavaScript для Acrobat, помимо прочего, предлагают следующие возможности:

  • управление навигацией и масштабированием страницы

  • обработка форм в документе

  • управление событиями мультимедиа

Подробную информацию о расширениях JavaScript для Adobe Acrobat см. в Центре разработки Adobe Acrobat по адресу http://www.adobe.com/devnet/acrobat/javascript.html.

Основы коммуникации между HTML и PDF

JavaScript на HTML-странице может отправлять сообщение JavaScript в PDF-документе, вызывая метод postMessage() объекта DOM, представляющего PDF. Например, рассмотрим следующий вложенный PDF-документ:

<object id="PDFObj" data="test.pdf" type="application/pdf" width="100%" height="100%"/>

Показанный ниже код JavaScript в HTML-содержимом отправляет сообщение коду JavaScript в PDF-файле:

pdfObject = document.getElementById("PDFObj"); 
pdfObject.postMessage(["testMsg", "hello"]);

Для получения этого сообщения PDF-файл может содержать JavaScript. В некоторых контекстах код JavaScript может добавляться к PDF-файлам, например на уровне документа, папки, страницы, поля и группы объектов. Здесь рассматривается только контекст уровня документа, который определяет проверяемые при открытии PDF-документа сценарии.

PDF-файл может добавлять объекту hostContainer свойство messageHandler. Свойство messageHandler — это объект, который определяет функции обработчиков, отвечающих на сообщения. Например, следующий код определяет функцию для обработки сообщений, получаемых PDF-файлом от домашнего контейнера (т. е. HTML-содержимого, в которое вложен PDF-файл):

this.hostContainer.messageHandler = {onMessage: myOnMessage}; 
 
function myOnMessage(aMessage) 
{ 
    if(aMessage[0] == "testMsg") 
    { 
        app.alert("Test message: " + aMessage[1]); 
    } 
    else 
    { 
        app.alert("Error"); 
    } 
}

Код JavaScript на HTML-странице может вызывать метод postMessage() объекта PDF, содержащегося на странице. Вызов этого метода отправляет сообщение ("Hello from HTML") коду JavaScript в PDF-файле на уровне документа:

<html> 
    <head> 
    <title>PDF Test</title> 
    <script> 
        function init() 
        { 
            pdfObject = document.getElementById("PDFObj"); 
            try { 
                 pdfObject.postMessage(["alert", "Hello from HTML"]); 
            } 
            catch (e) 
            { 
                alert( "Error: \n name = " + e.name + "\n message = " + e.message ); 
            } 
        } 
    </script> 
    </head> 
    <body onload='init()'> 
        <object 
            id="PDFObj" 
            data="test.pdf" 
            type="application/pdf" 
            width="100%" height="100%"/> 
    </body> 
</html>

Дополнительные примеры и сведения об использовании Acrobat 8 для добавления JavaScript в PDF-файл см. в разделе «Перекрестное выполнение сценариев PDF-содержимого в Adobe AIR».

Сценарии передачи PDF из ActionScript

Код ActionScript (в SWF-содержимом) не может напрямую обращаться к JavaScript в PDF-файле. Тем не менее ActionScript может обращаться к коду JavaScript на HTML-странице, загруженной в объект HTMLLoader, который загружает PDF, а этот код JavaScript — к коду JavaScript в загруженном PDF-файле. Дополнительную информацию см. в разделе Программирование HTML и JavaScript в AIR.

Известные ограничения PDF в AIR

С PDF-содержимым в Adobe AIR связаны некоторые ограничения:

  • PDF-содержимое не отображается в окне (объекте NativeWindow), если последнее прозрачно (т. е. свойство transparent равно true).

  • Порядок отображения PDF-файла работает иначе, чем для других экранных объектов в приложении AIR. Хотя усечение PDF-содержимого выполняется корректно, согласно порядку отображения HTML, это содержимое всегда будет стоять первым в порядке отображения приложения AIR.

  • Если изменяются определенные свойства визуализации объекта HTMLLoader, который содержит PDF-документ, этот PDF-документ становится невидимым. К числу этих свойств относятся: filters, alpha, rotation и scaling. Изменение этих свойств делает PDF-содержимое невидимым до тех пор, пока эти свойства не будут переустановлены. То же самое происходит и при изменении этих свойств для контейнеров экранных объектов, содержащих объект HTMLLoader.

  • PDF-содержимое видно только в том случае, если для свойства scaleMode объекта Stage объекта NativeWindow, в котором находится это PDF-содержимое, установлено значение StageScaleMode.NO_SCALE. Если установлено какое-либо другое значение, PDF-содержимое не видно.

  • При щелчке по ссылке на содержимое внутри PDF-файла положение прокрутки в PDF обновляется. При щелчке по ссылке на содержимое вне PDF-файла объект HTMLLoader, содержащий PDF, перенаправляется (даже если ссылка открывается в новом окне).

  • Комментарии PDF не поддерживаются в AIR.