JavaPrintService_Java打印API_用戶手冊_中文版_第1頁
JavaPrintService_Java打印API_用戶手冊_中文版_第2頁
JavaPrintService_Java打印API_用戶手冊_中文版_第3頁
JavaPrintService_Java打印API_用戶手冊_中文版_第4頁
JavaPrintService_Java打印API_用戶手冊_中文版_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄第一章 介紹Java平臺打印的歷史JDK 1.3JDK 1.2JDK 1.1Java Print Service API能做什么Java Print Service 構架javax.print包發(fā)現(xiàn)打印服務指定打印數(shù)據(jù)格式創(chuàng)建打印工作javax.print.event包應用程序如何使用JPS一個基本的例子第二章 屬性屬性的類別和值屬性角色屬性集如何指定屬性標準屬性OrientationRequestedCopiesMediaMediaSizeMediaPrintableAreaDestinationSheetCollateSidesFidelity使用JPS屬性第三章 指定文檔類型用戶格

2、式打印數(shù)據(jù)預定義數(shù)據(jù)格式的MIME類型文本數(shù)據(jù)頁面描述語言文檔圖像數(shù)據(jù)自適應打印數(shù)據(jù)表示類字符編碼的重要性服務格式打印數(shù)據(jù)怎樣使用DocFlavor第四章 打印及流化文檔比較StreamPrintService與PrintService定位服務發(fā)現(xiàn)打印服務發(fā)現(xiàn)流打印服務獲得一個打印工作創(chuàng)建DOC注冊事件打印服務事件打印工作事件PrintJobAttributeListenerPrintJobListener提交打印工作向打印機提交打印工作向流提交打印工作打印服務提供商第五章 打印及流化2D圖像使用打印工作打印或流化圖像打印2D圖像流化2D圖像使用服務格式數(shù)據(jù)打印服務格式數(shù)據(jù)流化服務格式打印數(shù)據(jù)

3、示例:PrintPS.java示例:PrintGIFtoStream.java示例:Print2DPrinterJob.java示例:Print2DGraphics.java示例:Print2DtoStream.java示例:PrintGIF.javaJava Print Service 詞匯表第一章 介紹Java Print Service (JPS)是一個Java打印API,設計此API是為了支持在所有Java平臺上的打印工作包括微空間平臺,并且支持現(xiàn)有的API。這個統(tǒng)一的打印 API包括了IETF規(guī)范RFC 2911中Internet Printing Protocol (IPP) 1.

4、1 所指定的標準屬性以及在此基礎上的可擴展的打印屬性。通過這些屬性,客戶端和服務器端應用程序就能夠發(fā)現(xiàn)并選定具有完成屬性設置所指定的功能的打印機。除了API中包含的StreamPrintServece,它還允許應用程序將打印數(shù)據(jù)轉碼為不同的格式,第三方也可以通過Service Provider Interface (SPI)動態(tài)安裝他們自己的打印服務。Java平臺打印的歷史JDK 1.3為了使用戶的應用程序能夠指定打印工作的參數(shù)和頁面屬性,JDK 1.3向AWT引入了JobAttributes和PageAttributes類。兩個API支持基本的頁面繪制,作為打印子系統(tǒng)的一部分,它會表示和格式

5、化一個頁面。雖然用戶可以從打印對話框中選擇打印機并使用JobAttributes和PageAttribtes來設定打印屬性,但無論是AWT還是Java 2D打印API都不支持基于打印功能尋找打印機,而這對于任何一個打印系統(tǒng)都是必不可少的組成部分。要了解更多關于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為開發(fā)者提供了一個基本的框架用于從客戶應用程序中打印用戶接口上下文。JDK 1.1打印API,也叫做AWT Printing API,是圍繞java.awt.PrintJob類來設計的,它封裝了一個打印請求。PrintJob類創(chuàng)建一個Graphics的子類,它實現(xiàn)了對頁面的渲染調用和繪制。Java Print Service API能做什么Java Print Service API解決了當前Java Print API所不具備的關于客戶端以及服務器端應用程序中常見的打印需求,統(tǒng)一和擴展了Java平臺的打印能力。除了支持現(xiàn)有的Java 2D打印功能之外,

7、Java Print Service還新增了許多新特性,包括:· 客戶端和服務器端應用程序都可以自主尋找、選擇打印設備,并指定打印工作的各種屬性。這樣,JPS就提供了打印子系統(tǒng)中一直缺失的部分:可編程的打印設備搜索。· 標準IPP屬性的實現(xiàn)被作為一級類對象包含在了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的主包,其中包含的類和接口能夠讓你:· 發(fā)現(xiàn)打印服務(Print Services)· 指定打印數(shù)據(jù)的格式· 從一個打印服務創(chuàng)建打印工作(print jobs)· 向一個打印設備或者數(shù)據(jù)流發(fā)送打印數(shù)據(jù)發(fā)現(xiàn)打印服務應用程序通過調用虛擬類PrintServiceLookup的靜態(tài)方法來定位能夠滿足應用程序打印需求的打印服務。例如,需要雙面打印一個文檔,應用程序就必須首先找到

9、具備雙面打印能力的打印設備。PrintServiceLookup返回的某個PrintService接口的實現(xiàn)類代表一個真實的打印設備。PrintService接口具有眾多能夠返回打印服務所支持的屬性的方法,通過調用其中的一個便可以確定這個PrintService對象所具備的功能。在打印及流化文檔章節(jié)的定位服務小節(jié)對PrintService類和PrintServiceLookup類進行了討論。JDK自帶的PrintServiceLookup實現(xiàn)類能夠定位標準平臺下的打印設備。如果需要定位其他類型的打印設備,如IPP打印機或JINI打印機,則打印服務的提供者可以重新編寫PrintServiceLo

10、okup類的實現(xiàn)。打印服務提供者可以使用SPI JAR文件規(guī)范來動態(tài)安裝自定義的PrintServiceLookup實現(xiàn)。除了向一臺打印設備發(fā)送數(shù)據(jù),應用程序還可以使用StreamPrintService對象將數(shù)據(jù)打印到一個輸出流中,這就使得應用程序能夠將打印數(shù)據(jù)轉換為不同的格式。為了獲得一個StreamPrintService對象,應用程序需要使用虛擬類StreamPrintServiceFactory提供的查找方法,這與PrintServiceLookup類發(fā)現(xiàn)打印服務的辦法類似。在打印及流化文檔章節(jié)中講述了如何使用StreamPrintServiceFactory類和StreamPrin

11、tService類。StreamPrintService對象還可以被用于向輸出流發(fā)送2D圖像數(shù)據(jù),這在打印及流化2D圖像章節(jié)中有詳細的說明。指定打印數(shù)據(jù)格式DocFlavor類代表了打印數(shù)據(jù)的格式,如JPEG或PostScript。一個DocFlavor對象包括了一個MIME類型,它用于描述格式和代表該格式的表示類名,如java.io.InputStream,它指明了如何將文件發(fā)送給打印服務。為了方便起見,JPS API已經(jīng)預定義了一些代表通用數(shù)據(jù)格式的DocFlavor對象。在指定文檔類型 章節(jié)中講述了關于如何使用DocFlavor對象的細節(jié)。創(chuàng)建打印工作當一個適合的打印服務被找到,應用程序

12、就會從中創(chuàng)建一個打印工作,打印工作由DocPrintJob類對象來表示,該對象提供了實際的打印方法。在呼叫打印之前,應用程序會創(chuàng)建一個Doc對象,該對象用來封裝打印數(shù)據(jù)以及打印要求的屬性,這些屬性被定義在包javax.print.attribute和包javax.print.attribute.standard中。打印及流化文檔章節(jié)中講述了如何使用Doc類和DocPrintJob類。通過JPS,應用程序既可以使用PrinterJob類也可以使用DocPrintJob類來打印2D圖像。打印及流化2D圖像章節(jié)對此進行了討論。javax.print.attribute包和javax.print.at

13、tribute.standard包定義了打印屬性。它們描述了打印服務的功能、文檔的特性、操作文檔或整個打印工作的指令、以及打印工作或打印設備的狀態(tài)。javax.print.attribute包描述了屬性的類型以及它們如何被歸類于集合之中。Attribute接口是所有打印屬性的父接口。javax.print.attribute包所包含的類和接口定義了五種不同類型的屬性,其中每一種描述了一個打印服務所具備的功能。例如,PrintRequestAttribute接口定義了用戶用來描述打印工作特性的一些屬性,如打印成幾份等。javax.print.attribute.standard包中列舉了API所

14、支持的所有的標準屬性,其中大部分是IPP規(guī)范所規(guī)定的屬性。屬性章節(jié)討論了關于屬性API的更多細節(jié)。javax.print.event包javax.print.event包內包括了允許應用程序在打印工作和打印服務上注冊事件的類。要獲得關于注冊打印工作事件的詳細信息,請閱讀注冊事件小節(jié)。應用程序如何使用JPS應用程序使用JPS API操作打印請求的典型方法包括以下幾步:· 獲得一個適合的DocFlavor,它是定義打印數(shù)據(jù)格式的類。· 創(chuàng)建并填寫AttributeSet,它封裝了描述打印服務功能的屬性集,如打印5份,裝訂,以及雙面打印。· 查找一個能夠處理由DocFl

15、avor和屬性集指定的打印請求的打印服務。· 在該打印服務上創(chuàng)建一個打印工作。· 調用打印工作的print方法。以上步驟,應用程序會根據(jù)打印對象和打印方式的不同進行不同的操作。應用程序也可以向一個打印設備或輸出流發(fā)送打印數(shù)據(jù)。打印數(shù)據(jù)可以是文本文檔或圖形,也可以是封裝了2D圖像的Java對象。如果打印數(shù)據(jù)是2D圖像,則打印工作既可以由DocPrintJob表示,也可以由PrinterJob表示。如果打印數(shù)據(jù)是文本文檔,那就必須使用DocPrintJob。打印方法和打印數(shù)據(jù)格式共同決定了如何從六種打印機制中選擇一種:· 使用DocPrintJob與PrintServ

16、ice的實例,通過打印設備打印文檔。· 使用DocPrintJob與StreamPrintService,將一個文檔放入輸出流中。· 使用DocPrintJob與PrintService的實例,通過打印設備打印2D圖像。· 使用DocPrintJob與StreamPrintService,將一個2D圖像放入輸出流中。· 使用java.awt.print.PrinterJob,將一個2D圖像打印到PrintService中。· 使用java.awt.print.PrinterJob,將一個2D圖像發(fā)送到StreamPrintService中。屬性

17、章節(jié)和指定文檔類型章節(jié)講述了如何創(chuàng)建一個屬性集以及如何指定文檔類型去使用以上六種打印機制的任意一種。打印及流化文檔章節(jié)討論了使用DocPrintJob打印和流化一個文檔。打印及流化2D圖像章節(jié)則講解了如何同時使用DocPrintJob 和PrinterJob打印和流化2D圖像。一個基本的例子大部分使用Java Print Service API的應用程序都是希望直接將文檔發(fā)送給打印機,下面的例子實現(xiàn)了這種功能:/ 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) 盡管這個例子僅僅演示了打印的六種方法中的一種,但其他幾種打印機制也是以類似的辦法來工作。這篇說明的其余部分將更加詳細地討論打印操作的每一個細節(jié)以及全部的打印機制。第二章 屬性當一個用戶向打印機發(fā)送打印數(shù)據(jù)時,他還需要提供如何打印數(shù)據(jù)的指令,如:使用何種媒介(紙)、打印多少份。用戶可以使

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)規(guī)范定義的標準或擴展的實現(xiàn)。本

22、章節(jié)詳細講述了JPS API中的屬性定義。屬性的類別和值小節(jié)解釋了符合JPS要求的屬性是什么樣子的,屬性角色小節(jié)講述了屬性的類型,屬性集小節(jié)講述了如何將屬性整合為屬性集,標準屬性小節(jié)講述了javax.print.attribute.standard包中的一些較為常用的屬性。屬性的類別和值每臺打印機都具有一系列的功能,如:在不同尺寸的紙張上打印的能力或多份打印的能力。每種功能又具有一系列的值。例如:一臺打印機設置打印取向的功能可能具有這種形式:LANDSCAPE(橫屏),PORTRAIT(豎屏)。對每一個打印請求而言,從這些可能的值中選定一個就能實現(xiàn)這些功能。Java Pint Service

23、API用一個術語“屬性類別(attribute category)”來代指打印機的功能,如“打印取向”;用另一個術語“屬性值(attribute value)”來代指功能的值,如“LANDSCAPE”。在Java Print Service API中,用一個實現(xiàn)了Attribute接口的Java類來表示屬性類別,屬性值則是該類或其子類的實例。例如,需要完成一個打印5份的打印工作,那么應用程序就應當用數(shù)值5來構建一個Copies類的對象,然后使用這個對象去設定打印工作。其中Copies類代表了屬性類別,而Copies類的對象則代表了具體的屬性值。由于屬性值被封裝在一個Java對象中,因此屬性值對

24、象本身就可以代表屬性類別,因此,簡化起見,通常情況下也可以用屬性值來表示屬性。屬性類別和值構成了一個“關鍵字值”數(shù)據(jù)對,你可以將這個數(shù)據(jù)對與其他屬性一起加入到屬性集中。查看屬性集小節(jié)可以獲得更多信息。Attribute接口中只定義了兩個方法:getName和getCategory。getName方法返回一個String對象作為類別的名稱。getCategory方法返回首先實現(xiàn)該屬性類別的類。為了確保一個特定的類別的所有實現(xiàn)都具有相同的名稱和類,它(即首先實現(xiàn)接口的類)的子類不應當覆蓋getName 和getCategory方法。為了確定一臺打印機支持什么樣的屬性類別和值,你需要使用PrintS

25、ervice接口中定義的query方法。一個打印請求不需要為目標打印機支持的所有屬性類別指定值,因為每個支持的屬性類別都會有它自己的默認值。例如,一臺打印機可能會支持多達999份的打印工作,但它通常會采用默認值即只打印1份。屬性角色當向一臺打印機提交一個打印工作時,用戶還需要提供用于描述打印數(shù)據(jù)特征的屬性,如文檔名稱、打印數(shù)據(jù)、以何種方式打?。p面打印、打印5份等)。若一個打印工作由好幾塊打印數(shù)據(jù)組成,則不同的數(shù)據(jù)塊應當擁有不同的操作指令,如第一份文檔以8×11英寸的媒介打印、其他的文檔以11×17英寸媒介打印。一旦打印機接受了打印工作,該工作有關的其他信息就會被激活,這些

26、信息可能包括:工作狀態(tài)(如已完成、排隊中)、目前已經(jīng)打印的頁數(shù)等。這些信息同樣也是屬性。甚至打印機本身也可以用屬性來描述,如:打印機的名稱、打印機的位置、等待隊列中的工作數(shù)等。Java Print Service API用五種Attribute的子接口來定義這些不同種類的屬性角色:· PrintRequestAttribute被一個應用程序用來代表應用于整個打印工作的設置和指明整個打印工作應當如何運行。· DocAttribute被應用程序用來代表一個單一的文檔和應用于該文檔的設置。· PrintJobAttribute被打印服務用來報告一個打印工作如何被執(zhí)行。它

27、的值通常與打印請求的屬性值相同,但若打印機不支持打印請求的屬性值時,響應的打印工作會包含打印機所支持的屬性值。此時這個值就不同于打印請求的值了。· PrintServiceAttribute被一個打印服務用于報告它自己的狀態(tài)。· SupportedValuesAttribute被打印服務用來標識一個請求屬性所支持的數(shù)值范圍。例如,一臺打印機可能只支持一個固定的打印份數(shù)。當一個打印服務被查詢它的打印份數(shù)范圍時,它會返回一個CopiesSupported對象,該對象包含了關于打印份數(shù)范圍的信息,它是SupportedValuesAttribute的一個實現(xiàn)類。許多屬性可能是多個

28、屬性角色的成員,例如Media屬性就屬于文檔、打印工作和打印服務角色,因為該屬性可以描述紙張尺寸、進紙匣或紙張類型。實際上,大多數(shù)的文檔角色同時也是請求角色,而所有的請求角色都是工作角色。下一部分講述了如何將屬性整合為屬性集,其中也包含屬性角色的內容。屬性集提交打印工作時,用戶往往需要提供多于一條的操作指令。如用戶可能需要同時指明使用A4紙和橫向打印。為了向打印機傳送多于一條的操作指令,用戶需要將多條屬性整合并以一個屬性集來發(fā)送。在Java Print Service API中,屬性集以AttributeSet接口表示。AttributeSet接口與java.util.Map接口相似:它提供了

29、一個從關鍵字到值的映射表,其中每一個關鍵字都是唯一的,并對應不多于一個的值。不同的是,AttributeSet接口是專門為了支持Java Print Service API的需要而設計的,它被要求滿足以下條件:· AttributeSet中的每一個關鍵字對應一個屬性類別,它的值只能在該關鍵字所表示的屬性類別可能的取值范圍中選取。因此,與Map接口不同,AttributeSet限制了關鍵字的取值范圍,因為一個屬性類別不允許被賦予它所不具備的屬性值。· 只有實現(xiàn)了Attribute接口的的屬性才允許被加入到屬性集中。· 屬性集中一個屬性類別只能以一個屬性的身份加入。例

30、如,若屬性集中已經(jīng)包含了屬性Media,那么再向屬性集添加其他的Media屬性就會覆蓋之前的Media。與單獨的屬性類似,屬性集也有角色。屬性集角色由AttributeSet的子接口定義,這與屬性角色小節(jié)所講的由Attribute的子接口表示屬性角色相類似。AttributeSet的子接口有:PrintRequestAttributeSet,PrintJobAttributeSet,DocAttributeSet和PrintServiceAttributeSet。屬性集的角色決定了它所包含的屬性的類型:一個打印請求屬性集只能夠包含打印請求屬性。Java Print Service API包含了

31、HashAttributeSet,它是實現(xiàn)了AttributeSet接口的一個實體類,當然開發(fā)者也可以提供各自對AttributeSet接口的實現(xiàn)類。應用程序常常會使用HashAttributeSet類的子類而不是使用它本身,這些子類有:HashPrintRequestAttributeSet,HashPrintJobAttributeSet,HashDocumentAttributeSet和HashPrintServiceAttributeSet。這些子類實現(xiàn)了相對應的AttributeSet的子接口。例如:PrintRequestAttributeSet繼承了AttributeSet,Ha

32、shPrintRequestAttributeSet則是實現(xiàn)了PrintRequestAttributeSet的一個實體類。使用HashPrintRequestAttributeSet或任何實現(xiàn)了PrintRequestAttributeSet接口的類所創(chuàng)建的屬性集都只能包含請求屬性。與它的子類不同,HashAttributeSet可以包含任何類型的屬性。因此當一個應用程序需要使用兩種類型以上的屬性時,它只能夠直接使用HashAttributeSet。通過PrintService的getUnsupportedAttibutes方法返回屬性集就是這樣一個例子。因為不支持的屬性有可能屬于不同的屬性

33、角色。至于單獨的屬性,應用程序通常會創(chuàng)建請求屬性集,這是因為指明打印請求是打印應用程序的基本功能。使用HashPrintRequestAttributeSet類的一個構造方法創(chuàng)建一個請求屬性的指令是:PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();下一部分將講述一些可以添加到屬性集中的常用的屬性。如何指定屬性無論是打印還是流化數(shù)據(jù),都是以同樣的方法指定屬性。通常PrintRequestAttributeSet的使用頻率遠高于其他屬性,這是因為打印請求屬性是為整個打印工作進行設置。又因為大多數(shù)情況下都需要為一個

34、打印工作設置多于一個屬性,因此需要創(chuàng)建一個屬性集。下面的示例創(chuàng)建了一個PrintRequestAttributeSet,它規(guī)定服務在A4紙上以雙面打印的形式打印5份。PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(new Copies(5); aset.add(MediaSize.ISO_A4); aset.add(Sides.DUPLEX); 屬性集創(chuàng)建后,應當與DocFlavor一起傳送給打印工作的print方法。指定文檔類型討論如何使用DocFlavor。打印及流化文檔章節(jié)討論了如何打

35、印。下一小節(jié)則對一些較常用的屬性進行更詳細的解釋。標準屬性javax.print.attribute.standard包列舉了Java Print Service API中的所有標準屬性。其中的大部分都來源于IETF的Internet Printing Protocol (IPP) 1.1規(guī)范。這就是說,javax.print.attribute.standard包中每一個與IPP兼容的屬性類都對應一個IPP屬性類型,并且這個類的name屬性(通過getName方法返回)也同IPP類型的名字一致。在Java命名規(guī)則允許的范圍內,屬性類本身的名字通常也會盡可能地反映出IPP類型的名字。另外,屬性

36、類的值也同IPP一致。API規(guī)范中已經(jīng)歸檔了每一個屬性類的IPP兼容性。OrientationRequestedOrientationRequested屬性類允許你指定圖像或文檔的打印取向??赡艿膶傩灾涤校篜ORTRAIT(豎屏),LANDSCAPE(橫屏),REVERSE_PORTRAIT(反向豎屏),REVERSE_LANDSCAPE(反向橫屏)。OrientationRequested.PORTRAIT通常是默認值。這條代碼演示了如何向屬性集添加一個OrientationRequested屬性:aset.add(OrientationRequested.REVERSE_PORTRAIT)

37、;OrientationRequested對象是一個類型安全的枚舉類,其中封裝著String值,每個值對應著一種可能的打印取向。這些值同時也是IPP的關鍵字。一些預格式化的文檔類型,如“Postscript”,有可能不支持這個屬性類。這是因為預格式化的文檔類嵌入了打印機語言的指令,這些指令只能被打印機解釋,并優(yōu)先于客戶的請求。用戶可以通過調用下列指令來獲取一個打印服務所支持的所有打印取向:PrintService.getSupportedAttributeValues(OrientationRequested.class, .)這個方法會返回一個以OrientationRequested所支持

38、的數(shù)值為元素的數(shù)組。CopiesCopies屬性類允許你指定打印的拷貝份數(shù)。Copies類中封裝了一個整數(shù),用于表示請求的打印份數(shù)。下列代碼演示了如何將一個Copies屬性設置為打印5份,并將這個屬性添加到屬性集:aset.add(new Copies(5);通過調用下列代碼,用戶可以發(fā)現(xiàn)打印服務所支持的打印份數(shù)的范圍:PrintService.getSupportedAttributeValues(Copies.class, .) 這個方法返回CopiesSupported對象,它封裝了一系列整數(shù)值,這些整數(shù)值代表了服務能夠處理的打印份數(shù)。與Copies對象不同,調用CopiesSuppor

39、ted對象的getSupportedAttributeValues方法總是會返回null,這是因為CopiesSupported對象沒有實現(xiàn)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規(guī)范中對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屬性,應用程序必須首先找到打印服務所設定使用的媒介。大多數(shù)情況下,應用程序會同時使用MediaSizeName和MediaTray。MediaSizeName列舉了所有支持的尺寸。MediaTray列舉了打印機的進紙匣,它通常包括一個主要進紙匣和一個手動進紙匣。IPP 1.1規(guī)范沒有提供同時指定媒介尺寸和媒介來源的屬性,舉例來說一個應用程序不能要求從手動進紙匣以A4紙進行打印。IPP規(guī)范的未來版本或許會提供同時設定多種媒介屬性的方法,屆時JPS API也很可能會進行升級以適應其變化。JPS API額外包含了兩個不屬于IPP的與打印媒介相關的屬性:

43、MediaSize和MediaPrintableArea。MediaSizeMediaSize不是一個請求屬性,它列舉了MediaSizeName實例與紙張尺寸之間的映射關系。通常每一個MediaSizeName實例都會有一個相關聯(lián)的MeidaSize對象,通過它用戶就可以獲得MediaSizeName所定義的紙張尺寸。確定MediaSizeName實例的尺寸,應當調用:MediaSize size = MediaSizeName.getMediaSizeForName(paper);MediaPrintableArea在一個打印請求中,MediaPrintableArea會與一個兼容的Med

44、ia共同使用,以確定紙張的打印區(qū)域。打印機硬件通常會定義頁面的可打印區(qū)域,并且這個區(qū)域很少會填滿整個頁面。因此用戶需要確定一個特定尺寸的媒介的可打印范圍,以確保打印數(shù)據(jù)能夠完全包容于打印區(qū)域。例如,為了確定5”×7”紙支持的打印范圍,應用程序需要確定這個尺寸的紙張所對應的媒介尺寸的數(shù)值,然后使用該數(shù)值查詢打印服務:PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(MediaSizeName.NA_5X7);MediaPrintableArea printableArea = (Med

45、iaPrintableArea)service. getSupportedAttributeValues(MediaPrintableArea.class, null, aset);返回值表示打印機對于該尺寸紙張所支持的最大打印范圍。DestinationDestination屬性允許你將打印數(shù)據(jù)重新定向到文件而不是發(fā)送給打印設備。在用戶對話框中常常會看到“print-to-file”選項。由于假脫機數(shù)據(jù)并不總能進行重定向,因為它可能依賴設備特定的光柵來進行解釋。因此,Java Print Service API要求用戶查詢打印服務以確定它是否支持重定向到文件。打印服務可能不支持所有的類型,或

46、者僅支持其中某一個屬性值。例如,雖然JPS API能夠被用于網(wǎng)絡環(huán)境,在這種環(huán)境下打印數(shù)據(jù)的格式化不會在主計算機端發(fā)生,由于打印服務格式化的數(shù)據(jù)可能不被客戶端計算機系統(tǒng)所接受,此時就可能無法為輸出指定一個本地文件。Destination使用一個URL作為目的地的值,它允許一臺網(wǎng)絡打印以諸如FTP之類的協(xié)議上載格式化的打印數(shù)據(jù)。支持這個屬性的多數(shù)打印機將會作為本地環(huán)境的一部分運行,并且允許使用“file:”協(xié)議的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規(guī)范之中,但它非常實用因此絕大多數(shù)打印機都支持。下列代碼演示了如何設定一個已校對工作:aset.add(SheetCollate.COLLATED);Sides一些打印機(特別是高端打印機)能夠進行雙面打印。Sides屬性允許應用程序設定雙面打印以替換通常默認的單面打印。雙面打印有時被稱為“duplex”或“tumble”。這

48、兩個值的輸出取向不同。Java Print Service API中將duplex指定為“長邊雙面打印”、將tumble指定為“短邊雙面打印”。有關Sides更多的解釋請直接閱讀API規(guī)范。下列代碼演示了將一個文檔指定為雙面打?。篴set.add(Sides.DUPLEX);FidelityFdelity屬性是一個IPP布爾屬性,它表示當打印服務不支持打印請求中的某個設定的屬性時是否需要退回打印工作。Fidelity并不是每個開發(fā)人員都需要關注的屬性,但在JPS API中它卻占有相當重要的位置。默認屬性值為FIDELITY_FALSE,它表示當打印服務不支持打印請求設定的屬性時無需退回打印工作

49、。例如,若一個應用程序指明打印取向為反向橫屏,但打印機卻不支持反向橫屏時,若fidelity的值為true則退回打印工作;反之,若fidelity的值為false時,則打印機可能會使用一個近似的替代選項,如橫屏來執(zhí)行打印。Fidelity屬性允許應用程序決定是嚴格地以設定的方式打印文檔還是不管打印機是否完全支持設定值都執(zhí)行打印。下列代碼演示了一個在打印機不支持請求屬性時需要退回的打印工作:aset.add(Fidelity.FIDELITY_TRUE);在fidelity十分必要的情況下,Java Print Service API為應用程序提供了許多查詢工具,這些工具可以查詢某個打印請求是否

50、被打印服務支持。詳情請參看PrintService接口的各種query方法。使用JPS屬性與之前的Java打印API不同的是,Java Print Service屬性既可以被程序使用也可以被用戶對話框使用。應用程序可以進行有限的設定并由用戶在用戶對話框中對選項進行檢查。JPS屬性設計時就是可擴展的。一個AttributeSet可以包含任何正確實現(xiàn)了Attribute接口的對象,就是說標準屬性集可以被改寫并且能夠與后來版本的JDK兼容,并且可以通過兩種方法來實現(xiàn)打印屬性的擴展:· 使用標準屬性的子類來支持擴展類型所需要的值。· 創(chuàng)建一個新的屬性類型。通過用戶對話框演示屬性的使

51、用需要提供一個用戶接口,這超出了本文討論的范圍。同樣,擴展JPS屬性也是打印服務提供者應該完成的工作,因此在這個版本的使用說明中沒有包含這樣的例子。不過,Print a Document章節(jié)解釋了一個簡單的打印應用程序,里面覆蓋了本章所描述的關于使用JPS屬性的一些基礎。第三章 指定文檔類型按照用戶的預期,一個可打印的文檔應當具有多種形式,包括:PDF文件、數(shù)碼相機拍攝的圖片、電子郵件、word文檔、網(wǎng)頁。因此在打印一個特定格式的文檔前,用戶需要確保打印機能夠理解這個格式。有時一臺打印機能夠直接打印給定格式的文檔:照片打印機可以直接打印各種格式的照片、PostScript打印機能夠直接打印一個

52、PostScript文檔。不過,只有極少數(shù)打印機能夠直接打印格式如此眾多的文檔。大多數(shù)的打印機需要高端軟件的支持來將源文檔翻譯為打印機可以打印的格式。一個打印API需要提供一個描述文檔類型的辦法,以便:· 打印機可以報告哪些格式允許打印。· 用戶可以描述需要打印的數(shù)據(jù)的格式。· 用戶可以描述文本數(shù)據(jù)的編碼。Java Print Service API使用DocFlavor類描述文檔類型。DocFlavor由以下部分構成:· 一個MIME類型用于告知打印機如何翻譯數(shù)據(jù)。· 一個表示類名,它所代筆的Java類描述了如何將數(shù)據(jù)發(fā)送給打印機。例如向打印

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網(wǎng)頁包括文本數(shù)據(jù),因此MIME類型字符串中包含了編碼信息,示例中的charset=utf-16就是。用戶有責任向打印服務精確描述打印數(shù)據(jù)。用戶格式打印數(shù)據(jù)章節(jié)中介紹了如何正確的構造一個DocFlavor來完成這項工作。若MIME類型中沒有包含文本編碼的信息就可能發(fā)生不可預期的結果,這在字符編碼的重要性章節(jié)中有詳細的講解。如果客戶端提供的是一個Java對象,就可以由打印服務自行決定數(shù)據(jù)格式。在服務格式打印數(shù)據(jù)章節(jié)中介紹了怎樣使用DocFlaovr表示這種自定義格式的打

55、印數(shù)據(jù)。請注意,雖然DocFlavor API預定義了文檔類型,但僅憑這一點并不意味著就可以使用該類型的實現(xiàn)了。例如,雖然你使用了DocFlavor預定義實例來表示UTF-16編碼下的HTML文本,但若你的打印服務不支持打印HTML,你依然無法打印該網(wǎng)頁。再強調一次,確保打印機支持確定的數(shù)據(jù)格式是用戶的責任。用戶格式打印數(shù)據(jù)用戶使用DocFlavor來描述打印數(shù)據(jù)的格式并標明該數(shù)據(jù)將如何被傳遞給打印服務。MIME類型指定了數(shù)據(jù)格式。表示類名指定了數(shù)據(jù)的傳遞方式。對于常用的表示類名,DocFlavor類中都有一個內部類與之對應。每個內部類包含了一系列DocFlavor對象,這些對象常量代表了使用

56、該類可以被傳遞的數(shù)據(jù)格式。例如,一個輸入流能夠流化各種打印數(shù)據(jù)格式,包括GIF它由DocFlavor.INPUT_STREAM.GIF表示,PostScrit由DocFlavor.INPUT_STREAM.POSTSCRIPT表示。如果其中一個DocFlavor對象常量能夠準確地表述給定打印數(shù)據(jù)的格式,用戶就可以使用這個對象常量來代替自己構造DocFlavor的辦法。如果JPS API中并沒有合適的DocFlavor可用,用戶就可以通過自己構造來創(chuàng)建一個DocFlavor。用戶可以使用MIME類型和表示類名來構造DocFlavor,在接下來的兩個部分將就此進行講解。預定義數(shù)據(jù)格式的MIME類型

57、有四種數(shù)據(jù)最常被操作:文本數(shù)據(jù)、頁面描述語言文檔、圖像數(shù)據(jù)和自適應打印數(shù)據(jù)。本節(jié)將詳細解釋每一種數(shù)據(jù)并將它們的MIME類型列表展示。文本數(shù)據(jù)預格式化的文本數(shù)據(jù)通常放在一個面向字符的表示類中,如一個字符數(shù)組、字符串、Reader,當然也有可能是一個面向字節(jié)的表示類,如字節(jié)數(shù)組、輸入流或URL。純文本和HTML是最常見的文本數(shù)據(jù)格式。構造DocFlavor時,你可以使用下列MIME類型的字符串來表示這些數(shù)據(jù)格式:MIME 類型數(shù)據(jù)格式"text/plain"純文本,使用默認字符集US-ASCII"text/plain;charset=xxx"純文本,使用指定字符集xxx"text/html"超文本標記語言,使用默認字符集US-ASCII"text/html;charset=xxx"超文本標記語言,使用指定字符集xxx頁面描述語言文檔預格式化的頁面描述語言(PDL)文檔的操作通常放在一個面向字節(jié)的表示類中,如字節(jié)數(shù)組、InputStream輸入流或URL。構造DocFlavor時可以使用下列MIME類型的字符串表示該數(shù)據(jù)格式:MIME 類型數(shù)據(jù)格式"a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論