Java打印程序設(shè)計_第1頁
Java打印程序設(shè)計_第2頁
Java打印程序設(shè)計_第3頁
Java打印程序設(shè)計_第4頁
Java打印程序設(shè)計_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、-作者xxxx-日期xxxxJava打印程序設(shè)計【精品文檔】Java打印程序設(shè)計nt包中。而jdk1.4新增的類則主要存在于javax.print包及其相應(yīng)的子包javax.print.event和javax.print.attribute中。其中javax.print包中主要包含打印服務(wù)的相關(guān)類,而javax.print.event則包含打印事件的相關(guān)定義,javax.print.attribute則包括打印服務(wù)的可用屬性列表等。2.2如何實(shí)現(xiàn)打印要產(chǎn)生一個打印,至少需要考慮兩條:需要一個打印服務(wù)對象。這可通過三種方式實(shí)現(xiàn):在jdk1.4之前的版本,必須要實(shí)現(xiàn)erJob的pr

2、intDialog顯示打印對話框,然后通過print方法開始打印;在jdk1.4中則可以通過javax.print.ServiceUI的printDialog顯示打印對話框,然后調(diào)用print方法開始一個打印工作。2.3打印機(jī)對話框Printable的打印對話框開始打印工作之前,可以通過PrinterJob.printDialog來顯示一個打印對話框。它給用戶一個機(jī)會以選擇應(yīng)該打印的頁碼范圍,并可供用戶改變打印設(shè)置。它是一個本地對話框。事實(shí)上,當(dāng)從一個Printable對象進(jìn)行一個打印工作時,打印對象并不知道需要打印多少頁。它只是不停地調(diào)用print方法。只要print方法返回Printabl

3、e.PAGE_EXISTS值,打印工作就不停地產(chǎn)生打印頁,直到print方法返回Printable.NO_SUCH_PAGE時,打印工作才停止。由于打印工作只有在打印完成后才進(jìn)行準(zhǔn)確的頁數(shù)計算,所以在對話框上的頁碼范圍是尚未初始化的1,9999。我們可以通過構(gòu)建一個java.awt.print.Book對象傳遞給打印對象;也可以通過指定的格式計算需要打印的頁數(shù)并傳遞給打印對象,使其準(zhǔn)確地知道要打印多少頁。2.3.2ServiceUI的打印對話框與Printable的對話框不同的是,在jdk1.4提供ServiceUI的打印機(jī)對話框的缺省行為已經(jīng)用新的API更改了:缺省情況下對話框不顯示。我們必

4、須使用ServiceUI類調(diào)用printDialog方法創(chuàng)建如下所示的打印對話框。3Java打印程序設(shè)計實(shí)例3.1打印文本3.1.1應(yīng)用場景假設(shè)我們需要打印一個窗體的某個文本編輯域(可能只有幾行,也可能包含多頁)的內(nèi)容,并且每頁最多打印54行,如何實(shí)現(xiàn)呢?3.1.2解決方法基本思路如下:首先我們需要實(shí)現(xiàn)Printable接口,然后按照每頁最多54行的格式計算共需要打印多少頁,當(dāng)打印文本的按鈕被點(diǎn)擊時,執(zhí)行相應(yīng)的打印動作。打印文本的具體操作可通過Graphics2D的drawString方法來實(shí)現(xiàn)。1、實(shí)現(xiàn)Printable接口/*Graphic指明打印的圖形環(huán)境;PageFormat指明打印頁

5、格式(頁面大小以點(diǎn)為計量單位,1點(diǎn)為1英寸的1/72,1英寸為25.4毫米。A4紙大致為595842點(diǎn));page指明頁號*/ImageableX(),pf.getImageableY();/轉(zhuǎn)換坐標(biāo),確定打印邊界drawCurrentPageText(g2,pf,page);/打印當(dāng)前頁文本returnPrintable.PAGE_EXISTS;/存在打印頁時,繼續(xù)打印工作/*打印指定頁號的具體文本內(nèi)容*/privatevoiddrawCurrentPageText(Graphics2Dg2,PageFormatpf,intpage)Strings=getDrawText(printStr)

6、page;/獲取當(dāng)前頁的待打印文本內(nèi)容/獲取默認(rèn)字體及相應(yīng)的尺寸FontRenderContextcontext=g2.getFontRenderContext();Fontf=area.getFont();StringdrawText;floatascent=16;/給定字符點(diǎn)陣intk,i=f.getSize(),lines=0;while(s.length()0&lines0)s=s.substring(k+1);/截取尚未打印的文本ascent+=i;else/不存在回車符lines+=1;/計算行數(shù)drawText=s;/獲取每一行文本g2.drawString(drawText,0

7、,ascent);/具體打印每一行文本,同時走紙移位s=;/文本已結(jié)束/*將打印目標(biāo)文本按頁存放為字符串?dāng)?shù)組*/publicStringgetDrawText(Strings)StringdrawText=newStringPAGES;/根據(jù)頁數(shù)初始化數(shù)組for(inti=0;i0)if(lines0)s=s.substring(k+1);elselines+=1;/行數(shù)累加/將文本內(nèi)容存放到相應(yīng)的數(shù)組元素drawTextsuffix=drawTextsuffix+s;s=;else/已滿一頁時lines=0;/行數(shù)統(tǒng)計清零suffix+;/數(shù)組下標(biāo)加1returndrawText;2、計算需

8、要打印的總頁數(shù)publicintgetPagesCount(StringcurStr)intpage=0;intposition,count=0;Stringstr=curStr;while(str.length()0)/文本尚未計算完畢position=str.indexOf(n);/計算回車符的位置count+=1;/統(tǒng)計行數(shù)if(position!=-1)str=str.substring(position+1);/截取尚未計算的文本elsestr=;/文本已計算完畢if(count0)page=count/54+1;/以總行數(shù)除以54獲取總頁數(shù)returnpage;/返回需打印的總頁數(shù)

9、3.1、以jdk1.4以前的版本實(shí)現(xiàn)打印動作按鈕監(jiān)聽,并完成具體的打印操作privatevoidprintTextAction()printStr=area.getText().trim();/獲取需要打印的目標(biāo)文本if(printStr!=null&printStr.length()0)/當(dāng)打印內(nèi)容不為空時PAGES=getPagesCount(printStr);/獲取打印總頁數(shù)PrinterJobmyPrtJob=PrinterJob.getPrinterJob();/獲取默認(rèn)打印作業(yè)PageFormatpageFormat=myPrtJob.defaultPage();/獲取默認(rèn)打印頁

10、面格式myPrtJob.setPrintable(this,pageFormat);/設(shè)置打印工作if(myPrtJob.printDialog()/顯示打印對話框trymyPrtJob.print();/進(jìn)行每一頁的具體打印操作catch(PrinterExceptionpe)pe.printStackTrace();else/如果打印內(nèi)容為空時,提示用戶打印將取消JOptionPane.showConfirmDialog(null,Sorry,PrinterJobisEmpty,PrintCancelled!,Empty,JOptionPane.DEFAULT_OPTION,JOption

11、Pane.WARNING_MESSAGE);3.2、以jdk1.4新版本提供的API實(shí)現(xiàn)打印動作按鈕監(jiān)聽,并完成具體的打印操作privatevoidprintText2Action()printFlag=0;/打印標(biāo)志清零printStr=area.getText().trim();/獲取需要打印的目標(biāo)文本if(printStr!=null&printStr.length()0)/當(dāng)打印內(nèi)容不為空時PAGES=getPagesCount(printStr);/獲取打印總頁數(shù)/指定打印輸出格式DocFlavorflavor=DocFlavor.SERVICE_FORMATTED.PRINTABL

12、E;/定位默認(rèn)的打印服務(wù)PrintServiceprintService=PrintServiceLookup.lookupDefaultPrintService();/創(chuàng)建打印作業(yè)DocPrintJobjob=printService.createPrintJob();/設(shè)置打印屬性PrintRequestAttributeSetpras=newHashPrintRequestAttributeSet();DocAttributeSetdas=newHashDocAttributeSet();/指定打印內(nèi)容Docdoc=newSimpleDoc(this,flavor,das);/不顯示打印

13、對話框,直接進(jìn)行打印工作tryjob.print(doc,pras);/進(jìn)行每一頁的具體打印操作catch(PrintExceptionpe)pe.printStackTrace();else/如果打印內(nèi)容為空時,提示用戶打印將取消JOptionPane.showConfirmDialog(null,Sorry,PrinterJobisEmpty,PrintCancelled!,Empty,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);3.2打印預(yù)覽3.2.1應(yīng)用場景大多少商業(yè)應(yīng)用都需要提供打印預(yù)覽機(jī)制,它可以讓我們在屏幕上看到

14、頁面,這樣就不會因為不喜歡的打印結(jié)果而浪費(fèi)紙張。假設(shè)我們在打印上一節(jié)所說的文本之前,需要先進(jìn)行打印預(yù)覽。那么該怎么實(shí)現(xiàn)呢?界面實(shí)現(xiàn)圖示如下:(Next預(yù)覽下一頁,Preview預(yù)覽前一頁,Close則關(guān)閉預(yù)覽)3.2.2解決方法基本思路:雖然Java2平臺的打印API并不提供標(biāo)準(zhǔn)的打印預(yù)覽對話框,但是自己來進(jìn)行設(shè)計也并不復(fù)雜。正常情況下,print方法將頁面環(huán)境繪制到一個打印機(jī)圖形環(huán)境上,從而實(shí)現(xiàn)打印。而事實(shí)上,print方法并不能真正產(chǎn)生打印頁面,它只是將待打印內(nèi)容繪制到圖形環(huán)境上。所以,我們可以忽略掉屏幕圖形環(huán)境,經(jīng)過適當(dāng)?shù)目s放比例,使整個打印頁容納在一個屏幕矩形里,從而實(shí)現(xiàn)精確的打印預(yù)覽

15、。在打印預(yù)覽的設(shè)計實(shí)現(xiàn)中,主要需要解決兩個問題。第一,如何將打印內(nèi)容按合適的比例繪制到屏幕;第二,如何實(shí)現(xiàn)前后翻頁。下面我給出這兩個問題的具體實(shí)現(xiàn)方法,完整的實(shí)現(xiàn)請參看附件中的PrintPreviewDialog.java文件。/*將待打印內(nèi)容按比例繪制到屏幕*/publicvoidpaintComponent(Graphicsg)super.paintComponent(g);Graphics2Dg2=(Graphics2D)g;PageFormatpf=PrinterJob.getPrinterJob().defaultPage();/獲取頁面格式doublexoff;/在屏幕上頁面初始位

16、置的水平偏移doubleyoff;/在屏幕上頁面初始位置的垂直偏移doublescale;/在屏幕上適合頁面的比例doublepx=pf.getWidth();/頁面寬度doublepy=pf.getHeight();/頁面高度doublesx=getWidth()-1;doublesy=getHeight()-1;if(px/pysx/sy)scale=sy/py;/計算比例xoff=0.5*(sx-scale*px);/水平偏移量yoff=0;elsescale=sx/px;/計算比例xoff=0;yoff=0.5*(sy-scale*py);/垂直偏移量g2.translate(floa

17、t)xoff,(float)yoff);/轉(zhuǎn)換坐標(biāo)g2.scale(float)scale,(float)scale);Rectangle2Dpage=newRectangle2D.Double(0,0,px,py);/繪制頁面矩形g2.setPaint(Color.white);/設(shè)置頁面背景為白色g2.fill(page);g2.setPaint(Color.black);/設(shè)置頁面文字為黑色g2.draw(page);trypreview.print(g2,pf,currentPage);/顯示指定的預(yù)覽頁面catch(PrinterExceptionpe)g2.draw(newLine

18、2D.Double(0,0,px,py);g2.draw(newLine2D.Double(0,px,0,py);/*預(yù)覽指定的頁面*/publicvoidviewPage(intpos)intnewPage=currentPage+pos;/指定頁面在實(shí)際的范圍內(nèi)if(0=newPage&newPagepreview.getPagesCount(printStr)currentPage=newPage;/將指定頁面賦值為當(dāng)前頁repaint();這樣,在按下Next按鈕時,只需要調(diào)用canvas.viewPage(1);而在按下Preview按鈕時,只需要調(diào)用canvas.viewPage(

19、-1)即可實(shí)現(xiàn)預(yù)覽的前后翻頁。3.3打印圖形3.3.1應(yīng)用場景在實(shí)際應(yīng)用中,我們還需要打印圖形。譬如,我們有時需要將一個JavaApplet的完整界面或一個應(yīng)用程序窗體及其所包含的全部組件都打印出來,又應(yīng)該如何實(shí)現(xiàn)呢?3.3.2解決方法基本思路如下:在Java的Component類及其派生類中都提供了print和printAll方法,只要設(shè)置好屬性就可以直接調(diào)用這兩個方法,從而實(shí)現(xiàn)對組件及圖形的打印。/*打印指定的窗體及其包含的組件*/privatevoidprintFrameAction()Toolkitkit=Toolkit.getDefaultToolkit();/獲取工具箱Proper

20、tiesprops=newProperties();props.put(awt.print.printer,durango);/設(shè)置打印屬性props.put(awt.print.numCopies,2);if(kit!=null)/獲取工具箱自帶的打印對象PrintJobprintJob=kit.getPrintJob(this,PrintFrame,props);if(printJob!=null)Graphicspg=printJob.getGraphics();/獲取打印對象的圖形環(huán)境if(pg!=null)trythis.printAll(pg);/打印該窗體及其所有的組件final

21、lypg.dispose();/注銷圖形環(huán)境printJob.end();/結(jié)束打印作業(yè)3.4打印文件3.4.1應(yīng)用場景在很多實(shí)際應(yīng)用情況下,我們可能都需要打印用戶指定的某一個文件。該文件可能是圖形文件,如GIF、JPEG等等;也可能是文本文件,如TXT、Java文件等等;還可能是復(fù)雜的PDF、DOC文件等等。那么對于這樣的打印需求,我們又應(yīng)該如何實(shí)現(xiàn)呢?3.4.2解決方法基本思路:在jdk1.4以前的版本,要實(shí)現(xiàn)這樣的打印功能將非常麻煩和復(fù)雜,甚至是難以想象的。但幸運(yùn)的是,jdk1.4的打印服務(wù)API提供了一整套的打印文件流的類和方法。利用它們,我們可以非常方便快捷地實(shí)現(xiàn)各式各樣不同類型文件

22、的打印功能。下面給出一個通用的處理方法。/*打印指定的文件*/privatevoidprintFileAction()/構(gòu)造一個文件選擇器,默認(rèn)為當(dāng)前目錄JFileChooserfileChooser=newJFileChooser(SystemProperties.USER_DIR);intstate=fileChooser.showOpenDialog(this);/彈出文件選擇對話框if(state=fileChooser.APPROVE_OPTION)/如果用戶選定了文件Filefile=fileChooser.getSelectedFile();/獲取選擇的文件/構(gòu)建打印請求屬性集P

23、rintRequestAttributeSetpras=newHashPrintRequestAttributeSet();/設(shè)置打印格式,因為未確定文件類型,這里選擇AUTOSENSEDocFlavorflavor=DocFlavor.INPUT_STREAM.AUTOSENSE;/查找所有的可用打印服務(wù)PrintServiceprintService=PrintServiceLookup.lookupPrintServices(flavor,pras);/定位默認(rèn)的打印服務(wù)PrintServicedefaultService=PrintServiceLookup.lookupDefaultPrintService();/顯示打印對話框PrintServiceservice=ServiceUI.printDialog(null,200,200,printService,defaultService,flavor,pras);if(service!=null)tryDocPrintJobjob=service.createPrintJob();/創(chuàng)建打印作業(yè)FileInputStream

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論