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,则用户选择 Print(或 Flash 运行时,例如 Flash Player 或 AIR,已启动 Print 命令)。因此,可以调用 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 运行时在向打印机发送打印作业时遇到问题(例如,如果打印机脱机),您也可以捕获到该异常,并提供更多信息或更多选项(例如显示消息文本或在动画中提供警告)。例如,您可以为 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 后,您就可以访问由打印机设置定义的属性。这些设置包括纸张宽度、纸张高度(pageHeightpageWidth)以及纸张上的内容方向。由于这些设置是打印机设置,不受 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 的先前版本不同,ActionScript 3.0 未将 PrintJob 对象限定在单帧。然而,因为用户在“打印”对话框中单击“确定”按钮后,操作系统会向用户显示打印状态信息,所以请尽快调用 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 引发运行时异常。