Flash 執行階段工作與系統列印

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

由於 Flash 執行階段會將頁面傳送至作業系統的列印介面,因此您應該瞭解 Flash 執行階段所管理的工作,以及作業系統本身列印介面所管理的工作。Flash 執行階段可以起始列印工作、讀取印表機的某些頁面設定、將列印工作內容傳遞給作業系統,以及確認使用者或系統是否已經取消列印工作。至於其它的程序 (例如顯示印表機專屬對話方塊、取消多工緩衝處理區域中的列印工作,或回報印表機的狀態) 則全部由作業系統來處理。當起始或格式化列印工作發生問題時,Flash 執行階段也能送出回應,但只能透過作業系統的列印介面送出特定屬性或條件的問題報告。身為一位開發人員,您撰寫的程式碼必須回應這些屬性或條件。

處理例外以及傳回

執行 addPage() send() 呼叫之前,請先檢查 PrintJob.start() 方法是否傳回 true ,以免使用者已經取消了列印工作。有個簡單的方式,可以在執行前先檢查是否已經取消這些方法,就是將它們包含在 if 陳述式中,如下列範例所示:

if (myPrintJob.start()) 
{ 
    // addPage() and send() statements here 
}

如果 PrintJob.start() true ,表示使用者已經選取「列印」(或 Flash 執行階段,例如 Flash Player 或 AIR,已經起始「列印」命令)。所以,可以呼叫 addPage() send() 方法。

同時,為了協助管理列印程序,Flash 執行階段會擲回 PrintJob.addPage() 方法的例外,讓您能夠捕捉錯誤,並將資訊和選項提供給使用者。如果 PrintJob.addPage() 方法失敗,您也可以呼叫其它函數或停止目前的列印工作。您可以透過將 addPage() 呼叫嵌入 try..catch 陳述式中來捕捉這些例外,如下列範例所示。在這個範例中, [params] 是參數的預留位置,用來指定實際要列印的內容:

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error,  
    } 
    myPrintJob.send(); 
}

列印工作開始執行之後,您就可以使用 PrintJob.addPage() 加入內容,然後查看此內容是否會產生例外 (例如,使用者已經取消了列印工作)。如果產生例外,您就可以在 catch 陳述式中加入邏輯,將資訊或選項提供給使用者 (或 Flash 執行階段),或是停止目前的列印工作。如果成功加入頁面,接著便可以使用 PrintJob.send() 將這些頁面傳送到印表機。

如果 Flash 執行階段將列印工作傳送到印表機時發生問題 (例如,印表機為離線狀態),您也可以捕捉這個例外,並將資訊或更多選項 (例如,顯示訊息文字或使用動畫提供警告) 提供給使用者 (或 Flash 執行階段)。例如,您可以在 if..else 陳述式中指定新文字給文字欄位,如下列程式碼所示:

if (myPrintJob.start()) 
{ 
    try 
    { 
        myPrintJob.addPage([params]); 
    } 
    catch (error:Error) 
    { 
        // Handle error.  
    } 
    myPrintJob.send(); 
} 
else 
{ 
    myAlert.text = "Print job canceled"; 
}

如需實際的範例說明,請參閱 列印範例:縮放、裁切和回應

使用頁面屬性

使用者按一下「列印」對話方塊中的「確定」,而且 PrintJob.start() 傳回 true 之後,您就可以存取印表機設定所定義的屬性。這些設定包括紙張寬度、紙張高度 ( pageHeight pageWidth ) 以及紙張上內容的列印方向。由於這些屬性都是印表機的設定,並非由 Flash 執行階段控制,因此您無法變更這些設定;但是您可以利用這些屬性來對齊傳送到印表機的內容,以符合目前的設定。如需詳細資訊,請參閱 設定大小、縮放與列印方向

設定向量或點陣圖顯示

您可以手動設定列印工作,將每一個頁面當做向量圖像或點陣圖影像排入多工緩衝處理區域。在某些情況下,向量列印可以產生較小的佇列檔案,影像品質與點陣列印比起來較好。但是,當您要列印的內容中含有點陣圖影像,並且想保留任何的 Alpha 透明度或顏色效果時,請將頁面列印為點陣圖影像。而且,非 PostScript 印表機也會自動將任何向量圖像轉換為點陣圖影像。

將 PrintJobOptions 物件傳遞為 PrintJob.addPage() 的第三個參數,就可以指定點陣列印。

如果是 Flash Player 和 AIR 2 之前的 AIR,請將 PrintJobOptions 物件的 printAsBitmap 參數設為 true ,如下所示:

var options:PrintJobOptions = new PrintJobOptions(); 
options.printAsBitmap = true; 
myPrintJob.addPage(mySprite, null, options);

如果您沒有指定第三個參數的值,則列印工作會採用預設的參數值,也就是使用向量列印。

如果是 AIR 2 以及更新的版本,請使用 PrintJobOptions 物件的 printMethod 屬性來指定列印方法。這個屬性接受三種值,而這些值定義為 PrintMethod 類別中的常數:

  • PrintMethod.AUTO :根據列印內容,自動選擇最佳列印方法。例如,如果頁面是由文字組成,則會選擇向量列印方法。不過,如果含有 Alpha 透明度的浮水印影像與文字重疊,則會選擇點陣列印,以保留透明度。

  • PrintMethod.BITMAP :強制點陣列印 (不論內容為何)

  • PrintMethod.VECTOR :強制向量列印 (不論內容為何)

排定列印工作陳述式時限

ActionScript 3.0 沒有將 PrintJob 物件限制在單一影格 (如舊版 ActionScript 作法)。不過,由於作業系統會在使用者按一下「列印」對話方塊中的「確定」按鈕之後,對使用者顯示列印狀態資訊,所以請儘快呼叫 PrintJob.addPage() PrintJob.send() ,以便將頁面傳送到多工緩衝處理區域。延遲抵達含有 PrintJob.send() 呼叫的影格,也會延遲列印程序。

ActionScript 3.0 將指令碼逾時限制規定為 15 秒鐘。因此,在列印工作序列中的每一個主要陳述式之間的時間間隔也不能超過 15 秒。換句話說,15 秒的指令碼逾時限制也將套用至下列間隔:

  • PrintJob.start() 與第一個 PrintJob.addPage() 之間的間隔

  • PrintJob.addPage() 與下一個 PrintJob.addPage() 之間的間隔

  • 最後一個 PrintJob.addPage() PrintJob.send() 之間的間隔

如果以上任何這些間隔超過 15 秒,下一次針對 PrintJob 實體之 PrintJob.start() 的呼叫就會傳回 false ,而且下一個 PrintJob 實體的 PrintJob.addPage() 也會導致 Flash Player 或 AIR 擲回執行階段例外。