在 AIR 中添加 PDF 内容

Adobe AIR 1.0 和更高版本

Adobe® AIR® 中运行的应用程序不仅可以呈现 SWF 和 HTML 内容,而且还能呈现 PDF 内容。AIR 应用程序使用 HTMLLoader 类、WebKit 引擎和 Adobe® Reader® 浏览器插件来呈现 PDF 内容。在 AIR 应用程序中,PDF 内容可以沿应用程序的全高和全宽进行拉伸,也可以作为界面的一部分。Adobe Reader 浏览器插件控制 AIR 应用程序中的 PDF 文件显示。对 Reader 工具栏界面(例如控件的位置、定位和可见性)的修改仍然存在于对 AIR 应用程序和浏览器中的 PDF 文件的后续查看中。

重要说明: 要在 AIR 中呈现 PDF 内容,用户必须安装 Adobe Reader 或 Adobe® Acrobat® 版本 8.1 或更高版本。

检测 PDF 功能

如果用户没有 Adobe Reader 或 Adobe Acrobat 8.1 或更高版本,则无法在 AIR 应用程序中显示 PDF 内容。若要检测用户是否能够呈现 PDF 内容,请首先检查 HTMLLoader.pdfCapability 属性。此属性设置为 HTMLPDFCapability 类的以下常量之一:

常量

说明

HTMLPDFCapability.STATUS_OK

已检测到足够高的 Adobe Reader 版本(8.1 或更高版本),可以将 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

检测到的 Adobe Reader 版本足够高(8.1 或更高版本),但为处理 PDF 内容所安装的 Adobe Reader 版本早于 Reader 8.1。HTMLLoader 对象无法显示 PDF 内容。

在 Windows 上,如果用户的系统上运行的是 Adobe Acrobat 或 Adobe Reader 版本 7.x 或更高版本,即使安装了支持加载 PDF 的最新版本,也会使用当前运行的版本。在这种情况下,如果 pdfCapability 属性的值是 HTMLPDFCapability.STATUS_OK,则当 AIR 应用程序尝试加载 PDF 内容时,较旧版本的 Acrobat 或 Reader 会显示警报(并且 AIR 应用程序中不会引发异常)。如果您的最终用户有可能遇到这种情况,则可以考虑向他们提供说明,告知他们在运行应用程序的同时关闭 Acrobat。如果 PDF 内容在可以接受的时间范围内未加载,则您可能希望显示这些说明。

在 Linux 中,AIR 在由用户导出的 PATH(如果其包含 acroread 命令)中和 /opt/Adobe/Reader 目录中查找 Adobe Reader。

以下代码检测用户能否在 AIR 应用程序中显示 PDF 内容。如果用户无法显示 PDF,代码会跟踪对应于 HTMLPDFCapability 错误对象的错误代码:

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

加载 PDF 内容

可以通过创建 HTMLLoader 实例、设置其尺寸以及加载 PDF 的路径,将 PDF 添加到 AIR 应用程序。

可以像在浏览器中那样,将 PDF 添加到 AIR 应用程序。例如,可以将 PDF 加载到窗口的顶级 HTML 内容、对象标签、frame 或 iframe 中。

以下示例从外部站点加载 PDF。将 iframe 的 src 属性值替换为可用外部 PDF 的路径。

<html> 
    <body> 
        <h1>PDF test</h1> 
        <iframe id="pdfFrame"  
            width="100%"  
            height="100%"  
            src="http://www.example.com/test.pdf"/> 
    </body> 
</html>

还可以从文件 URL 和特定于 AIR 的 URL 方案(例如 app 和 app-storage)加载内容。例如,以下代码可加载应用程序目录的 PDFs 子目录中的 test.pdf 文件:

app:/js_api_reference.pdf

有关 AIR URL 方案的详细信息,请参阅URI 方案

编写 PDF 内容的脚本

可以像在浏览器的网页中那样,使用 JavaScript 控制 PDF 内容。

针对 Acrobat 的 JavaScript 扩展提供了以下功能(当然还包括其他功能):

  • 控制页面导航和缩放

  • 处理文档中的表单

  • 控制多媒体事件

有关 Adobe Acrobat 的 JavaScript 扩展的详细信息,请访问 Adobe Acrobat 开发人员联盟:http://www.adobe.com/devnet/acrobat/javascript.html

HTML-PDF 通信基础知识

HTML 页中的 JavaScript 可以通过调用表示 PDF 内容的 DOM 对象的 postMessage() 方法来向 PDF 内容中的 JavaScript 发送消息。例如,请看以下嵌入的 PDF 内容:

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

包含 HTML 内容中的以下 JavaScript 代码向 PDF 文件中的 JavaScript 发送消息:

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

PDF 文件可以包含 JavaScript 以便接收此消息。在某些上下文(包括文档级、文件夹级、页级、字段级和批级上下文)中,可以向 PDF 文件添加 JavaScript 代码。此处仅讨论文档级上下文,这种上下文在打开 PDF 文档时会对计算出的脚本进行定义。

PDF 文件可以向 hostContainer 对象添加 messageHandler 属性。messageHandler 属性是用于定义处理函数以便响应消息的一种对象。例如,以下代码定义了一个函数,用于处理 PDF 文件从主机容器(嵌入 PDF 文件的 HTML 内容)接收到的消息:

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

HTML 页中的 JavaScript 代码可以调用页面中包含的 PDF 对象的 postMessage() 方法。通过调用此方法,可向 PDF 文件中的文档级 JavaScript 发送消息 ("Hello from HTML"):

<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 向 PDF 文件添加 JavaScript 的信息,请参阅在 Adobe AIR 中跨脚本访问 PDF 内容

对 AIR 中的 PDF 内容的已知限制

Adobe AIR 中的 PDF 内容具有以下限制:

  • 在透明窗口(NativeWindow 对象)中(transparent 属性设置为 true),不显示 PDF 内容。

  • PDF 文件的显示顺序与 AIR 应用程序中的其他显示对象不同。尽管根据 HTML 显示顺序对 PDF 内容进行了正确剪辑,但在 AIR 应用程序的显示顺序中,它通常位于内容的上方。

  • 如果更改包含 PDF 文档的 HTMLLoader 对象的某些视觉属性,则 PDF 文档将不可见。这些属性包括 filtersalpharotationscaling 属性。更改这些属性会使 PDF 内容不可见,直到重置这些属性为止。如果更改包含 HTMLLoader 对象的显示对象容器的这些属性,PDF 内容也会不可见。

  • 只有在将包含 PDF 内容的 NativeWindow 对象的舞台对象(window.nativeWindow.stage 属性)的 scaleMode 属性设置为 air.StageScaleMode.NO_SCALE 时,PDF 内容才可见。将该属性设置为任何其他值时,PDF 内容均不可见。

  • 单击指向 PDF 文件中内容的链接会更新 PDF 内容的滚动位置。单击指向 PDF 文件外部内容的链接会重定向包含 PDF 的 HTMLLoader 对象(即使链接的目标是新窗口)。

  • 在 AIR 中,PDF 注释工作流不起作用。