




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录第一章 介绍Java平台打印的历史JDK 1.3JDK 1.2JDK 1.1Java Print Service API能做什么Java Print Service 构架javax.print包发现打印服务指定打印数据格式创建打印工作javax.print.event包应用程序如何使用JPS一个基本的例子第二章 属性属性的类别和值属性角色属性集如何指定属性标准属性OrientationRequestedCopiesMediaMediaSizeMediaPrintableAreaDestinationSheetCollateSidesFidelity使用JPS属性第三章 指定文档类型用户格
2、式打印数据预定义数据格式的MIME类型文本数据页面描述语言文档图像数据自适应打印数据表示类字符编码的重要性服务格式打印数据怎样使用DocFlavor第四章 打印及流化文档比较StreamPrintService与PrintService定位服务发现打印服务发现流打印服务获得一个打印工作创建DOC注册事件打印服务事件打印工作事件PrintJobAttributeListenerPrintJobListener提交打印工作向打印机提交打印工作向流提交打印工作打印服务提供商第五章 打印及流化2D图像使用打印工作打印或流化图像打印2D图像流化2D图像使用服务格式数据打印服务格式数据流化服务格式打印数据
3、示例:PrintPS.java示例:PrintGIFtoStream.java示例:Print2DPrinterJob.java示例:Print2DGraphics.java示例:Print2DtoStream.java示例:PrintGIF.javaJava Print Service 词汇表第一章 介绍Java Print Service (JPS)是一个Java打印API,设计此API是为了支持在所有Java平台上的打印工作包括微空间平台,并且支持现有的API。这个统一的打印 API包括了IETF规范RFC 2911中Internet Printing Protocol (IPP) 1.
4、1 所指定的标准属性以及在此基础上的可扩展的打印属性。通过这些属性,客户端和服务器端应用程序就能够发现并选定具有完成属性设置所指定的功能的打印机。除了API中包含的StreamPrintServece,它还允许应用程序将打印数据转码为不同的格式,第三方也可以通过Service Provider Interface (SPI)动态安装他们自己的打印服务。Java平台打印的历史JDK 1.3为了使用户的应用程序能够指定打印工作的参数和页面属性,JDK 1.3向AWT引入了JobAttributes和PageAttributes类。两个API支持基本的页面绘制,作为打印子系统的一部分,它会表示和格式
5、化一个页面。虽然用户可以从打印对话框中选择打印机并使用JobAttributes和PageAttribtes来设定打印属性,但无论是AWT还是Java 2D打印API都不支持基于打印功能寻找打印机,而这对于任何一个打印系统都是必不可少的组成部分。要了解更多关于Java平台打印的历史请参看Printing Help for Java Developers。JDK 1.2JDK 1.2为Java平台添加了java.awt.print包,它允许应用程序打印所有的Java 2D图像,包括2D图表、文本和图片。JDK 1.1Java Development Kit版本1.1首次为Java平台引入了对基本
6、打印功能的支持。JDK 1.1打印API为开发者提供了一个基本的框架用于从客户应用程序中打印用户接口上下文。JDK 1.1打印API,也叫做AWT Printing API,是围绕java.awt.PrintJob类来设计的,它封装了一个打印请求。PrintJob类创建一个Graphics的子类,它实现了对页面的渲染调用和绘制。Java Print Service API能做什么Java Print Service API解决了当前Java Print API所不具备的关于客户端以及服务器端应用程序中常见的打印需求,统一和扩展了Java平台的打印能力。除了支持现有的Java 2D打印功能之外,
7、Java Print Service还新增了许多新特性,包括:· 客户端和服务器端应用程序都可以自主寻找、选择打印设备,并指定打印工作的各种属性。这样,JPS就提供了打印子系统中一直缺失的部分:可编程的打印设备搜索。· 标准IPP属性的实现被作为一级类对象包含在了JPS API中。· 应用程序可以扩展包括在JPS API中的属性。· 第三方可以通过Service Provider Interface接口添加自己的打印服务。Java Print Service 构架Java print service API 包含四个包,分别是:javax.printja
8、vax.print.attributejavax.print.attribute.standardjavax.print.eventjavax.print包javax.print包是API的主包,其中包含的类和接口能够让你:· 发现打印服务(Print Services)· 指定打印数据的格式· 从一个打印服务创建打印工作(print jobs)· 向一个打印设备或者数据流发送打印数据发现打印服务应用程序通过调用虚拟类PrintServiceLookup的静态方法来定位能够满足应用程序打印需求的打印服务。例如,需要双面打印一个文档,应用程序就必须首先找到
9、具备双面打印能力的打印设备。PrintServiceLookup返回的某个PrintService接口的实现类代表一个真实的打印设备。PrintService接口具有众多能够返回打印服务所支持的属性的方法,通过调用其中的一个便可以确定这个PrintService对象所具备的功能。在打印及流化文档章节的定位服务小节对PrintService类和PrintServiceLookup类进行了讨论。JDK自带的PrintServiceLookup实现类能够定位标准平台下的打印设备。如果需要定位其他类型的打印设备,如IPP打印机或JINI打印机,则打印服务的提供者可以重新编写PrintServiceLo
10、okup类的实现。打印服务提供者可以使用SPI JAR文件规范来动态安装自定义的PrintServiceLookup实现。除了向一台打印设备发送数据,应用程序还可以使用StreamPrintService对象将数据打印到一个输出流中,这就使得应用程序能够将打印数据转换为不同的格式。为了获得一个StreamPrintService对象,应用程序需要使用虚拟类StreamPrintServiceFactory提供的查找方法,这与PrintServiceLookup类发现打印服务的办法类似。在打印及流化文档章节中讲述了如何使用StreamPrintServiceFactory类和StreamPrin
11、tService类。StreamPrintService对象还可以被用于向输出流发送2D图像数据,这在打印及流化2D图像章节中有详细的说明。指定打印数据格式DocFlavor类代表了打印数据的格式,如JPEG或PostScript。一个DocFlavor对象包括了一个MIME类型,它用于描述格式和代表该格式的表示类名,如java.io.InputStream,它指明了如何将文件发送给打印服务。为了方便起见,JPS API已经预定义了一些代表通用数据格式的DocFlavor对象。在指定文档类型 章节中讲述了关于如何使用DocFlavor对象的细节。创建打印工作当一个适合的打印服务被找到,应用程序
12、就会从中创建一个打印工作,打印工作由DocPrintJob类对象来表示,该对象提供了实际的打印方法。在呼叫打印之前,应用程序会创建一个Doc对象,该对象用来封装打印数据以及打印要求的属性,这些属性被定义在包javax.print.attribute和包javax.print.attribute.standard中。打印及流化文档章节中讲述了如何使用Doc类和DocPrintJob类。通过JPS,应用程序既可以使用PrinterJob类也可以使用DocPrintJob类来打印2D图像。打印及流化2D图像章节对此进行了讨论。javax.print.attribute包和javax.print.at
13、tribute.standard包定义了打印属性。它们描述了打印服务的功能、文档的特性、操作文档或整个打印工作的指令、以及打印工作或打印设备的状态。javax.print.attribute包描述了属性的类型以及它们如何被归类于集合之中。Attribute接口是所有打印属性的父接口。javax.print.attribute包所包含的类和接口定义了五种不同类型的属性,其中每一种描述了一个打印服务所具备的功能。例如,PrintRequestAttribute接口定义了用户用来描述打印工作特性的一些属性,如打印成几份等。javax.print.attribute.standard包中列举了API所
14、支持的所有的标准属性,其中大部分是IPP规范所规定的属性。属性章节讨论了关于属性API的更多细节。javax.print.event包javax.print.event包内包括了允许应用程序在打印工作和打印服务上注册事件的类。要获得关于注册打印工作事件的详细信息,请阅读注册事件小节。应用程序如何使用JPS应用程序使用JPS API操作打印请求的典型方法包括以下几步:· 获得一个适合的DocFlavor,它是定义打印数据格式的类。· 创建并填写AttributeSet,它封装了描述打印服务功能的属性集,如打印5份,装订,以及双面打印。· 查找一个能够处理由DocFl
15、avor和属性集指定的打印请求的打印服务。· 在该打印服务上创建一个打印工作。· 调用打印工作的print方法。以上步骤,应用程序会根据打印对象和打印方式的不同进行不同的操作。应用程序也可以向一个打印设备或输出流发送打印数据。打印数据可以是文本文档或图形,也可以是封装了2D图像的Java对象。如果打印数据是2D图像,则打印工作既可以由DocPrintJob表示,也可以由PrinterJob表示。如果打印数据是文本文档,那就必须使用DocPrintJob。打印方法和打印数据格式共同决定了如何从六种打印机制中选择一种:· 使用DocPrintJob与PrintServ
16、ice的实例,通过打印设备打印文档。· 使用DocPrintJob与StreamPrintService,将一个文档放入输出流中。· 使用DocPrintJob与PrintService的实例,通过打印设备打印2D图像。· 使用DocPrintJob与StreamPrintService,将一个2D图像放入输出流中。· 使用java.awt.print.PrinterJob,将一个2D图像打印到PrintService中。· 使用java.awt.print.PrinterJob,将一个2D图像发送到StreamPrintService中。属性
17、章节和指定文档类型章节讲述了如何创建一个属性集以及如何指定文档类型去使用以上六种打印机制的任意一种。打印及流化文档章节讨论了使用DocPrintJob打印和流化一个文档。打印及流化2D图像章节则讲解了如何同时使用DocPrintJob 和PrinterJob打印和流化2D图像。一个基本的例子大部分使用Java Print Service API的应用程序都是希望直接将文档发送给打印机,下面的例子实现了这种功能:/ Input the fileFileInputStream textStream; try textStream = new FileInputStream("file.T
18、XT"); catch (FileNotFoundException ffne) if (textStream = null) return;/ Set the document typeDocFlavor myFormat = DocFlavor.INPUT_STREAM.TEXT_PLAIN_ASCII;/ Create a DocDoc myDoc = new SimpleDoc(textStream, myFormat, null); / Build a set of attributesPrintRequestAttributeSet aset = new HashPrin
19、tRequestAttributeSet(); aset.add(new Copies(5); aset.add(MediaSize.ISO.A4);aset.add(Sides.DUPLEX); / discover the printers that can print the format according to the/ instructions in the attribute setPrintService services = PrintServiceLookup.lookupPrintServices(myFormat, aset);/ Create a print job
20、from one of the print servicesif (services.length > 0) DocPrintJob job = services0.createPrintJob();try job.print(myDoc, aset); catch (PrintException pe) 尽管这个例子仅仅演示了打印的六种方法中的一种,但其他几种打印机制也是以类似的办法来工作。这篇说明的其余部分将更加详细地讨论打印操作的每一个细节以及全部的打印机制。第二章 属性当一个用户向打印机发送打印数据时,他还需要提供如何打印数据的指令,如:使用何种媒介(纸)、打印多少份。用户可以使
21、用Java Print Service API的属性定义来设定这些操作指令。Java Print Service API包含了两个定义属性的包:javax.print.attribute和javax.print.attribute.standard。javax.print.attribute包中包含了用于描述属性类型以及如何将这些属性放置到集合中的接口和类。而javax.print.attribute.standard包中则列举了API中所有的标准属性。JPS API中大部分的属性定义都是由IETF的Internet Printing Protocol (IPP)规范定义的标准或扩展的实现。本
22、章节详细讲述了JPS API中的属性定义。属性的类别和值小节解释了符合JPS要求的属性是什么样子的,属性角色小节讲述了属性的类型,属性集小节讲述了如何将属性整合为属性集,标准属性小节讲述了javax.print.attribute.standard包中的一些较为常用的属性。属性的类别和值每台打印机都具有一系列的功能,如:在不同尺寸的纸张上打印的能力或多份打印的能力。每种功能又具有一系列的值。例如:一台打印机设置打印取向的功能可能具有这种形式:LANDSCAPE(横屏),PORTRAIT(竖屏)。对每一个打印请求而言,从这些可能的值中选定一个就能实现这些功能。Java Pint Service
23、API用一个术语“属性类别(attribute category)”来代指打印机的功能,如“打印取向”;用另一个术语“属性值(attribute value)”来代指功能的值,如“LANDSCAPE”。在Java Print Service API中,用一个实现了Attribute接口的Java类来表示属性类别,属性值则是该类或其子类的实例。例如,需要完成一个打印5份的打印工作,那么应用程序就应当用数值5来构建一个Copies类的对象,然后使用这个对象去设定打印工作。其中Copies类代表了属性类别,而Copies类的对象则代表了具体的属性值。由于属性值被封装在一个Java对象中,因此属性值对
24、象本身就可以代表属性类别,因此,简化起见,通常情况下也可以用属性值来表示属性。属性类别和值构成了一个“关键字值”数据对,你可以将这个数据对与其他属性一起加入到属性集中。查看属性集小节可以获得更多信息。Attribute接口中只定义了两个方法:getName和getCategory。getName方法返回一个String对象作为类别的名称。getCategory方法返回首先实现该属性类别的类。为了确保一个特定的类别的所有实现都具有相同的名称和类,它(即首先实现接口的类)的子类不应当覆盖getName 和getCategory方法。为了确定一台打印机支持什么样的属性类别和值,你需要使用PrintS
25、ervice接口中定义的query方法。一个打印请求不需要为目标打印机支持的所有属性类别指定值,因为每个支持的属性类别都会有它自己的默认值。例如,一台打印机可能会支持多达999份的打印工作,但它通常会采用默认值即只打印1份。属性角色当向一台打印机提交一个打印工作时,用户还需要提供用于描述打印数据特征的属性,如文档名称、打印数据、以何种方式打印(双面打印、打印5份等)。若一个打印工作由好几块打印数据组成,则不同的数据块应当拥有不同的操作指令,如第一份文档以8×11英寸的媒介打印、其他的文档以11×17英寸媒介打印。一旦打印机接受了打印工作,该工作有关的其他信息就会被激活,这些
26、信息可能包括:工作状态(如已完成、排队中)、目前已经打印的页数等。这些信息同样也是属性。甚至打印机本身也可以用属性来描述,如:打印机的名称、打印机的位置、等待队列中的工作数等。Java Print Service API用五种Attribute的子接口来定义这些不同种类的属性角色:· PrintRequestAttribute被一个应用程序用来代表应用于整个打印工作的设置和指明整个打印工作应当如何运行。· DocAttribute被应用程序用来代表一个单一的文档和应用于该文档的设置。· PrintJobAttribute被打印服务用来报告一个打印工作如何被执行。它
27、的值通常与打印请求的属性值相同,但若打印机不支持打印请求的属性值时,响应的打印工作会包含打印机所支持的属性值。此时这个值就不同于打印请求的值了。· PrintServiceAttribute被一个打印服务用于报告它自己的状态。· SupportedValuesAttribute被打印服务用来标识一个请求属性所支持的数值范围。例如,一台打印机可能只支持一个固定的打印份数。当一个打印服务被查询它的打印份数范围时,它会返回一个CopiesSupported对象,该对象包含了关于打印份数范围的信息,它是SupportedValuesAttribute的一个实现类。许多属性可能是多个
28、属性角色的成员,例如Media属性就属于文档、打印工作和打印服务角色,因为该属性可以描述纸张尺寸、进纸匣或纸张类型。实际上,大多数的文档角色同时也是请求角色,而所有的请求角色都是工作角色。下一部分讲述了如何将属性整合为属性集,其中也包含属性角色的内容。属性集提交打印工作时,用户往往需要提供多于一条的操作指令。如用户可能需要同时指明使用A4纸和横向打印。为了向打印机传送多于一条的操作指令,用户需要将多条属性整合并以一个属性集来发送。在Java Print Service API中,属性集以AttributeSet接口表示。AttributeSet接口与java.util.Map接口相似:它提供了
29、一个从关键字到值的映射表,其中每一个关键字都是唯一的,并对应不多于一个的值。不同的是,AttributeSet接口是专门为了支持Java Print Service API的需要而设计的,它被要求满足以下条件:· AttributeSet中的每一个关键字对应一个属性类别,它的值只能在该关键字所表示的属性类别可能的取值范围中选取。因此,与Map接口不同,AttributeSet限制了关键字的取值范围,因为一个属性类别不允许被赋予它所不具备的属性值。· 只有实现了Attribute接口的的属性才允许被加入到属性集中。· 属性集中一个属性类别只能以一个属性的身份加入。例
30、如,若属性集中已经包含了属性Media,那么再向属性集添加其他的Media属性就会覆盖之前的Media。与单独的属性类似,属性集也有角色。属性集角色由AttributeSet的子接口定义,这与属性角色小节所讲的由Attribute的子接口表示属性角色相类似。AttributeSet的子接口有:PrintRequestAttributeSet,PrintJobAttributeSet,DocAttributeSet和PrintServiceAttributeSet。属性集的角色决定了它所包含的属性的类型:一个打印请求属性集只能够包含打印请求属性。Java Print Service API包含了
31、HashAttributeSet,它是实现了AttributeSet接口的一个实体类,当然开发者也可以提供各自对AttributeSet接口的实现类。应用程序常常会使用HashAttributeSet类的子类而不是使用它本身,这些子类有:HashPrintRequestAttributeSet,HashPrintJobAttributeSet,HashDocumentAttributeSet和HashPrintServiceAttributeSet。这些子类实现了相对应的AttributeSet的子接口。例如:PrintRequestAttributeSet继承了AttributeSet,Ha
32、shPrintRequestAttributeSet则是实现了PrintRequestAttributeSet的一个实体类。使用HashPrintRequestAttributeSet或任何实现了PrintRequestAttributeSet接口的类所创建的属性集都只能包含请求属性。与它的子类不同,HashAttributeSet可以包含任何类型的属性。因此当一个应用程序需要使用两种类型以上的属性时,它只能够直接使用HashAttributeSet。通过PrintService的getUnsupportedAttibutes方法返回属性集就是这样一个例子。因为不支持的属性有可能属于不同的属性
33、角色。至于单独的属性,应用程序通常会创建请求属性集,这是因为指明打印请求是打印应用程序的基本功能。使用HashPrintRequestAttributeSet类的一个构造方法创建一个请求属性的指令是:PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();下一部分将讲述一些可以添加到属性集中的常用的属性。如何指定属性无论是打印还是流化数据,都是以同样的方法指定属性。通常PrintRequestAttributeSet的使用频率远高于其他属性,这是因为打印请求属性是为整个打印工作进行设置。又因为大多数情况下都需要为一个
34、打印工作设置多于一个属性,因此需要创建一个属性集。下面的示例创建了一个PrintRequestAttributeSet,它规定服务在A4纸上以双面打印的形式打印5份。PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(new Copies(5); aset.add(MediaSize.ISO_A4); aset.add(Sides.DUPLEX); 属性集创建后,应当与DocFlavor一起传送给打印工作的print方法。指定文档类型讨论如何使用DocFlavor。打印及流化文档章节讨论了如何打
35、印。下一小节则对一些较常用的属性进行更详细的解释。标准属性javax.print.attribute.standard包列举了Java Print Service API中的所有标准属性。其中的大部分都来源于IETF的Internet Printing Protocol (IPP) 1.1规范。这就是说,javax.print.attribute.standard包中每一个与IPP兼容的属性类都对应一个IPP属性类型,并且这个类的name属性(通过getName方法返回)也同IPP类型的名字一致。在Java命名规则允许的范围内,属性类本身的名字通常也会尽可能地反映出IPP类型的名字。另外,属性
36、类的值也同IPP一致。API规范中已经归档了每一个属性类的IPP兼容性。OrientationRequestedOrientationRequested属性类允许你指定图像或文档的打印取向。可能的属性值有:PORTRAIT(竖屏),LANDSCAPE(横屏),REVERSE_PORTRAIT(反向竖屏),REVERSE_LANDSCAPE(反向横屏)。OrientationRequested.PORTRAIT通常是默认值。这条代码演示了如何向属性集添加一个OrientationRequested属性:aset.add(OrientationRequested.REVERSE_PORTRAIT)
37、;OrientationRequested对象是一个类型安全的枚举类,其中封装着String值,每个值对应着一种可能的打印取向。这些值同时也是IPP的关键字。一些预格式化的文档类型,如“Postscript”,有可能不支持这个属性类。这是因为预格式化的文档类嵌入了打印机语言的指令,这些指令只能被打印机解释,并优先于客户的请求。用户可以通过调用下列指令来获取一个打印服务所支持的所有打印取向:PrintService.getSupportedAttributeValues(OrientationRequested.class, .)这个方法会返回一个以OrientationRequested所支持
38、的数值为元素的数组。CopiesCopies属性类允许你指定打印的拷贝份数。Copies类中封装了一个整数,用于表示请求的打印份数。下列代码演示了如何将一个Copies属性设置为打印5份,并将这个属性添加到属性集:aset.add(new Copies(5);通过调用下列代码,用户可以发现打印服务所支持的打印份数的范围:PrintService.getSupportedAttributeValues(Copies.class, .) 这个方法返回CopiesSupported对象,它封装了一系列整数值,这些整数值代表了服务能够处理的打印份数。与Copies对象不同,调用CopiesSuppor
39、ted对象的getSupportedAttributeValues方法总是会返回null,这是因为CopiesSupported对象没有实现PrintRequestAttribute接口,因此用户也不可以在打印请求中指定CopiesSupported属性。下列代码段演示了如何询问打印服务是否支持打印5份并将一个值为5的Copies属性添加到属性集:CopiesSupported copSupp = (CopiesSupported)service.getSupportedAttributeValues(Copies.class, null, null);if (copSupp != null
40、&& copSupp.contains(5) requestAttrSet.add(new Copies(5); else .MediaMedia是IPP属性中对用于打印的媒介的定义。Media属性是一个相对复杂但却需要重点理解的属性。Java Print Service API为抽象类Media定义了三个子类,以对应IPP规范中对Media属性的三个重载:MediaSizeName,MediaName,MediaTray。所有的Media子类都具有Media类型,他们可以为Meida定义不同的标准属性值。例如,MediaTray对象可以为Meida属性指定值MANUAL以表明
41、文档必须由打印机的手动进纸匣进行打印。下列代码演示了如何将一个Media属性值添加到属性集:aset.add(MediaTray.MANUAL);Media属性的值总是一个字符串,但由于属性的重载,它的值就决定了属性所代表的Media类型。例如,IPP预定义的属性值的集合中包含了“a4”和“top-tray”,如果值被设定为“a4”那么Media属性指的就是纸张的尺寸;如果被指定为“top-tray”,那么Media属性指的就是纸张的来源。因为字符串属性值可以代表不同类型的媒介,一个应用程序就可以扩展属性集来包括诸如“company-letterhead”或“yellow letter pap
42、er”这样的属性。当然,以这种方式扩展Media属性,应用程序必须首先找到打印服务所设定使用的媒介。大多数情况下,应用程序会同时使用MediaSizeName和MediaTray。MediaSizeName列举了所有支持的尺寸。MediaTray列举了打印机的进纸匣,它通常包括一个主要进纸匣和一个手动进纸匣。IPP 1.1规范没有提供同时指定媒介尺寸和媒介来源的属性,举例来说一个应用程序不能要求从手动进纸匣以A4纸进行打印。IPP规范的未来版本或许会提供同时设定多种媒介属性的方法,届时JPS API也很可能会进行升级以适应其变化。JPS API额外包含了两个不属于IPP的与打印媒介相关的属性:
43、MediaSize和MediaPrintableArea。MediaSizeMediaSize不是一个请求属性,它列举了MediaSizeName实例与纸张尺寸之间的映射关系。通常每一个MediaSizeName实例都会有一个相关联的MeidaSize对象,通过它用户就可以获得MediaSizeName所定义的纸张尺寸。确定MediaSizeName实例的尺寸,应当调用:MediaSize size = MediaSizeName.getMediaSizeForName(paper);MediaPrintableArea在一个打印请求中,MediaPrintableArea会与一个兼容的Med
44、ia共同使用,以确定纸张的打印区域。打印机硬件通常会定义页面的可打印区域,并且这个区域很少会填满整个页面。因此用户需要确定一个特定尺寸的媒介的可打印范围,以确保打印数据能够完全包容于打印区域。例如,为了确定5”×7”纸支持的打印范围,应用程序需要确定这个尺寸的纸张所对应的媒介尺寸的数值,然后使用该数值查询打印服务:PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(MediaSizeName.NA_5X7);MediaPrintableArea printableArea = (Med
45、iaPrintableArea)service. getSupportedAttributeValues(MediaPrintableArea.class, null, aset);返回值表示打印机对于该尺寸纸张所支持的最大打印范围。DestinationDestination属性允许你将打印数据重新定向到文件而不是发送给打印设备。在用户对话框中常常会看到“print-to-file”选项。由于假脱机数据并不总能进行重定向,因为它可能依赖设备特定的光栅来进行解释。因此,Java Print Service API要求用户查询打印服务以确定它是否支持重定向到文件。打印服务可能不支持所有的类型,或
46、者仅支持其中某一个属性值。例如,虽然JPS API能够被用于网络环境,在这种环境下打印数据的格式化不会在主计算机端发生,由于打印服务格式化的数据可能不被客户端计算机系统所接受,此时就可能无法为输出指定一个本地文件。Destination使用一个URL作为目的地的值,它允许一台网络打印以诸如FTP之类的协议上载格式化的打印数据。支持这个属性的多数打印机将会作为本地环境的一部分运行,并且允许使用“file:”协议的URL。下列代码表示重定向到C盘的一个名叫out.prn的文件:aset.add(new Destination("file:c:out.prn");SheetCol
47、lateSheetCollate属性允许你在打印超过一份的多页面文档时设定是否需要校对。例如,3页、2份已校对的工作会按照(1、2、3、1、2、3)的顺序打印,但若将同样的文档设定为2份未校对的工作则会按照(1、1、2、2、3、3)的顺序打印。这个属性并不在IPP 1.1规范之中,但它非常实用因此绝大多数打印机都支持。下列代码演示了如何设定一个已校对工作:aset.add(SheetCollate.COLLATED);Sides一些打印机(特别是高端打印机)能够进行双面打印。Sides属性允许应用程序设定双面打印以替换通常默认的单面打印。双面打印有时被称为“duplex”或“tumble”。这
48、两个值的输出取向不同。Java Print Service API中将duplex指定为“长边双面打印”、将tumble指定为“短边双面打印”。有关Sides更多的解释请直接阅读API规范。下列代码演示了将一个文档指定为双面打印:aset.add(Sides.DUPLEX);FidelityFdelity属性是一个IPP布尔属性,它表示当打印服务不支持打印请求中的某个设定的属性时是否需要退回打印工作。Fidelity并不是每个开发人员都需要关注的属性,但在JPS API中它却占有相当重要的位置。默认属性值为FIDELITY_FALSE,它表示当打印服务不支持打印请求设定的属性时无需退回打印工作
49、。例如,若一个应用程序指明打印取向为反向横屏,但打印机却不支持反向横屏时,若fidelity的值为true则退回打印工作;反之,若fidelity的值为false时,则打印机可能会使用一个近似的替代选项,如横屏来执行打印。Fidelity属性允许应用程序决定是严格地以设定的方式打印文档还是不管打印机是否完全支持设定值都执行打印。下列代码演示了一个在打印机不支持请求属性时需要退回的打印工作:aset.add(Fidelity.FIDELITY_TRUE);在fidelity十分必要的情况下,Java Print Service API为应用程序提供了许多查询工具,这些工具可以查询某个打印请求是否
50、被打印服务支持。详情请参看PrintService接口的各种query方法。使用JPS属性与之前的Java打印API不同的是,Java Print Service属性既可以被程序使用也可以被用户对话框使用。应用程序可以进行有限的设定并由用户在用户对话框中对选项进行检查。JPS属性设计时就是可扩展的。一个AttributeSet可以包含任何正确实现了Attribute接口的对象,就是说标准属性集可以被改写并且能够与后来版本的JDK兼容,并且可以通过两种方法来实现打印属性的扩展:· 使用标准属性的子类来支持扩展类型所需要的值。· 创建一个新的属性类型。通过用户对话框演示属性的使
51、用需要提供一个用户接口,这超出了本文讨论的范围。同样,扩展JPS属性也是打印服务提供者应该完成的工作,因此在这个版本的使用说明中没有包含这样的例子。不过,Print a Document章节解释了一个简单的打印应用程序,里面覆盖了本章所描述的关于使用JPS属性的一些基础。第三章 指定文档类型按照用户的预期,一个可打印的文档应当具有多种形式,包括:PDF文件、数码相机拍摄的图片、电子邮件、word文档、网页。因此在打印一个特定格式的文档前,用户需要确保打印机能够理解这个格式。有时一台打印机能够直接打印给定格式的文档:照片打印机可以直接打印各种格式的照片、PostScript打印机能够直接打印一个
52、PostScript文档。不过,只有极少数打印机能够直接打印格式如此众多的文档。大多数的打印机需要高端软件的支持来将源文档翻译为打印机可以打印的格式。一个打印API需要提供一个描述文档类型的办法,以便:· 打印机可以报告哪些格式允许打印。· 用户可以描述需要打印的数据的格式。· 用户可以描述文本数据的编码。Java Print Service API使用DocFlavor类描述文档类型。DocFlavor由以下部分构成:· 一个MIME类型用于告知打印机如何翻译数据。· 一个表示类名,它所代笔的Java类描述了如何将数据发送给打印机。例如向打印
53、服务描述一个HTML页面,用户可能会选择使用DocFlavor,并设定MIME类型字符串“text/html; charset=utf-16”和表示类名“java.io.InputStream”。用户可以通过下列两种方法中的一种来获得这个DocFlaovr:· 构造一个DocFlavor:DocFlavor htmlStreamFlavor = new DocFlavor(“text/html;charset=utf-16”,“java.io.InputStream”);· 使用预定义的DocFlavor实例来表示:DocFlavor.INPUT_STREAM TEXT_H
54、TML_UTF_16为了方便使用,Java Print Service API为常用的文档类型提供了一套预定义的实例。因为HTML网页包括文本数据,因此MIME类型字符串中包含了编码信息,示例中的charset=utf-16就是。用户有责任向打印服务精确描述打印数据。用户格式打印数据章节中介绍了如何正确的构造一个DocFlavor来完成这项工作。若MIME类型中没有包含文本编码的信息就可能发生不可预期的结果,这在字符编码的重要性章节中有详细的讲解。如果客户端提供的是一个Java对象,就可以由打印服务自行决定数据格式。在服务格式打印数据章节中介绍了怎样使用DocFlaovr表示这种自定义格式的打
55、印数据。请注意,虽然DocFlavor API预定义了文档类型,但仅凭这一点并不意味着就可以使用该类型的实现了。例如,虽然你使用了DocFlavor预定义实例来表示UTF-16编码下的HTML文本,但若你的打印服务不支持打印HTML,你依然无法打印该网页。再强调一次,确保打印机支持确定的数据格式是用户的责任。用户格式打印数据用户使用DocFlavor来描述打印数据的格式并标明该数据将如何被传递给打印服务。MIME类型指定了数据格式。表示类名指定了数据的传递方式。对于常用的表示类名,DocFlavor类中都有一个内部类与之对应。每个内部类包含了一系列DocFlavor对象,这些对象常量代表了使用
56、该类可以被传递的数据格式。例如,一个输入流能够流化各种打印数据格式,包括GIF它由DocFlavor.INPUT_STREAM.GIF表示,PostScrit由DocFlavor.INPUT_STREAM.POSTSCRIPT表示。如果其中一个DocFlavor对象常量能够准确地表述给定打印数据的格式,用户就可以使用这个对象常量来代替自己构造DocFlavor的办法。如果JPS API中并没有合适的DocFlavor可用,用户就可以通过自己构造来创建一个DocFlavor。用户可以使用MIME类型和表示类名来构造DocFlavor,在接下来的两个部分将就此进行讲解。预定义数据格式的MIME类型
57、有四种数据最常被操作:文本数据、页面描述语言文档、图像数据和自适应打印数据。本节将详细解释每一种数据并将它们的MIME类型列表展示。文本数据预格式化的文本数据通常放在一个面向字符的表示类中,如一个字符数组、字符串、Reader,当然也有可能是一个面向字节的表示类,如字节数组、输入流或URL。纯文本和HTML是最常见的文本数据格式。构造DocFlavor时,你可以使用下列MIME类型的字符串来表示这些数据格式:MIME 类型数据格式"text/plain"纯文本,使用默认字符集US-ASCII"text/plain;charset=xxx"纯文本,使用指定字符集xxx"text/html"超文本标记语言,使用默认字符集US-ASCII"text/html;charset=xxx"超文本标记语言,使用指定字符集xxx页面描述语言文档预格式化的页面描述语言(PDL)文档的操作通常放在一个面向字节的表示类中,如字节数组、InputStream输入流或URL。构造DocFlavor时可以使用下列MIME类型的字符串表示该数据格式:MIME 类型数据格式"a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高温度行车安全知识培训课件
- 电池pack培训知识课件
- 男孩与霸王鱼读后感800字(12篇)
- 工程项目管理工具包进度与成本控制双重管理
- 智慧化税费申报与管理(微课版)项目五个人所得税 巩固练习及答案
- 2025企业采购合同范本
- 2025规定:终止病假员工合同需在医疗期结束之后
- 2025采购招标合同协议书样本
- 2025房屋买卖合同定金协议书范本
- 合作社养殖技术与信息共享合作协议
- 国际贸易理论与实务ppt课件(完整版)
- GB∕T 6546-2021 瓦楞纸板边压强度的测定
- 历史选择性必修1 国家制度与社会治理(思考点学思之窗问题探究)参考答案
- 学前儿童发展心理学(第3版-张永红)教学课件1754
- 中职《机械基础》全套课件(完整版)
- 保监会保险机构高级管理人员任职资格考试题库(附标准规范答案)
- 部编人教版九年级语文上册教学计划及教学进度表
- 干法——稻盛和夫
- 抗裂砂浆检测报告
- 案例华为人才盘点
- 城市垃圾焚烧发电处理讲解
评论
0/150
提交评论