Cómo añadir contenido PDF en AIR

Adobe AIR 1.0 y posterior

Las aplicaciones que se ejecutan en Adobe® AIR® pueden representar no solo contenido SWF y HTML, sino además, contenido PDF. Las aplicaciones de AIR representan el contenido PDF utilizando la clase HTMLLoader, el motor WebKit y el plug-in Adobe® Reader®. En una aplicación de AIR, el contenido PDF puede ocupar toda la altura y anchura de la aplicación, o solo una parte de la interfaz. El plugin del navegador de Adobe Reader controla la visualización de archivos PDF en una aplicación de AIR. Las modificaciones de la interfaz de barra de herramientas de Reader (como las de posición, anclaje y visibilidad) se mantienen al visualizar posteriormente archivos PDF tanto en las aplicaciones de AIR como en el navegador.

Importante: para poder representar contenido PDF en AIR, el usuario debe tener instalado Adobe Reader o Adobe® Acrobat® versión 8.1 o posterior.

Detección de la capacidad de PDF

Si el usuario no tiene instalada la versión 8.1 o posterior de Adobe Reader o Adobe Acrobat, el contenido PDF no se visualiza en las aplicaciones de AIR. Para detectar si un usuario puede representar contenido PDF, compruebe primero la propiedad HTMLLoader.pdfCapability . Esta propiedad se define en una de las siguientes constantes de la clase HTMLPDFCapability:

Constante

Descripción

HTMLPDFCapability.STATUS_OK

Se detecta una versión suficiente (8.1 o posterior) de Adobe Reader y se puede cargar contenido PDF en un objeto HTMLLoader.

HTMLPDFCapability.ERROR_INSTALLED_READER_NOT_FOUND

No se detecta ninguna versión de Adobe Reader. Un objeto HTMLLoader no puede mostrar contenido PDF.

HTMLPDFCapability.ERROR_INSTALLED_READER_TOO_OLD

Se detecta una versión de Adobe Reader pero es demasiado antigua. Un objeto HTMLLoader no puede mostrar contenido PDF.

HTMLPDFCapability.ERROR_PREFERRED_READER_TOO_OLD

Se detecta una versión suficiente (8.1 o posterior) de Adobe Reader, pero la versión de Adobe Reader que está configurada para gestionar el contenido PDF es anterior a Reader 8.1. Un objeto HTMLControl no puede visualizar contenido PDF. Un objeto HTMLLoader no puede mostrar contenido PDF.

en Windows, si está funcionando Adobe Acrobat o Adobe Reader versión 7.x o posterior en el sistema del usuario, esa es la versión que se utiliza aunque se instale una versión posterior compatible con la carga de PDF cargado. En este caso, si el valor de la propiedad pdfCampability es HTMLPDFCapability.STATUS_OK , cuando una aplicación de AIR intenta cargar contenido PDF, la versión anterior de Acrobat o Reader presenta un aviso (y no se emite ninguna excepción en la aplicación de AIR). Si esta es una situación posible para los usuarios, considere facilitarles instrucciones para que cierren Acrobat mientras ejecutan la aplicación de AIR. Puede convenir que aparezcan estas instrucciones si el contenido PDF no se carga en un plazo de tiempo aceptable.

En Linux, AIR busca Adobe Reader en la RUTA exportada por el usuario (si contiene el comando acroread) y en el directorio /opt/Adobe/Reader.

El siguiente código detecta si un usuario puede visualizar contenido PDF en una aplicación de AIR. Si el usuario no puede visualizar PDF, se rastrea el código de error que corresponde al objeto de error HTMLPDFCapability:

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

Carga de contenido PDF

Se puede añadir contenido PDF a una aplicación de AIR creando una instancia de HTMLLoader, configurando sus dimensiones y cargando la ruta de un archivo PDF.

El siguiente ejemplo carga un archivo PDF desde un sitio externo. Sustituya el valor de URLRequest por la ruta a un archivo PDF externo disponible.

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);

También se puede cargar contenido desde las URL de archivos y esquemas de URL específicos para AIR, como app y app-storage. En el siguiente ejemplo el código carga el archivo test.pdf en el subdirectorio de PDF del directorio de la aplicación:

app:/js_api_reference.pdf

Para obtener más información sobre esquemas de URL de AIR, consulte Esquemas de URI .

Uso de scripts con el contenido PDF

Se puede utilizar JavaScript para controlar el contenido PDF del mismo modo que en una página web visualizada en el navegador.

Las extensiones de JavaScript para Acrobat ofrecen las siguientes funciones, entre otras:

  • Control de la ampliación y del desplazamiento por la página

  • Procesamiento de formularios dentro del documento

  • Control de eventos multimedia

Para obtener todos los detalles de la extensiones de JavaScript para Adobe Acrobat, consulte el Centro de desarrollo de Adobe Acrobat en http://www.adobe.com/devnet/acrobat/javascript.html (en inglés).

Aspectos básicos de la comunicación HTML-PDF

JavaScript en una página HTML puede enviar un mensaje a JavaScript en contenido PDF llamando al método postMessage() del objeto DOM que representa el contenido PDF. Por ejemplo, tomemos el siguiente contenido PDF incorporado:

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

El siguiente código JavaScript del contenido HTML envía un mensaje a JavaScript del archivo PDF:

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

El archivo PDF puede incluir JavaScript para recibir este mensaje. Se puede añadir código JavaScript a archivos PDF en algunos contextos, entre ellos los contextos a nivel de documento, carpeta, página, campo y lote. Aquí solo trataremos el contexto a nivel de documento, que define los scripts que se evalúan al abrirse el documento PDF.

Un archivo PDF puede añadir una propiedad messageHandler al objeto hostContainer . La propiedad messageHandler es un objeto que define las funciones del controlador para responder a los mensajes. En el siguiente ejemplo, el código define la función para gestionar mensajes que recibe del contenedor host (que es el contenido HTML que incorpora el archivo PDF) el archivo PDF:

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

El código JavaScript de una página HTML puede llamar al método postMessage() del objeto PDF contenido en la página. Al llamar a este método se envía un mensaje ( "Hello from HTML" ) a JavaScript a nivel de documento en el archivo 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>

Para ver un ejemplo más avanzado, así como información sobre el uso de Acrobat 8 para añadir JavaScript a un archivo PDF, consulte Creación de scripts entre contenidos PDF en Adobe AIR .

Uso de scripts con el contenido PDF en ActionScript

El código ActionScript (en contenido SWF) no puede comunicarse directamente con JavaScript en contenido PDF. Sin embargo, ActionScript puede comunicarse con el código JavaScript en la página HTML cargada en un objeto HTMLLoader que carga contenido PDF, y ese código JavaScript puede comunicarse con el JavaScript que está cargado en el archivo PDF. Para obtener más información, consulte Programación con HTML y JavaScript en AIR .

Limitaciones conocidas del contenido PDF en AIR

El contenido PDF en Adobe AIR tiene las limitaciones siguientes:

  • El contenido PDF no se visualiza en una ventana (un objeto NativeWindow) que es transparente (para la que la propiedad transparent está definida en true ).

  • El orden de visualización de un archivo PDF no funciona de la misma manera que para otros objetos de visualización en una aplicación de AIR. Si bien el contenido PDF se ajusta correctamente de acuerdo con el orden de visualización de HTML, siempre permanece encima del contenido en el orden de visualización de la aplicación de AIR.

  • Si se modifican determinadas propiedades visuales de un objeto HTMLLoader que contiene un documento PDF, el documento PDF será invisible. Entre estas propiedades se incluyen filters , alpha , rotation y scaling . El cambio de estas propiedades hace que el contenido PDF resulte invisible hasta que las propiedades se vuelvan a establecer. También es el caso si se modifican estas propiedades para un contenedor de objetos de visualización que contenga el objeto HTMLLoader.

  • El contenido PDF solo se puede ver si la propiedad scaleMode del objeto Stage del objeto NativeWindow que incluye el contenido PDF se establece en StageScaleMode.NO_SCALE . Cuando se define con otro valor, el contenido PDF no podrá verse.

  • Si se hace clic en un vínculo a contenido dentro del archivo PDF, se actualiza la posición de desplazamiento del contenido PDF. Si se hace clic en un vínculo a contenido situado fuera del archivo PDF, el objeto HTMLLoader se redirige al objeto que contiene el PDF (aunque el destino del vínculo sea una nueva ventana).

  • Los flujos de trabajo de comentarios de PDF no funcionan en AIR.