JavaPrintServiceJava打印API用户手册.docx
- 文档编号:8032670
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:51
- 大小:45.96KB
JavaPrintServiceJava打印API用户手册.docx
《JavaPrintServiceJava打印API用户手册.docx》由会员分享,可在线阅读,更多相关《JavaPrintServiceJava打印API用户手册.docx(51页珍藏版)》请在冰豆网上搜索。
JavaPrintServiceJava打印API用户手册
目录
第一章介绍
Java平台打印的历史
JDK1.3
JDK1.2
JDK1.1
JavaPrintServiceAPI能做什么
JavaPrintService构架
javax.print包
发现打印服务
指定打印数据格式
创建打印工作
javax.print.event包
应用程序如何使用JPS
一个基本的例子
第二章属性
属性的类别和值
属性角色
属性集
如何指定属性
标准属性
OrientationRequested
Copies
Media
MediaSize
MediaPrintableArea
Destination
SheetCollate
Sides
Fidelity
使用JPS属性
第三章指定文档类型
用户格式打印数据
预定义数据格式的MIME类型
文本数据
页面描述语言文档
图像数据
自适应打印数据
表示类
字符编码的重要性
服务格式打印数据
怎样使用DocFlavor
第四章打印及流化文档
比较StreamPrintService与PrintService
定位服务
发现打印服务
发现流打印服务
获得一个打印工作
创建DOC
注册事件
打印服务事件
打印工作事件
PrintJobAttributeListener
PrintJobListener
提交打印工作
向打印机提交打印工作
向流提交打印工作
打印服务提供商
第五章打印及流化2D图像
使用打印工作打印或流化图像
打印2D图像
流化2D图像
使用服务格式数据
打印服务格式数据
流化服务格式打印数据
示例:
PrintPS.java
示例:
PrintGIFtoStream.java
示例:
Print2DPrinterJob.java
示例:
Print2DGraphics.java
示例:
Print2DtoStream.java
示例:
PrintGIF.java
JavaPrintService词汇表
第一章介绍
JavaPrintService(JPS)是一个Java打印API,设计此API是为了支持在所有Java平台上的打印工作——包括微空间平台,并且支持现有的API。
这个统一的打印API包括了IETF规范RFC2911中InternetPrintingProtocol(IPP)1.1所指定的标准属性以及在此基础上的可扩展的打印属性。
通过这些属性,客户端和服务器端应用程序就能够发现并选定具有完成属性设置所指定的功能的打印机。
除了API中包含的StreamPrintServece,它还允许应用程序将打印数据转码为不同的格式,第三方也可以通过ServiceProviderInterface(SPI)动态安装他们自己的打印服务。
Java平台打印的历史
JDK1.3
为了使用户的应用程序能够指定打印工作的参数和页面属性,JDK1.3向AWT引入了JobAttributes和PageAttributes类。
两个API支持基本的页面绘制,作为打印子系统的一部分,它会表示和格式化一个页面。
虽然用户可以从打印对话框中选择打印机并使用JobAttributes和PageAttribtes来设定打印属性,但无论是AWT还是Java2D打印API都不支持基于打印功能寻找打印机,而这对于任何一个打印系统都是必不可少的组成部分。
要了解更多关于Java平台打印的历史请参看PrintingHelpforJavaDevelopers。
JDK1.2
JDK1.2为Java平台添加了java.awt.print包,它允许应用程序打印所有的Java2D图像,包括2D图表、文本和图片。
JDK1.1
JavaDevelopmentKit版本1.1首次为Java平台引入了对基本打印功能的支持。
JDK1.1打印API为开发者提供了一个基本的框架用于从客户应用程序中打印用户接口上下文。
JDK1.1打印API,也叫做AWTPrintingAPI,是围绕java.awt.PrintJob类来设计的,它封装了一个打印请求。
PrintJob类创建一个Graphics的子类,它实现了对页面的渲染调用和绘制。
JavaPrintServiceAPI能做什么
JavaPrintServiceAPI解决了当前JavaPrintAPI所不具备的关于客户端以及服务器端应用程序中常见的打印需求,统一和扩展了Java平台的打印能力。
除了支持现有的Java2D打印功能之外,JavaPrintService还新增了许多新特性,包括:
·客户端和服务器端应用程序都可以自主寻找、选择打印设备,并指定打印工作的各种属性。
这样,JPS就提供了打印子系统中一直缺失的部分:
可编程的打印设备搜索。
·标准IPP属性的实现被作为一级类对象包含在了JPSAPI中。
·应用程序可以扩展包括在JPSAPI中的属性。
·第三方可以通过ServiceProviderInterface接口添加自己的打印服务。
JavaPrintService构架
JavaprintserviceAPI包含四个包,分别是:
javax.print
javax.print.attribute
javax.print.attribute.standard
javax.print.event
javax.print包
javax.print包是API的主包,其中包含的类和接口能够让你:
·发现打印服务(PrintServices)
·指定打印数据的格式
·从一个打印服务创建打印工作(printjobs)
·向一个打印设备或者数据流发送打印数据
发现打印服务
应用程序通过调用虚拟类PrintServiceLookup的静态方法来定位能够满足应用程序打印需求的打印服务。
例如,需要双面打印一个文档,应用程序就必须首先找到具备双面打印能力的打印设备。
PrintServiceLookup返回的某个PrintService接口的实现类代表一个真实的打印设备。
PrintService接口具有众多能够返回打印服务所支持的属性的方法,通过调用其中的一个便可以确定这个PrintService对象所具备的功能。
在《打印及流化文档》章节的《定位服务》小节对PrintService类和PrintServiceLookup类进行了讨论。
JDK自带的PrintServiceLookup实现类能够定位标准平台下的打印设备。
如果需要定位其他类型的打印设备,如IPP打印机或JINI打印机,则打印服务的提供者可以重新编写PrintServiceLookup类的实现。
打印服务提供者可以使用SPIJAR文件规范来动态安装自定义的PrintServiceLookup实现。
除了向一台打印设备发送数据,应用程序还可以使用StreamPrintService对象将数据打印到一个输出流中,这就使得应用程序能够将打印数据转换为不同的格式。
为了获得一个StreamPrintService对象,应用程序需要使用虚拟类StreamPrintServiceFactory提供的查找方法,这与PrintServiceLookup类发现打印服务的办法类似。
在《打印及流化文档》章节中讲述了如何使用StreamPrintServiceFactory类和StreamPrintService类。
StreamPrintService对象还可以被用于向输出流发送2D图像数据,这在《打印及流化2D图像》章节中有详细的说明。
指定打印数据格式
DocFlavor类代表了打印数据的格式,如JPEG或PostScript。
一个DocFlavor对象包括了一个MIME类型,它用于描述格式和代表该格式的表示类名,如java.io.InputStream,它指明了如何将文件发送给打印服务。
为了方便起见,JPSAPI已经预定义了一些代表通用数据格式的DocFlavor对象。
在《指定文档类型》章节中讲述了关于如何使用DocFlavor对象的细节。
创建打印工作
当一个适合的打印服务被找到,应用程序就会从中创建一个打印工作,打印工作由DocPrintJob类对象来表示,该对象提供了实际的打印方法。
在呼叫打印之前,应用程序会创建一个Doc对象,该对象用来封装打印数据以及打印要求的属性,这些属性被定义在包javax.print.attribute和包javax.print.attribute.standard中。
《打印及流化文档》章节中讲述了如何使用Doc类和DocPrintJob类。
通过JPS,应用程序既可以使用PrinterJob类也可以使用DocPrintJob类来打印2D图像。
《打印及流化2D图像》章节对此进行了讨论。
javax.print.attribute包和javax.print.attribute.standard包定义了打印属性。
它们描述了打印服务的功能、文档的特性、操作文档或整个打印工作的指令、以及打印工作或打印设备的状态。
javax.print.attribute包描述了属性的类型以及它们如何被归类于集合之中。
Attribute接口是所有打印属性的父接口。
javax.print.attribute包所包含的类和接口定义了五种不同类型的属性,其中每一种描述了一个打印服务所具备的功能。
例如,PrintRequestAttribute接口定义了用户用来描述打印工作特性的一些属性,如打印成几份等。
javax.print.attribute.standard包中列举了API所支持的所有的标准属性,其中大部分是IPP规范所规定的属性。
《属性》章节讨论了关于属性API的更多细节。
javax.print.event包
javax.print.event包内包括了允许应用程序在打印工作和打印服务上注册事件的类。
要获得关于注册打印工作事件的详细信息,请阅读《注册事件》小节。
应用程序如何使用JPS
应用程序使用JPSAPI操作打印请求的典型方法包括以下几步:
·获得一个适合的DocFlavor,它是定义打印数据格式的类。
·创建并填写AttributeSet,它封装了描述打印服务功能的属性集,如打印5份,装订,以及双面打印。
·查找一个能够处理由DocFlavor和属性集指定的打印请求的打印服务。
·在该打印服务上创建一个打印工作。
·调用打印工作的print方法。
以上步骤,应用程序会根据打印对象和打印方式的不同进行不同的操作。
应用程序也可以向一个打印设备或输出流发送打印数据。
打印数据可以是文本文档或图形,也可以是封装了2D图像的Java对象。
如果打印数据是2D图像,则打印工作既可以由DocPrintJob表示,也可以由PrinterJob表示。
如果打印数据是文本文档,那就必须使用DocPrintJob。
打印方法和打印数据格式共同决定了如何从六种打印机制中选择一种:
·使用DocPrintJob与PrintService的实例,通过打印设备打印文档。
·使用DocPrintJob与StreamPrintService,将一个文档放入输出流中。
·使用DocPrintJob与PrintService的实例,通过打印设备打印2D图像。
·使用DocPrintJob与StreamPrintService,将一个2D图像放入输出流中。
·使用java.awt.print.PrinterJob,将一个2D图像打印到PrintService中。
·使用java.awt.print.PrinterJob,将一个2D图像发送到StreamPrintService中。
《属性》章节和《指定文档类型》章节讲述了如何创建一个属性集以及如何指定文档类型去使用以上六种打印机制的任意一种。
《打印及流化文档》章节讨论了使用DocPrintJob打印和流化一个文档。
《打印及流化2D图像》章节则讲解了如何同时使用DocPrintJob和PrinterJob打印和流化2D图像。
一个基本的例子
大部分使用JavaPrintServiceAPI的应用程序都是希望直接将文档发送给打印机,下面的例子实现了这种功能:
//Inputthefile
FileInputStreamtextStream;
try{
textStream=newFileInputStream("file.TXT");
}catch(FileNotFoundExceptionffne){
}
if(textStream==null){
return;
}
//Setthedocumenttype
DocFlavormyFormat=DocFlavor.INPUT_STREAM.TEXT_PLAIN_ASCII;
//CreateaDoc
DocmyDoc=newSimpleDoc(textStream,myFormat,null);
//Buildasetofattributes
PrintRequestAttributeSetaset=newHashPrintRequestAttributeSet();
aset.add(newCopies(5));
aset.add(MediaSize.ISO.A4);
aset.add(Sides.DUPLEX);
//discovertheprintersthatcanprinttheformataccordingtothe
//instructionsintheattributeset
PrintService[]services=PrintServiceLookup.lookupPrintServices(myFormat,aset);
//Createaprintjobfromoneoftheprintservices
if(services.length>0){
DocPrintJobjob=services[0].createPrintJob();
try{
job.print(myDoc,aset);
}catch(PrintExceptionpe){}
}
尽管这个例子仅仅演示了打印的六种方法中的一种,但其他几种打印机制也是以类似的办法来工作。
这篇说明的其余部分将更加详细地讨论打印操作的每一个细节以及全部的打印机制。
第二章属性
当一个用户向打印机发送打印数据时,他还需要提供如何打印数据的指令,如:
使用何种媒介(纸)、打印多少份。
用户可以使用JavaPrintServiceAPI的属性定义来设定这些操作指令。
JavaPrintServiceAPI包含了两个定义属性的包:
javax.print.attribute和javax.print.attribute.standard。
javax.print.attribute包中包含了用于描述属性类型以及如何将这些属性放置到集合中的接口和类。
而javax.print.attribute.standard包中则列举了API中所有的标准属性。
JPSAPI中大部分的属性定义都是由IETF的InternetPrintingProtocol(IPP)规范定义的标准或扩展的实现。
本章节详细讲述了JPSAPI中的属性定义。
《属性的类别和值》小节解释了符合JPS要求的属性是什么样子的,《属性角色》小节讲述了属性的类型,《属性集》小节讲述了如何将属性整合为属性集,《标准属性》小节讲述了javax.print.attribute.standard包中的一些较为常用的属性。
属性的类别和值
每台打印机都具有一系列的功能,如:
在不同尺寸的纸张上打印的能力或多份打印的能力。
每种功能又具有一系列的值。
例如:
一台打印机设置打印取向的功能可能具有这种形式:
[LANDSCAPE(横屏),PORTRAIT(竖屏)]。
对每一个打印请求而言,从这些可能的值中选定一个就能实现这些功能。
JavaPintServiceAPI用一个术语“属性类别(attributecategory)”来代指打印机的功能,如“打印取向”;用另一个术语“属性值(attributevalue)”来代指功能的值,如“LANDSCAPE”。
在JavaPrintServiceAPI中,用一个实现了Attribute接口的Java类来表示属性类别,属性值则是该类或其子类的实例。
例如,需要完成一个打印5份的打印工作,那么应用程序就应当用数值5来构建一个Copies类的对象,然后使用这个对象去设定打印工作。
其中Copies类代表了属性类别,而Copies类的对象则代表了具体的属性值。
由于属性值被封装在一个Java对象中,因此属性值对象本身就可以代表属性类别,因此,简化起见,通常情况下也可以用属性值来表示属性。
属性类别和值构成了一个“关键字——值”数据对,你可以将这个数据对与其他属性一起加入到属性集中。
查看《属性集》小节可以获得更多信息。
Attribute接口中只定义了两个方法:
getName和getCategory。
getName方法返回一个String对象作为类别的名称。
getCategory方法返回首先实现该属性类别的类。
为了确保一个特定的类别的所有实现都具有相同的名称和类,它(即首先实现接口的类)的子类不应当覆盖getName和getCategory方法。
为了确定一台打印机支持什么样的属性类别和值,你需要使用PrintService接口中定义的query方法。
一个打印请求不需要为目标打印机支持的所有属性类别指定值,因为每个支持的属性类别都会有它自己的默认值。
例如,一台打印机可能会支持多达999份的打印工作,但它通常会采用默认值即只打印1份。
属性角色
当向一台打印机提交一个打印工作时,用户还需要提供用于描述打印数据特征的属性,如文档名称、打印数据、以何种方式打印(双面打印、打印5份等)。
若一个打印工作由好几块打印数据组成,则不同的数据块应当拥有不同的操作指令,如第一份文档以8×11英寸的媒介打印、其他的文档以11×17英寸媒介打印。
一旦打印机接受了打印工作,该工作有关的其他信息就会被激活,这些信息可能包括:
工作状态(如已完成、排队中)、目前已经打印的页数等。
这些信息同样也是属性。
甚至打印机本身也可以用属性来描述,如:
打印机的名称、打印机的位置、等待队列中的工作数等。
JavaPrintServiceAPI用五种Attribute的子接口来定义这些不同种类的属性角色:
·PrintRequestAttribute被一个应用程序用来代表应用于整个打印工作的设置和指明整个打印工作应当如何运行。
·DocAttribute被应用程序用来代表一个单一的文档和应用于该文档的设置。
·PrintJobAttribute被打印服务用来报告一个打印工作如何被执行。
它的值通常与打印请求的属性值相同,但若打印机不支持打印请求的属性值时,响应的打印工作会包含打印机所支持的属性值。
此时这个值就不同于打印请求的值了。
·PrintServiceAttribute被一个打印服务用于报告它自己的状态。
·SupportedValuesAttribute被打印服务用来标识一个请求属性所支持的数值范围。
例如,一台打印机可能只支持一个固定的打印份数。
当一个打印服务被查询它的打印份数范围时,它会返回一个CopiesSupported对象,该对象包含了关于打印份数范围的信息,它是SupportedValuesAttribute的一个实现类。
许多属性可能是多个属性角色的成员,例如Media属性就属于文档、打印工作和打印服务角色,因为该属性可以描述纸张尺寸、进纸匣或纸张类型。
实际上,大多数的文档角色同时也是请求角色,而所有的请求角色都是工作角色。
下一部分讲述了如何将属性整合为属性集,其中也包含属性角色的内容。
属性集
提交打印工作时,用户往往需要提供多于一条的操作指令。
如用户可能需要同时指明使用A4纸和横向打印。
为了向打印机传送多于一条的操作指令,用户需要将多条属性整合并以一个属性集来发送。
在JavaPrintServiceAPI中,属性集以AttributeSet接口表示。
AttributeSet接口与java.util.Map接口相似:
它提供了一个从关键字到值的映射表,其中每一个关键字都是唯一的,并对应不多于一个的值。
不同的是,AttributeSet接口是专门为了支持JavaPrintServiceAPI的需要而设计的,它被要求满足以下条件:
·AttributeSet中的每一个关键字对应一个属性类别,它的值只能在该关键字所表示的属性类别可能的取值范围中选取。
因此,与Map接口不同,AttributeSet限制了关键字的取值范围,因为一个属性类别不允许被赋予它所不具备的属性值。
·只有实现了Attribute接口的的属性才允许被加入到属性集中。
·属性集中一个属性类别只能以一个属性的身份加入。
例如,若属性集中已经包含了属性Media,那么再向属性集添加其他的Media属性就会覆盖之前的Media。
与单独的属性类似,属性集也有角色。
属性集角色由AttributeSet的子接口定义,这与《属性角色》小节所讲的由Attribute的子接口表示属性角色相类似。
AttributeSet的子接口有:
PrintRequestAttributeSet,PrintJobAttributeSet,DocAttributeSet和PrintServiceAttributeSet。
属性集的角色决定了它所包含的属性的类型:
一个打印请求属性集只能够包含打印请求属性。
JavaPrintServiceAPI包含了HashAttributeSet,它是实现了AttributeSet接口的一个实体类,当然开发者也可以提供各自对AttributeSet接口的实现类。
应用程序常常会使用HashAttributeSet类的子类而不是使用它本身,这些子类有:
HashPrintRequestAttributeSet,HashPrintJobAttributeSet,HashDocumentAttributeSet和HashPrintServiceAttributeSet。
这些子类实现了相对应的AttributeSet的子接口。
例如:
PrintRequestAttributeSet继承了AttributeSet,HashPrintRequestAttributeSet则是实现了PrintRequestAttributeSet的一个实体类。
使用HashPrintRequestAttributeSet或任何实现了PrintRequestAttributeSet接口的类所创建的属性集都只能包含请求属性。
与它的子类不同,HashAttributeSet可以包含任何类型的属性。
因此当一个应用程序需要使用两种类型以上的属性时,它只能够直接使用HashAttributeSet。
通过PrintService的getUnsupportedAttibutes方法返回属性集就是这样一个例子。
因为不支持的属性有可能属于不同的属性角色。
至于单独的属性,应用程序通常会创建请求属性集,这是因为指明打印请求是打印应用程序的基本功能。
使用HashPrintRequestAttr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaPrintServiceJava 打印 API 用户手册
![提示](https://static.bdocx.com/images/bang_tan.gif)