辅助功能*

Charles Ward

Jeff Swartz

高级技术文档撰写工程师
Adobe

出版日期:
2008 年 2 月 28 日
用户级别:
中/高级
产品:
Adobe AIR

在 Adobe AIR 应用程序中对 PDF 内容进行跨脚本编写

PDF Control 范例应用程序可加载 PDF 文件。请使用 HTML (而非嵌入式 PDF 渲染器) 提供的用户界面在文件中导航。缩放和导航按钮位于应用程序的顶部 (见图 1)。

PDF Control 范例应用程序演示 Adobe AIR 的以下 PDF 内容处理功能:

  • 向 AIR 应用程序添加 PDF 内容
  • 使用 Acrobat 8 向 PDF 文件添加 JavaScript
  • 使用 AIR 应用程序中的 ActionScript 与 PDF 文件中的文档级 JavaScript 进行通信

PDF Control 应用程序

图 1。通过本范例应用程序可以加载 PDF 文件。

注意: 本范例应用程序按原样提供, 用于教学目的。

要求

若要充分利用本篇文章, 您需要以下软件和文件:

Adobe AIR

Adobe AIR SDK

范例文件:

本范例应用程序包括以下文件:

  • index.html: 应用程序主文件。
  • application.xml: AIR 应用程序描述符文件
  • test.pdf: 应用程序加载的 PDF 示例文件
  • sample.css: 定义应用程序中所用样式的 css 文件
  • AIR 图标文件范例

必备知识

应具备构建 HTML 应用程序的一般经验。有关使用此快速入门指南的详细信息, 请参阅用 HTML 构建快速入门范例应用程序

了解代码

对于源文件中的全部 HTML 和 JavaScript 代码, 本文将不一一介绍。此处仅介绍如何从 HTML 页中的 JavaScript 与 PDF 页中的 JavaScript 进行通信。

PDF 文件中用于处理消息的 JavaScript 函数

在 PDF 文件的文档级 JavaScript 中, 可以将函数赋给 hostContainer 对象的 msgHandler 属性的 onMessageonErroronDisclose 属性。这些函数定义 PDF 文件如何处理从宿主容器向其发送的消息。

范例文件随附的 test.pdf 文件包含以下文档级 JavaScript:

function myOnMessage(aMessage)
{
    if (aMessage.length==1) {
        switch(aMessage[0]) 
        {
            case "ZoomIn":
                zoom *= 2;
                break;    
            case "ZoomOut": 
                zoom /= 2; 
                break;
            case "PageUp": 
                pageNum--; 
                break;
            case "PageDn": 
                pageNum++; 
                break;
            default: 
                app.alert("Unknown message: " + aMessage[0]);    
        }
    }
    else
    {
        app.alert("Message from hostContainer: \n" + aMessage);
    }
}
function myOnDisclose(cURL,cDocumentURL)
{
    return true;
}
function myOnError(error, aMessage)
{
    app.alert(error);
}
var msgHandlerObject = new Object();
msgHandlerObject.onMessage = myOnMessage;
msgHandlerObject.onError = myOnError;
msgHandlerObject.onDisclose = myOnDisclose;
this.hostContainer.messageHandler = msgHandlerObject;

这段代码定义用于处理传入消息的函数。这些函数被设置为 msgHandlerObject 对象的 onMessageonErroronDisclose 属性。这段代码将 msgHandlerObject 对象赋给 hostContainer 对象的 msgHandler 属性。myOnDisclose() 函数检查传入消息数组中的第一个字符串, 并采取适当的措施。例如, 如果字符串是 "ZoomIn", 则这段代码设置一个 PDF JavaScript 属性 (zoom *= 2), 用于放大页面。

本范例应用程序显示基本的页面导航和缩放系数。Adobe Acrobat 开发人员中心*中提供有关用于 Adobe Acrobat 的其它 JavaScript 扩展的全部详细信息。

向 PDF 文件添加文档级 JavaScript

请按照以下步骤操作:

  1. 创建名为 test.pdf 的 PDF 文档, 并将其保存至应用程序的项目目录。
  2. 在 Acrobat 8 中打开该 PDF 文档。
  3. 在“高级”菜单上选择“文档处理”>“文档级 JavaScript”。
  4. 在“JavaScript 函数”对话框中键入 myOnMessage 作为“脚本名称”, 然后单击“添加”按钮。
  5. 在“JavaScript 编辑器”窗口中将文本编辑为以下内容, 然后单击“确定”按钮。

    function myOnMessage(aMessage)
    {
        if (aMessage.length==1) {
    		    switch(aMessage[0]) 
    		    {
    		    case "ZoomIn": 
    		        zoom *= 2; 
    		        break;
    		    case "ZoomOut": 
    		        zoom /= 2; 
    		        break;
    		    case "PageUp": 
    		        pageNum--; 
    		        break;
    		    case "PageDn": 
    		        pageNum++; 
    		        break;
    		    default: 
    		        app.alert("Unknown message: " + aMessage[0]);
    		    }
    		}
    		else
    		{
    		    app.alert("Message from hostContainer: \n" + aMessage);
    		}
    }
    function myOnDisclose(cURL,cDocumentURL)
    {
        return true;
    }
    function myOnError(error, aMessage)
    {
        app.alert(error);
    }
    var msgHandlerObject = new Object();
    msgHandlerObject.onMessage = myOnMessage;
    msgHandlerObject.onError = myOnError;
    msgHandlerObject.onDisclose = myOnDisclose;
    this.hostContainer.messageHandler = msgHandlerObject;

    注意: 有关此段代码的描述, 请参阅上一节“PDF 文件中用于处理消息的 JavaScript 函数”。

  6. 关闭“JavaScript 函数”对话框。
  7. 选择“文件”>“属性”命令。
  8. 在“文档属性”对话框中选择以下选项:
    • “导览标签”—“仅页面”
    • “页面布局”—“单页”
    • “放大率”—“默认”
    • “打开到页面”— 1
    • “隐藏菜单栏”— 选中
    • “隐藏工具栏”— 选中
    • “隐藏窗口控件”— 选中
  9. 将该 PDF 文档保存至项目目录, 并将其命名为 test.pdf。

将 PDF 内容加载至 AIR 应用程序中

index.html 页使用 object 标签加载 PDF 内容:

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

与 PDF 文件通信

范例应用程序的 HTML 代码定义了四个 Button 组件:

<table>
  <tr>
  <td>
		    Zoom:
    <input type="button" value="+" onclick="sendMessage('ZoomIn')"/>
    <input type="button" value="-" onclick="sendMessage('ZoomOut')"/>
  </td>
  <td>
		    Navigate:
    <input type="button" value="<" onclick="sendMessage('PageUp')"/>
    <input type="button" value=">" onclick="sendMessage('PageDn')"/>
  </td>
  </tr>
  </table>

用户单击任意一个 Button 组件时, click 事件处理函数都将调用 sendMessage() 方法。例如, 单击第一个按钮将执行以下代码:

sendMessage('ZoomIn')

sendMessage() 方法调用页面中所嵌 PDF 对象的 postMessage() 方法。postMessage() 方法采用消息字符串的数组作为参数:

function sendMessage(message)
{
    try 
    {
        document.getElementById("PDFObj").postMessage([message]);
    } 
    catch (error)
    {
        alert( "Error: " + error.name + "\nError message: " + error.message);
    }
}

PDF 文件中的文档级 JavaScript 定义了一个 hostContainer.messageHandler 对象。此对象确定如何处理传入的消息。 (有关详细信息, 请参阅上面的“PDF 文件中用于处理消息的 JavaScript 函数”一节。) 在本应用程序中可以对 PDF 内容进行导航或放大。

关于作者

Jeff Swartz 于 1992 年开始他在 Macromedia (现在为 Adobe Systems)的职业生涯。目前, 他是一名 Adobe AIR 技术文档撰写工程师。Jeff 拥有伊利诺斯大学乌尔班纳-香巴尼分校的计算机科学与数学专业学士学位, 并曾就读于爱丁堡大学人工智能系。旧金山湾地区附近的听众都曾“领略”过 Jeff 在长号演奏方面的艺术风采。他还曾是 Vienna Beef Ltd. 的 Big Frank (舞蹈高手)。