版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、目 錄第一章 介紹Java平臺打印的歷史JDK 1.3JDK 1.2JDK 1.1Java Print Service API能做什么Java Print Service 構(gòu)架javax.print包發(fā)現(xiàn)打印服務(wù)指定打印數(shù)據(jù)格式創(chuàng)建打印工作javax.print.event包應(yīng)用程序如何使用JPS一個基本的例子第二章 屬性屬性的類別和值屬性角色屬性集如何指定屬性標(biāo)準(zhǔn)屬性O(shè)rientationRequestedCopiesMediaMediaSizeMediaPrintableAreaDestinationSheetCollateSidesFidelity使用JPS屬性第三章 指定文檔類型用戶格
2、式打印數(shù)據(jù)預(yù)定義數(shù)據(jù)格式的MIME類型文本數(shù)據(jù)頁面描述語言文檔圖像數(shù)據(jù)自適應(yīng)打印數(shù)據(jù)表示類字符編碼的重要性服務(wù)格式打印數(shù)據(jù)怎樣使用DocFlavor第四章 打印及流化文檔比較StreamPrintService與PrintService定位服務(wù)發(fā)現(xiàn)打印服務(wù)發(fā)現(xiàn)流打印服務(wù)獲得一個打印工作創(chuàng)建DOC注冊事件打印服務(wù)事件打印工作事件PrintJobAttributeListenerPrintJobListener提交打印工作向打印機(jī)提交打印工作向流提交打印工作打印服務(wù)提供商第五章 打印及流化2D圖像使用打印工作打印或流化圖像打印2D圖像流化2D圖像使用服務(wù)格式數(shù)據(jù)打印服務(wù)格式數(shù)據(jù)流化服務(wù)格式打印數(shù)據(jù)
3、示例:PrintPS.java示例:PrintGIFtoStream.java示例:Print2DPrinterJob.java示例:Print2DGraphics.java示例:Print2DtoStream.java示例:PrintGIF.javaJava Print Service 詞匯表第一章 介紹Java Print Service (JPS)是一個Java打印API,設(shè)計此API是為了支持在所有Java平臺上的打印工作包括微空間平臺,并且支持現(xiàn)有的API。這個統(tǒng)一的打印 API包括了IETF規(guī)范RFC 2911中Internet Printing Protocol (IPP) 1.
4、1 所指定的標(biāo)準(zhǔn)屬性以及在此基礎(chǔ)上的可擴(kuò)展的打印屬性。通過這些屬性,客戶端和服務(wù)器端應(yīng)用程序就能夠發(fā)現(xiàn)并選定具有完成屬性設(shè)置所指定的功能的打印機(jī)。除了API中包含的StreamPrintServece,它還允許應(yīng)用程序?qū)⒋蛴?shù)據(jù)轉(zhuǎn)碼為不同的格式,第三方也可以通過Service Provider Interface (SPI)動態(tài)安裝他們自己的打印服務(wù)。Java平臺打印的歷史JDK 1.3為了使用戶的應(yīng)用程序能夠指定打印工作的參數(shù)和頁面屬性,JDK 1.3向AWT引入了JobAttributes和PageAttributes類。兩個API支持基本的頁面繪制,作為打印子系統(tǒng)的一部分,它會表示和格式
5、化一個頁面。雖然用戶可以從打印對話框中選擇打印機(jī)并使用JobAttributes和PageAttribtes來設(shè)定打印屬性,但無論是AWT還是Java 2D打印API都不支持基于打印功能尋找打印機(jī),而這對于任何一個打印系統(tǒng)都是必不可少的組成部分。要了解更多關(guān)于Java平臺打印的歷史請參看Printing Help for Java Developers。JDK 1.2JDK 1.2為Java平臺添加了java.awt.print包,它允許應(yīng)用程序打印所有的Java 2D圖像,包括2D圖表、文本和圖片。JDK 1.1Java Development Kit版本1.1首次為Java平臺引入了對基本
6、打印功能的支持。JDK 1.1打印API為開發(fā)者提供了一個基本的框架用于從客戶應(yīng)用程序中打印用戶接口上下文。JDK 1.1打印API,也叫做AWT Printing API,是圍繞java.awt.PrintJob類來設(shè)計的,它封裝了一個打印請求。PrintJob類創(chuàng)建一個Graphics的子類,它實(shí)現(xiàn)了對頁面的渲染調(diào)用和繪制。Java Print Service API能做什么Java Print Service API解決了當(dāng)前Java Print API所不具備的關(guān)于客戶端以及服務(wù)器端應(yīng)用程序中常見的打印需求,統(tǒng)一和擴(kuò)展了Java平臺的打印能力。除了支持現(xiàn)有的Java 2D打印功能之外,
7、Java Print Service還新增了許多新特性,包括:· 客戶端和服務(wù)器端應(yīng)用程序都可以自主尋找、選擇打印設(shè)備,并指定打印工作的各種屬性。這樣,JPS就提供了打印子系統(tǒng)中一直缺失的部分:可編程的打印設(shè)備搜索。· 標(biāo)準(zhǔn)IPP屬性的實(shí)現(xiàn)被作為一級類對象包含在了JPS API中。· 應(yīng)用程序可以擴(kuò)展包括在JPS API中的屬性。· 第三方可以通過Service Provider Interface接口添加自己的打印服務(wù)。Java Print Service 構(gòu)架Java print service API 包含四個包,分別是:javax.printja
8、vax.print.attributejavax.print.attribute.standardjavax.print.eventjavax.print包javax.print包是API的主包,其中包含的類和接口能夠讓你:· 發(fā)現(xiàn)打印服務(wù)(Print Services)· 指定打印數(shù)據(jù)的格式· 從一個打印服務(wù)創(chuàng)建打印工作(print jobs)· 向一個打印設(shè)備或者數(shù)據(jù)流發(fā)送打印數(shù)據(jù)發(fā)現(xiàn)打印服務(wù)應(yīng)用程序通過調(diào)用虛擬類PrintServiceLookup的靜態(tài)方法來定位能夠滿足應(yīng)用程序打印需求的打印服務(wù)。例如,需要雙面打印一個文檔,應(yīng)用程序就必須首先找到
9、具備雙面打印能力的打印設(shè)備。PrintServiceLookup返回的某個PrintService接口的實(shí)現(xiàn)類代表一個真實(shí)的打印設(shè)備。PrintService接口具有眾多能夠返回打印服務(wù)所支持的屬性的方法,通過調(diào)用其中的一個便可以確定這個PrintService對象所具備的功能。在打印及流化文檔章節(jié)的定位服務(wù)小節(jié)對PrintService類和PrintServiceLookup類進(jìn)行了討論。JDK自帶的PrintServiceLookup實(shí)現(xiàn)類能夠定位標(biāo)準(zhǔn)平臺下的打印設(shè)備。如果需要定位其他類型的打印設(shè)備,如IPP打印機(jī)或JINI打印機(jī),則打印服務(wù)的提供者可以重新編寫PrintServiceLo
10、okup類的實(shí)現(xiàn)。打印服務(wù)提供者可以使用SPI JAR文件規(guī)范來動態(tài)安裝自定義的PrintServiceLookup實(shí)現(xiàn)。除了向一臺打印設(shè)備發(fā)送數(shù)據(jù),應(yīng)用程序還可以使用StreamPrintService對象將數(shù)據(jù)打印到一個輸出流中,這就使得應(yīng)用程序能夠?qū)⒋蛴?shù)據(jù)轉(zhuǎn)換為不同的格式。為了獲得一個StreamPrintService對象,應(yīng)用程序需要使用虛擬類StreamPrintServiceFactory提供的查找方法,這與PrintServiceLookup類發(fā)現(xiàn)打印服務(wù)的辦法類似。在打印及流化文檔章節(jié)中講述了如何使用StreamPrintServiceFactory類和StreamPrin
11、tService類。StreamPrintService對象還可以被用于向輸出流發(fā)送2D圖像數(shù)據(jù),這在打印及流化2D圖像章節(jié)中有詳細(xì)的說明。指定打印數(shù)據(jù)格式DocFlavor類代表了打印數(shù)據(jù)的格式,如JPEG或PostScript。一個DocFlavor對象包括了一個MIME類型,它用于描述格式和代表該格式的表示類名,如java.io.InputStream,它指明了如何將文件發(fā)送給打印服務(wù)。為了方便起見,JPS API已經(jīng)預(yù)定義了一些代表通用數(shù)據(jù)格式的DocFlavor對象。在指定文檔類型 章節(jié)中講述了關(guān)于如何使用DocFlavor對象的細(xì)節(jié)。創(chuàng)建打印工作當(dāng)一個適合的打印服務(wù)被找到,應(yīng)用程序
12、就會從中創(chuàng)建一個打印工作,打印工作由DocPrintJob類對象來表示,該對象提供了實(shí)際的打印方法。在呼叫打印之前,應(yīng)用程序會創(chuàng)建一個Doc對象,該對象用來封裝打印數(shù)據(jù)以及打印要求的屬性,這些屬性被定義在包javax.print.attribute和包javax.print.attribute.standard中。打印及流化文檔章節(jié)中講述了如何使用Doc類和DocPrintJob類。通過JPS,應(yīng)用程序既可以使用PrinterJob類也可以使用DocPrintJob類來打印2D圖像。打印及流化2D圖像章節(jié)對此進(jìn)行了討論。javax.print.attribute包和javax.print.at
13、tribute.standard包定義了打印屬性。它們描述了打印服務(wù)的功能、文檔的特性、操作文檔或整個打印工作的指令、以及打印工作或打印設(shè)備的狀態(tài)。javax.print.attribute包描述了屬性的類型以及它們?nèi)绾伪粴w類于集合之中。Attribute接口是所有打印屬性的父接口。javax.print.attribute包所包含的類和接口定義了五種不同類型的屬性,其中每一種描述了一個打印服務(wù)所具備的功能。例如,PrintRequestAttribute接口定義了用戶用來描述打印工作特性的一些屬性,如打印成幾份等。javax.print.attribute.standard包中列舉了API所
14、支持的所有的標(biāo)準(zhǔn)屬性,其中大部分是IPP規(guī)范所規(guī)定的屬性。屬性章節(jié)討論了關(guān)于屬性API的更多細(xì)節(jié)。javax.print.event包javax.print.event包內(nèi)包括了允許應(yīng)用程序在打印工作和打印服務(wù)上注冊事件的類。要獲得關(guān)于注冊打印工作事件的詳細(xì)信息,請閱讀注冊事件小節(jié)。應(yīng)用程序如何使用JPS應(yīng)用程序使用JPS API操作打印請求的典型方法包括以下幾步:· 獲得一個適合的DocFlavor,它是定義打印數(shù)據(jù)格式的類。· 創(chuàng)建并填寫AttributeSet,它封裝了描述打印服務(wù)功能的屬性集,如打印5份,裝訂,以及雙面打印。· 查找一個能夠處理由DocFl
15、avor和屬性集指定的打印請求的打印服務(wù)。· 在該打印服務(wù)上創(chuàng)建一個打印工作。· 調(diào)用打印工作的print方法。以上步驟,應(yīng)用程序會根據(jù)打印對象和打印方式的不同進(jìn)行不同的操作。應(yīng)用程序也可以向一個打印設(shè)備或輸出流發(fā)送打印數(shù)據(jù)。打印數(shù)據(jù)可以是文本文檔或圖形,也可以是封裝了2D圖像的Java對象。如果打印數(shù)據(jù)是2D圖像,則打印工作既可以由DocPrintJob表示,也可以由PrinterJob表示。如果打印數(shù)據(jù)是文本文檔,那就必須使用DocPrintJob。打印方法和打印數(shù)據(jù)格式共同決定了如何從六種打印機(jī)制中選擇一種:· 使用DocPrintJob與PrintServ
16、ice的實(shí)例,通過打印設(shè)備打印文檔。· 使用DocPrintJob與StreamPrintService,將一個文檔放入輸出流中。· 使用DocPrintJob與PrintService的實(shí)例,通過打印設(shè)備打印2D圖像。· 使用DocPrintJob與StreamPrintService,將一個2D圖像放入輸出流中。· 使用java.awt.print.PrinterJob,將一個2D圖像打印到PrintService中。· 使用java.awt.print.PrinterJob,將一個2D圖像發(fā)送到StreamPrintService中。屬性
17、章節(jié)和指定文檔類型章節(jié)講述了如何創(chuàng)建一個屬性集以及如何指定文檔類型去使用以上六種打印機(jī)制的任意一種。打印及流化文檔章節(jié)討論了使用DocPrintJob打印和流化一個文檔。打印及流化2D圖像章節(jié)則講解了如何同時使用DocPrintJob 和PrinterJob打印和流化2D圖像。一個基本的例子大部分使用Java Print Service API的應(yīng)用程序都是希望直接將文檔發(fā)送給打印機(jī),下面的例子實(shí)現(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) 盡管這個例子僅僅演示了打印的六種方法中的一種,但其他幾種打印機(jī)制也是以類似的辦法來工作。這篇說明的其余部分將更加詳細(xì)地討論打印操作的每一個細(xì)節(jié)以及全部的打印機(jī)制。第二章 屬性當(dāng)一個用戶向打印機(jī)發(fā)送打印數(shù)據(jù)時,他還需要提供如何打印數(shù)據(jù)的指令,如:使用何種媒介(紙)、打印多少份。用戶可以使
21、用Java Print Service API的屬性定義來設(shè)定這些操作指令。Java Print Service API包含了兩個定義屬性的包:javax.print.attribute和javax.print.attribute.standard。javax.print.attribute包中包含了用于描述屬性類型以及如何將這些屬性放置到集合中的接口和類。而javax.print.attribute.standard包中則列舉了API中所有的標(biāo)準(zhǔn)屬性。JPS API中大部分的屬性定義都是由IETF的Internet Printing Protocol (IPP)規(guī)范定義的標(biāo)準(zhǔn)或擴(kuò)展的實(shí)現(xiàn)。本
22、章節(jié)詳細(xì)講述了JPS API中的屬性定義。屬性的類別和值小節(jié)解釋了符合JPS要求的屬性是什么樣子的,屬性角色小節(jié)講述了屬性的類型,屬性集小節(jié)講述了如何將屬性整合為屬性集,標(biāo)準(zhǔn)屬性小節(jié)講述了javax.print.attribute.standard包中的一些較為常用的屬性。屬性的類別和值每臺打印機(jī)都具有一系列的功能,如:在不同尺寸的紙張上打印的能力或多份打印的能力。每種功能又具有一系列的值。例如:一臺打印機(jī)設(shè)置打印取向的功能可能具有這種形式:LANDSCAPE(橫屏),PORTRAIT(豎屏)。對每一個打印請求而言,從這些可能的值中選定一個就能實(shí)現(xiàn)這些功能。Java Pint Service
23、API用一個術(shù)語“屬性類別(attribute category)”來代指打印機(jī)的功能,如“打印取向”;用另一個術(shù)語“屬性值(attribute value)”來代指功能的值,如“LANDSCAPE”。在Java Print Service API中,用一個實(shí)現(xiàn)了Attribute接口的Java類來表示屬性類別,屬性值則是該類或其子類的實(shí)例。例如,需要完成一個打印5份的打印工作,那么應(yīng)用程序就應(yīng)當(dāng)用數(shù)值5來構(gòu)建一個Copies類的對象,然后使用這個對象去設(shè)定打印工作。其中Copies類代表了屬性類別,而Copies類的對象則代表了具體的屬性值。由于屬性值被封裝在一個Java對象中,因此屬性值對
24、象本身就可以代表屬性類別,因此,簡化起見,通常情況下也可以用屬性值來表示屬性。屬性類別和值構(gòu)成了一個“關(guān)鍵字值”數(shù)據(jù)對,你可以將這個數(shù)據(jù)對與其他屬性一起加入到屬性集中。查看屬性集小節(jié)可以獲得更多信息。Attribute接口中只定義了兩個方法:getName和getCategory。getName方法返回一個String對象作為類別的名稱。getCategory方法返回首先實(shí)現(xiàn)該屬性類別的類。為了確保一個特定的類別的所有實(shí)現(xiàn)都具有相同的名稱和類,它(即首先實(shí)現(xiàn)接口的類)的子類不應(yīng)當(dāng)覆蓋getName 和getCategory方法。為了確定一臺打印機(jī)支持什么樣的屬性類別和值,你需要使用PrintS
25、ervice接口中定義的query方法。一個打印請求不需要為目標(biāo)打印機(jī)支持的所有屬性類別指定值,因?yàn)槊總€支持的屬性類別都會有它自己的默認(rèn)值。例如,一臺打印機(jī)可能會支持多達(dá)999份的打印工作,但它通常會采用默認(rèn)值即只打印1份。屬性角色當(dāng)向一臺打印機(jī)提交一個打印工作時,用戶還需要提供用于描述打印數(shù)據(jù)特征的屬性,如文檔名稱、打印數(shù)據(jù)、以何種方式打?。p面打印、打印5份等)。若一個打印工作由好幾塊打印數(shù)據(jù)組成,則不同的數(shù)據(jù)塊應(yīng)當(dāng)擁有不同的操作指令,如第一份文檔以8×11英寸的媒介打印、其他的文檔以11×17英寸媒介打印。一旦打印機(jī)接受了打印工作,該工作有關(guān)的其他信息就會被激活,這些
26、信息可能包括:工作狀態(tài)(如已完成、排隊中)、目前已經(jīng)打印的頁數(shù)等。這些信息同樣也是屬性。甚至打印機(jī)本身也可以用屬性來描述,如:打印機(jī)的名稱、打印機(jī)的位置、等待隊列中的工作數(shù)等。Java Print Service API用五種Attribute的子接口來定義這些不同種類的屬性角色:· PrintRequestAttribute被一個應(yīng)用程序用來代表應(yīng)用于整個打印工作的設(shè)置和指明整個打印工作應(yīng)當(dāng)如何運(yùn)行。· DocAttribute被應(yīng)用程序用來代表一個單一的文檔和應(yīng)用于該文檔的設(shè)置。· PrintJobAttribute被打印服務(wù)用來報告一個打印工作如何被執(zhí)行。它
27、的值通常與打印請求的屬性值相同,但若打印機(jī)不支持打印請求的屬性值時,響應(yīng)的打印工作會包含打印機(jī)所支持的屬性值。此時這個值就不同于打印請求的值了。· PrintServiceAttribute被一個打印服務(wù)用于報告它自己的狀態(tài)。· SupportedValuesAttribute被打印服務(wù)用來標(biāo)識一個請求屬性所支持的數(shù)值范圍。例如,一臺打印機(jī)可能只支持一個固定的打印份數(shù)。當(dāng)一個打印服務(wù)被查詢它的打印份數(shù)范圍時,它會返回一個CopiesSupported對象,該對象包含了關(guān)于打印份數(shù)范圍的信息,它是SupportedValuesAttribute的一個實(shí)現(xiàn)類。許多屬性可能是多個
28、屬性角色的成員,例如Media屬性就屬于文檔、打印工作和打印服務(wù)角色,因?yàn)樵搶傩钥梢悦枋黾垙埑叽纭⑦M(jìn)紙匣或紙張類型。實(shí)際上,大多數(shù)的文檔角色同時也是請求角色,而所有的請求角色都是工作角色。下一部分講述了如何將屬性整合為屬性集,其中也包含屬性角色的內(nèi)容。屬性集提交打印工作時,用戶往往需要提供多于一條的操作指令。如用戶可能需要同時指明使用A4紙和橫向打印。為了向打印機(jī)傳送多于一條的操作指令,用戶需要將多條屬性整合并以一個屬性集來發(fā)送。在Java Print Service API中,屬性集以AttributeSet接口表示。AttributeSet接口與java.util.Map接口相似:它提供了
29、一個從關(guān)鍵字到值的映射表,其中每一個關(guān)鍵字都是唯一的,并對應(yīng)不多于一個的值。不同的是,AttributeSet接口是專門為了支持Java Print Service API的需要而設(shè)計的,它被要求滿足以下條件:· AttributeSet中的每一個關(guān)鍵字對應(yīng)一個屬性類別,它的值只能在該關(guān)鍵字所表示的屬性類別可能的取值范圍中選取。因此,與Map接口不同,AttributeSet限制了關(guān)鍵字的取值范圍,因?yàn)橐粋€屬性類別不允許被賦予它所不具備的屬性值。· 只有實(shí)現(xiàn)了Attribute接口的的屬性才允許被加入到屬性集中。· 屬性集中一個屬性類別只能以一個屬性的身份加入。例
30、如,若屬性集中已經(jīng)包含了屬性Media,那么再向?qū)傩约砑悠渌腗edia屬性就會覆蓋之前的Media。與單獨(dú)的屬性類似,屬性集也有角色。屬性集角色由AttributeSet的子接口定義,這與屬性角色小節(jié)所講的由Attribute的子接口表示屬性角色相類似。AttributeSet的子接口有:PrintRequestAttributeSet,PrintJobAttributeSet,DocAttributeSet和PrintServiceAttributeSet。屬性集的角色決定了它所包含的屬性的類型:一個打印請求屬性集只能夠包含打印請求屬性。Java Print Service API包含了
31、HashAttributeSet,它是實(shí)現(xiàn)了AttributeSet接口的一個實(shí)體類,當(dāng)然開發(fā)者也可以提供各自對AttributeSet接口的實(shí)現(xiàn)類。應(yīng)用程序常常會使用HashAttributeSet類的子類而不是使用它本身,這些子類有:HashPrintRequestAttributeSet,HashPrintJobAttributeSet,HashDocumentAttributeSet和HashPrintServiceAttributeSet。這些子類實(shí)現(xiàn)了相對應(yīng)的AttributeSet的子接口。例如:PrintRequestAttributeSet繼承了AttributeSet,Ha
32、shPrintRequestAttributeSet則是實(shí)現(xiàn)了PrintRequestAttributeSet的一個實(shí)體類。使用HashPrintRequestAttributeSet或任何實(shí)現(xiàn)了PrintRequestAttributeSet接口的類所創(chuàng)建的屬性集都只能包含請求屬性。與它的子類不同,HashAttributeSet可以包含任何類型的屬性。因此當(dāng)一個應(yīng)用程序需要使用兩種類型以上的屬性時,它只能夠直接使用HashAttributeSet。通過PrintService的getUnsupportedAttibutes方法返回屬性集就是這樣一個例子。因?yàn)椴恢С值膶傩杂锌赡軐儆诓煌膶傩?/p>
33、角色。至于單獨(dú)的屬性,應(yīng)用程序通常會創(chuàng)建請求屬性集,這是因?yàn)橹该鞔蛴≌埱笫谴蛴?yīng)用程序的基本功能。使用HashPrintRequestAttributeSet類的一個構(gòu)造方法創(chuàng)建一個請求屬性的指令是:PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();下一部分將講述一些可以添加到屬性集中的常用的屬性。如何指定屬性無論是打印還是流化數(shù)據(jù),都是以同樣的方法指定屬性。通常PrintRequestAttributeSet的使用頻率遠(yuǎn)高于其他屬性,這是因?yàn)榇蛴≌埱髮傩允菫檎麄€打印工作進(jìn)行設(shè)置。又因?yàn)榇蠖鄶?shù)情況下都需要為一個
34、打印工作設(shè)置多于一個屬性,因此需要創(chuàng)建一個屬性集。下面的示例創(chuàng)建了一個PrintRequestAttributeSet,它規(guī)定服務(wù)在A4紙上以雙面打印的形式打印5份。PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(new Copies(5); aset.add(MediaSize.ISO_A4); aset.add(Sides.DUPLEX); 屬性集創(chuàng)建后,應(yīng)當(dāng)與DocFlavor一起傳送給打印工作的print方法。指定文檔類型討論如何使用DocFlavor。打印及流化文檔章節(jié)討論了如何打
35、印。下一小節(jié)則對一些較常用的屬性進(jìn)行更詳細(xì)的解釋。標(biāo)準(zhǔn)屬性javax.print.attribute.standard包列舉了Java Print Service API中的所有標(biāo)準(zhǔn)屬性。其中的大部分都來源于IETF的Internet Printing Protocol (IPP) 1.1規(guī)范。這就是說,javax.print.attribute.standard包中每一個與IPP兼容的屬性類都對應(yīng)一個IPP屬性類型,并且這個類的name屬性(通過getName方法返回)也同IPP類型的名字一致。在Java命名規(guī)則允許的范圍內(nèi),屬性類本身的名字通常也會盡可能地反映出IPP類型的名字。另外,屬性
36、類的值也同IPP一致。API規(guī)范中已經(jīng)歸檔了每一個屬性類的IPP兼容性。OrientationRequestedOrientationRequested屬性類允許你指定圖像或文檔的打印取向??赡艿膶傩灾涤校篜ORTRAIT(豎屏),LANDSCAPE(橫屏),REVERSE_PORTRAIT(反向豎屏),REVERSE_LANDSCAPE(反向橫屏)。OrientationRequested.PORTRAIT通常是默認(rèn)值。這條代碼演示了如何向?qū)傩约砑右粋€OrientationRequested屬性:aset.add(OrientationRequested.REVERSE_PORTRAIT)
37、;OrientationRequested對象是一個類型安全的枚舉類,其中封裝著String值,每個值對應(yīng)著一種可能的打印取向。這些值同時也是IPP的關(guān)鍵字。一些預(yù)格式化的文檔類型,如“Postscript”,有可能不支持這個屬性類。這是因?yàn)轭A(yù)格式化的文檔類嵌入了打印機(jī)語言的指令,這些指令只能被打印機(jī)解釋,并優(yōu)先于客戶的請求。用戶可以通過調(diào)用下列指令來獲取一個打印服務(wù)所支持的所有打印取向:PrintService.getSupportedAttributeValues(OrientationRequested.class, .)這個方法會返回一個以O(shè)rientationRequested所支持
38、的數(shù)值為元素的數(shù)組。CopiesCopies屬性類允許你指定打印的拷貝份數(shù)。Copies類中封裝了一個整數(shù),用于表示請求的打印份數(shù)。下列代碼演示了如何將一個Copies屬性設(shè)置為打印5份,并將這個屬性添加到屬性集:aset.add(new Copies(5);通過調(diào)用下列代碼,用戶可以發(fā)現(xiàn)打印服務(wù)所支持的打印份數(shù)的范圍:PrintService.getSupportedAttributeValues(Copies.class, .) 這個方法返回CopiesSupported對象,它封裝了一系列整數(shù)值,這些整數(shù)值代表了服務(wù)能夠處理的打印份數(shù)。與Copies對象不同,調(diào)用CopiesSuppor
39、ted對象的getSupportedAttributeValues方法總是會返回null,這是因?yàn)镃opiesSupported對象沒有實(shí)現(xiàn)PrintRequestAttribute接口,因此用戶也不可以在打印請求中指定CopiesSupported屬性。下列代碼段演示了如何詢問打印服務(wù)是否支持打印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屬性是一個相對復(fù)雜但卻需要重點(diǎn)理解的屬性。Java Print Service API為抽象類Media定義了三個子類,以對應(yīng)IPP規(guī)范中對Media屬性的三個重載:MediaSizeName,MediaName,MediaTray。所有的Media子類都具有Media類型,他們可以為Meida定義不同的標(biāo)準(zhǔn)屬性值。例如,MediaTray對象可以為Meida屬性指定值MANUAL以表明
41、文檔必須由打印機(jī)的手動進(jìn)紙匣進(jìn)行打印。下列代碼演示了如何將一個Media屬性值添加到屬性集:aset.add(MediaTray.MANUAL);Media屬性的值總是一個字符串,但由于屬性的重載,它的值就決定了屬性所代表的Media類型。例如,IPP預(yù)定義的屬性值的集合中包含了“a4”和“top-tray”,如果值被設(shè)定為“a4”那么Media屬性指的就是紙張的尺寸;如果被指定為“top-tray”,那么Media屬性指的就是紙張的來源。因?yàn)樽址畬傩灾悼梢源聿煌愋偷拿浇?,一個應(yīng)用程序就可以擴(kuò)展屬性集來包括諸如“company-letterhead”或“yellow letter pap
42、er”這樣的屬性。當(dāng)然,以這種方式擴(kuò)展Media屬性,應(yīng)用程序必須首先找到打印服務(wù)所設(shè)定使用的媒介。大多數(shù)情況下,應(yīng)用程序會同時使用MediaSizeName和MediaTray。MediaSizeName列舉了所有支持的尺寸。MediaTray列舉了打印機(jī)的進(jìn)紙匣,它通常包括一個主要進(jìn)紙匣和一個手動進(jìn)紙匣。IPP 1.1規(guī)范沒有提供同時指定媒介尺寸和媒介來源的屬性,舉例來說一個應(yīng)用程序不能要求從手動進(jìn)紙匣以A4紙進(jìn)行打印。IPP規(guī)范的未來版本或許會提供同時設(shè)定多種媒介屬性的方法,屆時JPS API也很可能會進(jìn)行升級以適應(yīng)其變化。JPS API額外包含了兩個不屬于IPP的與打印媒介相關(guān)的屬性:
43、MediaSize和MediaPrintableArea。MediaSizeMediaSize不是一個請求屬性,它列舉了MediaSizeName實(shí)例與紙張尺寸之間的映射關(guān)系。通常每一個MediaSizeName實(shí)例都會有一個相關(guān)聯(lián)的MeidaSize對象,通過它用戶就可以獲得MediaSizeName所定義的紙張尺寸。確定MediaSizeName實(shí)例的尺寸,應(yīng)當(dāng)調(diào)用:MediaSize size = MediaSizeName.getMediaSizeForName(paper);MediaPrintableArea在一個打印請求中,MediaPrintableArea會與一個兼容的Med
44、ia共同使用,以確定紙張的打印區(qū)域。打印機(jī)硬件通常會定義頁面的可打印區(qū)域,并且這個區(qū)域很少會填滿整個頁面。因此用戶需要確定一個特定尺寸的媒介的可打印范圍,以確保打印數(shù)據(jù)能夠完全包容于打印區(qū)域。例如,為了確定5”×7”紙支持的打印范圍,應(yīng)用程序需要確定這個尺寸的紙張所對應(yīng)的媒介尺寸的數(shù)值,然后使用該數(shù)值查詢打印服務(wù):PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();aset.add(MediaSizeName.NA_5X7);MediaPrintableArea printableArea = (Med
45、iaPrintableArea)service. getSupportedAttributeValues(MediaPrintableArea.class, null, aset);返回值表示打印機(jī)對于該尺寸紙張所支持的最大打印范圍。DestinationDestination屬性允許你將打印數(shù)據(jù)重新定向到文件而不是發(fā)送給打印設(shè)備。在用戶對話框中常常會看到“print-to-file”選項(xiàng)。由于假脫機(jī)數(shù)據(jù)并不總能進(jìn)行重定向,因?yàn)樗赡芤蕾囋O(shè)備特定的光柵來進(jìn)行解釋。因此,Java Print Service API要求用戶查詢打印服務(wù)以確定它是否支持重定向到文件。打印服務(wù)可能不支持所有的類型,或
46、者僅支持其中某一個屬性值。例如,雖然JPS API能夠被用于網(wǎng)絡(luò)環(huán)境,在這種環(huán)境下打印數(shù)據(jù)的格式化不會在主計算機(jī)端發(fā)生,由于打印服務(wù)格式化的數(shù)據(jù)可能不被客戶端計算機(jī)系統(tǒng)所接受,此時就可能無法為輸出指定一個本地文件。Destination使用一個URL作為目的地的值,它允許一臺網(wǎng)絡(luò)打印以諸如FTP之類的協(xié)議上載格式化的打印數(shù)據(jù)。支持這個屬性的多數(shù)打印機(jī)將會作為本地環(huán)境的一部分運(yùn)行,并且允許使用“file:”協(xié)議的URL。下列代碼表示重定向到C盤的一個名叫out.prn的文件:aset.add(new Destination("file:c:out.prn");SheetCol
47、lateSheetCollate屬性允許你在打印超過一份的多頁面文檔時設(shè)定是否需要校對。例如,3頁、2份已校對的工作會按照(1、2、3、1、2、3)的順序打印,但若將同樣的文檔設(shè)定為2份未校對的工作則會按照(1、1、2、2、3、3)的順序打印。這個屬性并不在IPP 1.1規(guī)范之中,但它非常實(shí)用因此絕大多數(shù)打印機(jī)都支持。下列代碼演示了如何設(shè)定一個已校對工作:aset.add(SheetCollate.COLLATED);Sides一些打印機(jī)(特別是高端打印機(jī))能夠進(jìn)行雙面打印。Sides屬性允許應(yīng)用程序設(shè)定雙面打印以替換通常默認(rèn)的單面打印。雙面打印有時被稱為“duplex”或“tumble”。這
48、兩個值的輸出取向不同。Java Print Service API中將duplex指定為“長邊雙面打印”、將tumble指定為“短邊雙面打印”。有關(guān)Sides更多的解釋請直接閱讀API規(guī)范。下列代碼演示了將一個文檔指定為雙面打?。篴set.add(Sides.DUPLEX);FidelityFdelity屬性是一個IPP布爾屬性,它表示當(dāng)打印服務(wù)不支持打印請求中的某個設(shè)定的屬性時是否需要退回打印工作。Fidelity并不是每個開發(fā)人員都需要關(guān)注的屬性,但在JPS API中它卻占有相當(dāng)重要的位置。默認(rèn)屬性值為FIDELITY_FALSE,它表示當(dāng)打印服務(wù)不支持打印請求設(shè)定的屬性時無需退回打印工作
49、。例如,若一個應(yīng)用程序指明打印取向?yàn)榉聪驒M屏,但打印機(jī)卻不支持反向橫屏?xí)r,若fidelity的值為true則退回打印工作;反之,若fidelity的值為false時,則打印機(jī)可能會使用一個近似的替代選項(xiàng),如橫屏來執(zhí)行打印。Fidelity屬性允許應(yīng)用程序決定是嚴(yán)格地以設(shè)定的方式打印文檔還是不管打印機(jī)是否完全支持設(shè)定值都執(zhí)行打印。下列代碼演示了一個在打印機(jī)不支持請求屬性時需要退回的打印工作:aset.add(Fidelity.FIDELITY_TRUE);在fidelity十分必要的情況下,Java Print Service API為應(yīng)用程序提供了許多查詢工具,這些工具可以查詢某個打印請求是否
50、被打印服務(wù)支持。詳情請參看PrintService接口的各種query方法。使用JPS屬性與之前的Java打印API不同的是,Java Print Service屬性既可以被程序使用也可以被用戶對話框使用。應(yīng)用程序可以進(jìn)行有限的設(shè)定并由用戶在用戶對話框中對選項(xiàng)進(jìn)行檢查。JPS屬性設(shè)計時就是可擴(kuò)展的。一個AttributeSet可以包含任何正確實(shí)現(xiàn)了Attribute接口的對象,就是說標(biāo)準(zhǔn)屬性集可以被改寫并且能夠與后來版本的JDK兼容,并且可以通過兩種方法來實(shí)現(xiàn)打印屬性的擴(kuò)展:· 使用標(biāo)準(zhǔn)屬性的子類來支持?jǐn)U展類型所需要的值。· 創(chuàng)建一個新的屬性類型。通過用戶對話框演示屬性的使
51、用需要提供一個用戶接口,這超出了本文討論的范圍。同樣,擴(kuò)展JPS屬性也是打印服務(wù)提供者應(yīng)該完成的工作,因此在這個版本的使用說明中沒有包含這樣的例子。不過,Print a Document章節(jié)解釋了一個簡單的打印應(yīng)用程序,里面覆蓋了本章所描述的關(guān)于使用JPS屬性的一些基礎(chǔ)。第三章 指定文檔類型按照用戶的預(yù)期,一個可打印的文檔應(yīng)當(dāng)具有多種形式,包括:PDF文件、數(shù)碼相機(jī)拍攝的圖片、電子郵件、word文檔、網(wǎng)頁。因此在打印一個特定格式的文檔前,用戶需要確保打印機(jī)能夠理解這個格式。有時一臺打印機(jī)能夠直接打印給定格式的文檔:照片打印機(jī)可以直接打印各種格式的照片、PostScript打印機(jī)能夠直接打印一個
52、PostScript文檔。不過,只有極少數(shù)打印機(jī)能夠直接打印格式如此眾多的文檔。大多數(shù)的打印機(jī)需要高端軟件的支持來將源文檔翻譯為打印機(jī)可以打印的格式。一個打印API需要提供一個描述文檔類型的辦法,以便:· 打印機(jī)可以報告哪些格式允許打印。· 用戶可以描述需要打印的數(shù)據(jù)的格式。· 用戶可以描述文本數(shù)據(jù)的編碼。Java Print Service API使用DocFlavor類描述文檔類型。DocFlavor由以下部分構(gòu)成:· 一個MIME類型用于告知打印機(jī)如何翻譯數(shù)據(jù)。· 一個表示類名,它所代筆的Java類描述了如何將數(shù)據(jù)發(fā)送給打印機(jī)。例如向打印
53、服務(wù)描述一個HTML頁面,用戶可能會選擇使用DocFlavor,并設(shè)定MIME類型字符串“text/html; charset=utf-16”和表示類名“java.io.InputStream”。用戶可以通過下列兩種方法中的一種來獲得這個DocFlaovr:· 構(gòu)造一個DocFlavor:DocFlavor htmlStreamFlavor = new DocFlavor(“text/html;charset=utf-16”,“java.io.InputStream”);· 使用預(yù)定義的DocFlavor實(shí)例來表示:DocFlavor.INPUT_STREAM TEXT_H
54、TML_UTF_16為了方便使用,Java Print Service API為常用的文檔類型提供了一套預(yù)定義的實(shí)例。因?yàn)镠TML網(wǎng)頁包括文本數(shù)據(jù),因此MIME類型字符串中包含了編碼信息,示例中的charset=utf-16就是。用戶有責(zé)任向打印服務(wù)精確描述打印數(shù)據(jù)。用戶格式打印數(shù)據(jù)章節(jié)中介紹了如何正確的構(gòu)造一個DocFlavor來完成這項(xiàng)工作。若MIME類型中沒有包含文本編碼的信息就可能發(fā)生不可預(yù)期的結(jié)果,這在字符編碼的重要性章節(jié)中有詳細(xì)的講解。如果客戶端提供的是一個Java對象,就可以由打印服務(wù)自行決定數(shù)據(jù)格式。在服務(wù)格式打印數(shù)據(jù)章節(jié)中介紹了怎樣使用DocFlaovr表示這種自定義格式的打
55、印數(shù)據(jù)。請注意,雖然DocFlavor API預(yù)定義了文檔類型,但僅憑這一點(diǎn)并不意味著就可以使用該類型的實(shí)現(xiàn)了。例如,雖然你使用了DocFlavor預(yù)定義實(shí)例來表示UTF-16編碼下的HTML文本,但若你的打印服務(wù)不支持打印HTML,你依然無法打印該網(wǎng)頁。再強(qiáng)調(diào)一次,確保打印機(jī)支持確定的數(shù)據(jù)格式是用戶的責(zé)任。用戶格式打印數(shù)據(jù)用戶使用DocFlavor來描述打印數(shù)據(jù)的格式并標(biāo)明該數(shù)據(jù)將如何被傳遞給打印服務(wù)。MIME類型指定了數(shù)據(jù)格式。表示類名指定了數(shù)據(jù)的傳遞方式。對于常用的表示類名,DocFlavor類中都有一個內(nèi)部類與之對應(yīng)。每個內(nèi)部類包含了一系列DocFlavor對象,這些對象常量代表了使用
56、該類可以被傳遞的數(shù)據(jù)格式。例如,一個輸入流能夠流化各種打印數(shù)據(jù)格式,包括GIF它由DocFlavor.INPUT_STREAM.GIF表示,PostScrit由DocFlavor.INPUT_STREAM.POSTSCRIPT表示。如果其中一個DocFlavor對象常量能夠準(zhǔn)確地表述給定打印數(shù)據(jù)的格式,用戶就可以使用這個對象常量來代替自己構(gòu)造DocFlavor的辦法。如果JPS API中并沒有合適的DocFlavor可用,用戶就可以通過自己構(gòu)造來創(chuàng)建一個DocFlavor。用戶可以使用MIME類型和表示類名來構(gòu)造DocFlavor,在接下來的兩個部分將就此進(jìn)行講解。預(yù)定義數(shù)據(jù)格式的MIME類型
57、有四種數(shù)據(jù)最常被操作:文本數(shù)據(jù)、頁面描述語言文檔、圖像數(shù)據(jù)和自適應(yīng)打印數(shù)據(jù)。本節(jié)將詳細(xì)解釋每一種數(shù)據(jù)并將它們的MIME類型列表展示。文本數(shù)據(jù)預(yù)格式化的文本數(shù)據(jù)通常放在一個面向字符的表示類中,如一個字符數(shù)組、字符串、Reader,當(dāng)然也有可能是一個面向字節(jié)的表示類,如字節(jié)數(shù)組、輸入流或URL。純文本和HTML是最常見的文本數(shù)據(jù)格式。構(gòu)造DocFlavor時,你可以使用下列MIME類型的字符串來表示這些數(shù)據(jù)格式:MIME 類型數(shù)據(jù)格式"text/plain"純文本,使用默認(rèn)字符集US-ASCII"text/plain;charset=xxx"純文本,使用指定字符集xxx"text/html"超文本標(biāo)記語言,使用默認(rèn)字符集US-ASCII"text/html;charset=xxx"超文本標(biāo)記語言,使用指定字符集xxx頁面描述語言文檔預(yù)格式化的頁面描述語言(PDL)文檔的操作通常放在一個面向字節(jié)的表示類中,如字節(jié)數(shù)組、InputStream輸入流或URL。構(gòu)造DocFlavor時可以使用下列MIME類型的字符串表示該數(shù)據(jù)格式:MIME 類型數(shù)據(jù)格式"a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年軟件許可使用合同的軟件范圍和許可期限
- 2024年物業(yè)清潔合同:保持環(huán)境共創(chuàng)綠色家園
- 品質(zhì)生活從時尚選擇開始
- 立秋營銷新篇章
- 2024私房舊房交易糾紛調(diào)解服務(wù)合同3篇
- 媒體新篇章模板
- 揭秘全球旅游新趨勢
- 大宗商品貨款質(zhì)押合同(2篇)
- 《煤礦職業(yè)病危害防治》培訓(xùn)課件2025
- 2024陶瓷杯團(tuán)購采購合同附帶市場調(diào)研與產(chǎn)品改進(jìn)服務(wù)3篇
- 2023醫(yī)療質(zhì)量安全核心制度要點(diǎn)釋義(第二版)對比版
- 急診科護(hù)士長進(jìn)修匯報
- 生態(tài)農(nóng)業(yè)示范基地項(xiàng)目可行性研究報告1
- 家庭教育大講堂實(shí)施方案
- 園林綠化工職業(yè)技能競賽理論考試試題題庫及答案
- 2024-2030年中國機(jī)場跑道異物碎片(FOD)檢測系統(tǒng)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 地震災(zāi)害應(yīng)急演練評估報告
- 特殊消防系統(tǒng)工程施工方案
- 冠脈介入術(shù)的健康宣教
- 2024年施工現(xiàn)場安全管理合同
- 三角函數(shù)的圖像與性質(zhì)專項(xiàng)訓(xùn)練(解析版)
評論
0/150
提交評論