在 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。請以可用之外部 PDF 的路徑取代 URLRequest。

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 內容,就像在瀏覽器的網頁中控制 PDF 內容一樣。

適用於 Acrobat 的 JavaScript 擴充功能可以提供許多功能,包括:

  • 控制網頁瀏覽和顯示比例

  • 處理文件中的表單

  • 控制多媒體事件

如需有關適用於 Adobe Acrobat 之 JavaScript 擴充功能的詳細資訊,請造訪 Adobe Acrobat Developer Connection,網址為: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 以便接收這個訊息。在某些內容 (其中包括文件、資料夾、網頁、欄位和批次層級) 中,您可以將 JavaScript 程式碼加入至 PDF 檔。在此僅會針對文件層級內容來討論,這個層級的內容會定義當開啟 PDF 文件時,所評估的預設指令碼。

PDF 檔可以將 messageHandler 屬性加入至 hostContainer 物件。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() 方法。呼叫這個方法時,便會將訊息 ("Hello from HTML") 傳送給 PDF 檔中的文件層級 JavaScript。

<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 進行通訊。不過,對於載入 PDF 內容之 HTMLLoader 物件中載入的 HTML 網頁,ActionScript 可以與網頁中的 JavaScript 進行通訊,而且該 JavaScript 程式碼可以與所載入 PDF 檔中的 JavaScript 進行通訊。如需詳細資訊,請參閱:在 AIR 中撰寫 HTML 和 JavaScript 程式

AIR 中 PDF 內容的已知限制

Adobe AIR 中的 PDF 內容具有下列限制:

  • PDF 不會在透明 (transparent 屬性設定為 true) 的視窗 (NativeWindow 物件) 中顯示。

  • PDF 檔的顯示順序在運作時,與 AIR 應用程式中的其它顯示物件不同。雖然 PDF 內容會根據 HTML 顯示順序正確進行修剪,不過一律都在 AIR 應用程式的顯示順序中的內容上方。

  • 對於含有 PDF 文件的 HTMLLoader 物件,物件中的某些視覺屬性如果發生變更,該 PDF 文件就會變為隱藏。這些屬性包括 filtersalpharotationscaling 屬性。變更這些屬性會隱藏 PDF 內容,直到屬性重設為止。如果您變更包含 HTMLLoader 物件之顯示物件容器的上述屬性,也會隱藏 PDF 內容。

  • 對於含有 PDF 內容的 NativeWindow 物件,只有將其 Stage 物件的 scaleMode 屬性設為 StageScaleMode.NO_SCALE,PDF 內容才會是可見的。若設定為其它的值,就會隱藏 PDF 內容。

  • 如果按一下 PDF 檔中內容的連結,便會更新 PDF 內容的捲動位置。如果按一下 PDF 檔以外的內容,便會重新導向包含 PDF 的 HTMLLoader 物件 (即使連結的目標是新視窗也一樣)。

  • PDF 註解工作流程在 AIR 中無法運作。