分享
 
 
 

Java高级编程:使用打印服务API一(图)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Java自从问世以来在各方面发展迅速,但是一直以来,打印输出是java最弱的方面。事实上,java1.0不支持任何打印功能。Java1.1在java.awt包里包含了一个叫做PrintJob的类,但是这个类提供的打印功能十分粗糙和不可靠。当java1.2问世,它围绕PrinterJob设计了一个完整独立的打印机制(叫做java2D printing API),并且在java.awt.print包里定义了一些新的类和接口。这些使得基于PrintJob打印机制(就是AWT printing)基本荒废,虽然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(),正如它的名字一样,它返回一个你默认的打印机:

PrintService service = PrintServiceLookup.lookupDefaultPrintService();

虽然用这个办法很简单也很方便,用它来选择你的打印机意味着用户的打印机一直都支持你的程序所要精确传输的数据输出。实际上,你真正想要的是那种可以处理你想要的数据的类型并且可以支持你要的特征例如颜色或者两边打印。为了从列表中中返回你所要求的非凡功能支持的打印机,你可以使用剩下两个方法中的lookupPrintServices() 或者lookupMultiDocPrintServices()。

lookupPrintServices()方法有两个参数:一个DocFlavor的实例和实现AttributeSet接口的实例。

你马上将看到,你可以使用两者中任意一个来限制返回的打印机,但是lookupPrintServices()答应你指定这两个参数为空值。假如把两者都设为空,那么你得到的返回值将是任意一个可用的打印机。在这种情况下,你并不需要查看PrintService中定义的方法,其中一个getName()方法返回了一个字符串,代表打印机的名字。你可以编译下面的代码来列出你的系统现有的打印机:

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);

for (int i = 0; i < services.length; i++)

{

System.out.println(services[i].getName());

}

例如你的系统名为PrintServer,下面有Alpha, Beta, 和Gamma 打印机,用以上代码可以得到以下输出:

\\PrintServer\Alpha

\\PrintServer\Beta

\\PrintServer\Gamma

现在查看那些你可以传给lookupPrintServices()方法的参数来看看如何返回拥有非凡功能的打印机。

DocFlavor

第一个你可以指定的参数是一个DocFlavor类的实例,它描述了将要打印的数据的类型和数据如何存储。在大部分情况下,并不需要去创建一个新的实例因为Java包含了很多预先定义的实例,使得你可以用它们来传给lookupPrintServices()。然而,我们还是来看一下DocFlavor的结构和方法来探讨打印服务如何使用这个实例。

创建DocFlavor实例需要的两个参数都是字符串,一个是MIME (Multipurpose Internet Mail Extensions)类型另一个是类的名字。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有