java高级编程学习如何使用打印服务 API(二)

2014-11-24 02:59:55 · 作者: · 浏览: 6
E。
6

因为要通过 URL 打印 gif 图片,你可以用以下代码来访问获得一个的 DocFlavor 实例



DocFlavor flavor = DocFlavor.URL.GIF;

该代码创建了一个 DocFlavor 静态实例的引用,其代表类是 java.net.URL,MIME 是
image/gif。

表 2 列出的类在 DocFlavor.URL 的类中定义,那么其他六个在 DocFlavor 内定义的内部类
呢?我们依然会等一下再来讨论 SERVICE_FORMATTED,这之前,看看与二进制数据相关的
所有三种类型(BYTE_ARRAY, INPUT_STREAM, 和 URL)相关的内部类,它们的名字和表
2 中列出的一样。例如,如果你把 gif 数据储存到了一个字节数组里,那么你可以用以下代码:

DocFlavor flavor = DocFlavor.BYTE_ARRAY.GIF;

正如有三个与二进制类型关联的 DocFlavor 有它们自己的内部类一样,与字符类型相关
的另外三个类,也包含另一种类型的内部类,表 3 中列出。

7
Table 3. CHAR_ARRAY, READER, and STRING


所以,如果你想打印储存在字符串中的文本数据,可用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;

类似, 如果文本来自于网页上的 HTML 文档, 并且你希望打印出和在 浏览器中看到的一
样的效果,就用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_HTML;




4.选择正确的打印机
Choosing the right printer

还记得我们在开始讨论 DocFlavor 之时,关于确认您实际使用的打印机,支持需要打印
的数据类型,以及你期望使用的传送机制(即表现类) 。这步看起来似乎没有必要,但实际
上,你会对给定打印机所支持的文档类型感到吃惊。例如,刚提到文本类型看起来似乎是最
容易支持的,所以,如果你的程序要打印一个普通文本或者 HTML 文本,你可能会简单地
选择第一个有效的打印服务, 并将输出送到那台打印机去。 然而大部分打印机不支持基于文
本的表现类,如果你试图向打印机发送你选择的 DocFlavor,但是它却不支持,就会抛出下
面的异常:
8

Exception in thread main sun.print.PrintJobFlavorException: invalid flavor


at sun.print.Win32PrintJob.print(Win32PrintJob.java:290)


at PrintTest.main(PrintTest.java:11)

现在你已经知道了如何得到一个 DocFlavor 的引用,并且我们也讨论了选择支持这个
DocFlavor 的打印机重要性, 接下来我来将告诉你, 如何确定你使用的打印机支持所需特性。
我先前说过 lookupPrintServices()允许你指定一个 DocFlavor 作为第一个参数,如果你指定
的参数非空,那么方法会返回支持指定 DocFlavor 的打印服务实例。例如,以下代码将返回
可以通过 URL 来打印 gif 文件的打印机的列表:
DocFlavor flavor = DocFlavor.URL.GIF;
PrintService[ ] services = PrintServiceLookup.lookupPrintServices(flavor, null);

另外,如果你的程序已经获得了打印服务的实例,而你想知道它是否支持一种特定的属
性,你可以调用 isDocFlavorSupported()方法。在下面的代码里,将得到一个默认打印机的
引用,如果不支持打印出通过 URL 获得的 gif,就会出现错误信息:

PrintService service = PrintServiceLookup.;
lookupDefaultPrintService();

DocFlavor flavor = DocFlavor.URL.GIF;

if (!service.isDocFlavorSupported(flavor)) {


System.err.println(The printer does not support the appropriate DocFlavor) ;

}






9
5.AttributeSet (属性集)

如你见,一个 DocFlavor 描述了要打印的数据,并且可以用来确定 PrintService(打印服
务)是否支持该数据类型。然而,您的应用程序也可能需要一种基于打印机特性的选择机制。
例如,你要打印的图片需要用不同的颜色来传递信息,你想知道给定的(打印)服务是否支
持彩色打印,如果不是,那么要么不使用该打印机,或者转换成不依赖颜色的图片演示。

类似彩色打印,两面打印,以及不同的打印制方向选择(垂直肖像式或水平风景式)等
特性被称为打印机属性,而 javax.print.attribute 包中包含了许多你可以用于描述这些属性
的类和接口。其中的一个接口是 AttributeSet,可以作为前面提到的 lookupPrintServices()
中第二个参数。正如你预计的那样,AttributeSet 的一个实现代表了一组属性的集合,在调
用 lookupPrintServices()时指定一个非空的值,将只返回支持这些属性的打印服务。换句话
说,如果 DocFlavor 和 AttributeSet 都不为空,那么方法将返回那些这两种属性都支持的
打印机

6.Attribute

给定的一个 AttributeSet 是一组属性的集合,一个显而易见的问题是,如何指定组成该
集合的属性值呢? javax.print.attribute 包里同时含有一个叫 Attribute 的接口, 你马上可以
看到通过调用 add()方法,来给 AttributeSet 添加若干个 Attribute 实例来获得这个集合。查
阅 Attribute 接口的文档后,发现在 javax.print.attribute.standard 包里定义了大量你将要用
到的实现。在你了解这些之前,你可以先查看 javax.print.attribute 这个包里的其他接口及
其实现,将非常有帮助!

7.属性角色

目前为止,我们把属性描述成打印服务的能力,这在大部分上是正确的,至少对于 Java
是如何支持属性来说,它是某种意义上的单纯概括。对应每个不同属性,java 都将其关联
到不同的角色上,属性仅在相关的角色上下文中才有效。换而言之,在不同的位置要使用不
同的 Java 打印服务属性,不是每个属性在任何地方都适用。
10
为了更好的理解这个,来看一下 javax.print.attribute.standard 包里定义的
OrientationRequested 和 ColorSupported 实现。创建一个新的打印文档时,应该通过设定
OrientationRequested 属性来确定打印纸的方向(例如垂直肖像式或水平风景式) 。与此相
反,ColorSupported 是你在调用 PrintService 接口的 getAttributes()方法时返回的属性。换