通过用户界面的打印机选择
就此观点而言,我认为使用的打印机应该由应用程序计划选择。但操作过程中,打印输出内容时往往会显示一个对话框让用户选择。幸运的是,Java通过使用ServiceUI类(在javax.print包中定义)中的静态printDialog()方法使得这些操作简单化。
在显示的对话框旁边,仅在调用printDialog()时必须指定的参数值如下:
·用户可选用的PrintService实例数组。
·默认的PrintService。
·PrintRequestAttributeSet实例。这用来弹出显示的对话框,并在对话框消失之前返回用户所作的任何更改。
要解释这些如何运作,可使用下列简单的代码段来显示打印对话:
PrintService svc = PrintServiceLookup.lookupDefaultPrintService();
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
PrintService selection = ServiceUI.printDialog( null, 100, 100, services, svc, null, attrs);

Figure 3. The printer dialog
随着代码的说明,从printDialog()方法返回的值是一个PrintService实例,识别用户所选的打印机,或在用户取消打印机对话时识别为空。此外,PrintRequestAttributeSet已更新到可通过对话框来反映用户作出的更改,比如要打印的份数。
通过使用printDialog()方法,可让用户选择其输出要发往的打印机,提供用户对于专业应用程序的期望功能。
创建打印任务
这是打印中的一个简单步骤;因为一旦获得PrintService的一个参考,你需要做的就是调用createPrintJob()方法,如:
...
DocPrintJob job = service.createPrintJob();
定义要打印的文档
接下来这一步是定义要打印的文档,用一个在javax.print包里的Doc的接口实例来创建。每一个Doc的实例有两个必须定义的属性和一个可选择的属性:
·Object 代表要打印的内容
·DocFlavor的一个实例描述数据类型
·可选的DocAttributeSet 包含打印时的属性
复习Doc接口的文档可以看出javax.print包里包含了一个叫SimpleDoc 的接口的继承,它的构造函数包含了上面三个参数。要知道如何构建SimpleDoc 的实例,我们假设你要打印两份存在/Upload/2006-06/6672_bcm.gif的gif文件拷贝。
我们要做的就是构建一个SimpleDoc实例来描述这个文档创建了一个URL来指向图片,并且引用了DocFlavor,并把这两个传给SimpleDoc构造函数:
DocFlavor flavor = DocFlavor.URL.GIF;
SimpleDoc doc = new SimpleDoc(url, flavor, null);
打印的最后一个步骤就是调用DocPrintJob的 print()方法,传递待打印数据的Doc对象,或选用PrintRequestAttributeSet实例。为简单起见,假设默认打印机支持你所需要的flavor和属性,在此情况下要使用下列代码将上一个例子提及的gif文件打印两份:
DocPrintJob job = service.createPrintJob();
URL url = new URL( "/Upload/2006-06/6672_bcm.gif ");
DocFlavor flavor = DocFlavor.URL.GIF;
Doc doc = new SimpleDoc(url, flavor, null);
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(new Copies(2));
job.print(doc, attrs);
