在 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(HTMLLoader.pdfCapability == HTMLPDFCapability.STATUS_OK)  
{ 
    trace("PDF content can be displayed"); 
} 
else  
{ 
    trace("PDF cannot be displayed. Error code:", HTMLLoader.pdfCapability); 
} 

加载 PDF 内容

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

以下示例从外部站点加载 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)加载内容。例如,以下代码可加载应用程序目录的 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 内容

通过 ActionScript 编写 PDF 内容的脚本

ActionScript 代码(在 SWF 内容中)不能与 PDF 内容中的 JavaScript 直接通信。但是,ActionScript 可与加载 PDF 内容的 HTMLLoader 对象所加载的 HTML 页中的 JavaScript 通信,并且该 JavaScript 代码可与加载的 PDF 文件中的 JavaScript 通信。有关详细信息,请参阅 在 AIR 中进行 HTML 和 JavaScript 编程

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

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

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

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

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

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

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

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