Java高级编程:使用打印服务API
来源:网络 更新时间:2014-12-3
Java自从问世以来在各方面发展迅速,但是一直以来,打印输出是java最弱的方面。事实上,java1.0不支持任何打印功能。Java1.1在java.awt包里包含了一个叫做PrintJob的类,但是这个类提供的打印功能十分粗糙和不可靠。当java1.2问世,它围绕PrinterJob设计了一个完整独立的打印机制(叫做java2DprintingAPI),并且在java.awt.print包里定义了一些新的类和接口。这些使得基于PrintJob打印机制(就是AWTprinting)基本荒废,虽然PrintJob从未被抨击而且至少在这篇文章里仍然是一个提供技术的类。
在J2SE1.3里当PrintJob的功能扩展到可以通过在java.awt包里的JobAttributes和PageAttributes两个类设定工程和页面的属性时发生了一些额外的改变。随着J2SE1.3的发布,打印功能相应的得到了完善;但是在混合使用这两种完全不同的打印机制的时候仍然存在一些问题。比如,这两种机制使用java.awt.Graphics这个类的一个接口来展现打印内容,意味着所有要打印的东西都必须用一张图片表示。另外,完善的PrintJob提供了很有限的工程相关属性的设置;这两种机制都没有办法通过程序来选择目标打印机。
Java打印最大的改变来自于J2SE的发布带来的Java打印服务API。这个第三代Java打印支持接口突破了先前提到的使用javax.print包的PrintService和DocPrintJob接口的局限性。因为新的API就是以前两种旧的打印机制定义的功能函数的一个父集,它是目前我们常用的方法并且是这篇文章的焦点。
更深入来说,以下的步骤包含了怎么使用这个新的Java打印服务API:
1.定义打印机,限制那些返回到提供你要实现功能的函数的列表。打印服务实现了PrintService接口.
2.通过调用接口中定义的createPrintJob()方法创建一个打印事件,作为DocPrintJob的一个实例。
3.创建一个实现Doc接口的类来描述你想要打印的数据,你也可以创建一个PrintRequestAttributeSet的实例来定义你想要的打印选项。
4.通过DocPrintJob接口定义的printv()方法来初始化打印,指定你先前创建的Doc,指定PrintRequestAttributeSet或者设为空值。
现在你可以检查每一步并且试着完成它们。
注意
在这篇文章里,我将交替使用打印机和打印服务,因为在大部分情况下,打印服务不亚于一台真实的打印机。一般的打印服务反映了理论上可以发送到不仅仅是打印机的的输出。举例来说,打印服务也许根本不能打印东西但是可以往磁盘上的文件写数据。换句话说,所有的打印机可以看成是特殊的打印服务,但是并不是所有打印服务和打印机有联系。就像你一般把你的文本送到打印机那里一样,我有时候使用更为简便的打印机这个名词来代替技术上更精确的打印服务。
定义打印服务
你可以使用在PrintServiceLookup类中定义的三种静态方法中的一种来定义。最简单的一种就是lookupDefaultPrintService(),正如它的名字一样,它返回一个你默认的打印机:
PrintServiceservice=PrintServiceLookup.lookupDefaultPrintService();
虽然用这个办法很简单也很方便,用它来选择你的打印机意味着用户的打印机一直都支持你的程序所要精确传输的数据输出。实际上,你真正想要的是那种可以处理你想要的数据的类型并且可以支持你要的特征例如颜色或者两边打印。为了从列表中中返回你所要求的特殊功能支持的打印机,你可以使用剩下两个方法中的lookupPrintServices()或者lookupMultiDocPrintServices()。
lookupPrintServices()方法有两个参数:一个DocFlavor的实例和实现AttributeSet接口的实例。
你马上将看到,你可以使用两者中任意一个来限制返回的打印机,但是lookupPrintServices()允许你指定这两个参数为空值。如果把两者都设为空,那么你得到的返回值将是任意一个可用的打印机。在这种情况下,你并不需要查看PrintService中定义的方法,其中一个getName()方法返回了一个字符串,代表打印机的名字。你可以编译下面的代码来列出你的系统现有的打印机: