用Java實(shí)現(xiàn)打印_第1頁
用Java實(shí)現(xiàn)打印_第2頁
用Java實(shí)現(xiàn)打印_第3頁
用Java實(shí)現(xiàn)打印_第4頁
用Java實(shí)現(xiàn)打印_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、用java實(shí)現(xiàn)打印,java.awt中提供了一些打印的api,要實(shí)現(xiàn)打印,首先要獲得打印對象,然后繼承printable實(shí)現(xiàn)接口方法print,以便打印機(jī)進(jìn)行打印,最后用用graphics2d直接輸出直接輸出。下面代碼實(shí)現(xiàn)了簡單的打印功能:import java.awt.basicstroke;import java.awt.color;import java.awt.component;import java.awt.font;import java.awt.graphics;import java.awt.graphics2d;import java.awt.image;import ja

2、va.awt.toolkit;import java.awt.renderinghints;import java.awt.font.fontrendercontext;import java.awt.font.linebreakmeasurer;import java.awt.font.textattribute;import java.awt.font.textlayout;import java.awt.geom.point2d;import java.awt.image.bufferedimage;import java.awt.print.book;import java.awt.p

3、rint.pageformat;import java.awt.print.paper;import java.awt.print.printable;import java.awt.print.printerexception;import java.awt.print.printerjob;import java.text.attributedstring;import javax.swing.japplet;public class printtest implements printable /* */* * param graphic指明打印的圖形環(huán)境 * param pagefor

4、mat指明打印頁格式(頁面大小以點(diǎn)為計(jì)量單位,1點(diǎn)為1英才的1/72,1英寸為25.4毫米。a4紙大致為595842點(diǎn)) * param pageindex指明頁號 */ public int print(graphics gra, pageformat pf, int pageindex) throws printerexception system.out.println(pageindex=+pageindex); component c = null; /print string string str = 中華民族是勤勞、勇敢和富有智慧的偉大民族。; /轉(zhuǎn)換成graphics2d gr

5、aphics2d g2 = (graphics2d) gra; /設(shè)置打印顏色為黑色 g2.setcolor(color.black); /打印起點(diǎn)坐標(biāo) double x = pf.getimageablex(); double y = pf.getimageabley(); switch(pageindex) case 0: /設(shè)置打印字體(字體名稱、樣式和點(diǎn)大?。ㄗ煮w名稱可以是物理或者邏輯名稱) /java平臺所定義的五種字體系列:serif、sansserif、monospaced、dialog 和 dialoginput font font = new font(新宋體, font.

6、plain, 9); g2.setfont(font);/設(shè)置字體 /basicstroke bs_3=new basicstroke(0.5f); float dash1 = 2.0f; /設(shè)置打印線的屬性。 /1.線寬 2、3、不知道,4、空白的寬度,5、虛線的寬度,6、偏移量 g2.setstroke(new basicstroke(0.5f, basicstroke.cap_butt, basicstroke.join_miter, 2.0f, dash1, 0.0f); /g2.setstroke(bs_3);/設(shè)置線寬 float heigth = font.getsize2d()

7、;/字體高度 system.out.println(x=+x); / -1- 用graphics2d直接輸出 /首字符的基線(右下部)位于用戶空間中的 (x, y) 位置處 /g2.drawline(10,10,200,300); image src = toolkit.getdefaulttoolkit().getimage(d:eclipseworkspace3.1kfc-wuxiwebrootimagekfc.jpg); g2.drawimage(src,(int)x,(int)y,c); int img_height=src.getheight(c); int img_width=sr

8、c.getwidth(c); /system.out.println(img_height=+img_height+img_width=+img_width) ; g2.drawstring(str, (float)x, (float)y+1*heigth+img_height); g2.drawline(int)x,(int)(y+1*heigth+img_height+10),(int)x+200,(int)(y+1*heigth+img_height+10); g2.drawimage(src,(int)x,(int)(y+1*heigth+img_height+11),c); retu

9、rn page_exists; default: return no_such_page; public static void main(string args) / 通俗理解就是書、文檔 book book = new book(); / 設(shè)置成豎打 pageformat pf = new pageformat(); pf.setorientation(pageformat.portrait); / 通過paper設(shè)置頁面的空白邊距和可打印區(qū)域。必須與實(shí)際打印紙張大小相符。 paper p = new paper(); p.setsize(590,840);/紙張大小 p.setimage

10、ablearea(10,10, 590,840);/a4(595 x 842)設(shè)置打印區(qū)域,其實(shí)0,0應(yīng)該是72,72,因?yàn)閍4紙的默認(rèn)x,y邊距是72 pf.setpaper(p); / 把 pageformat 和 printable 添加到書中,組成一個頁面 book.append(new printtest(), pf); /獲取打印服務(wù)對象 printerjob job = printerjob.getprinterjob(); / 設(shè)置打印類 job.setpageable(book); try /可以用printdialog顯示打印對話框,在用戶確認(rèn)后打?。灰部梢灾苯哟蛴?/bo

11、olean a=job.printdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 這個例子實(shí)現(xiàn)了打印字符串,線(包括虛線)和打印圖片。而且通過paper的setimageablearea可以設(shè)置打印的區(qū)域和邊距,讓開發(fā)者隨意的設(shè)置打印的位置。下面的打印代碼沒有設(shè)置打印區(qū)域,默認(rèn)為打印紙張的區(qū)域和邊距,比如我們一般用的a4紙,打印的起點(diǎn)x和y坐標(biāo)則是72,72。無區(qū)域設(shè)置的代碼:import java.awt.basicstroke;import java.awt.color;im

12、port java.awt.component;import java.awt.font;import java.awt.graphics;import java.awt.graphics2d;import java.awt.image;import java.awt.toolkit;import java.awt.renderinghints;import java.awt.font.fontrendercontext;import java.awt.font.linebreakmeasurer;import java.awt.font.textattribute;import java.a

13、wt.font.textlayout;import java.awt.geom.point2d;import java.awt.image.bufferedimage;import java.awt.print.book;import java.awt.print.pageformat;import java.awt.print.paper;import java.awt.print.printable;import java.awt.print.printerexception;import java.awt.print.printerjob;import java.text.attribu

14、tedstring;import javax.swing.japplet;public class printtest1 implements printable /* */* * param graphic指明打印的圖形環(huán)境 * param pageformat指明打印頁格式(頁面大小以點(diǎn)為計(jì)量單位,1點(diǎn)為1英才的1/72,1英寸為25.4毫米。a4紙大致為595842點(diǎn)) * param pageindex指明頁號 */ public int print(graphics gra, pageformat pf, int pageindex) throws printerexception

15、system.out.println(pageindex=+pageindex); component c = null; /print string string str = 中華民族是勤勞、勇敢和富有智慧的偉大民族。; /轉(zhuǎn)換成graphics2d graphics2d g2 = (graphics2d) gra; /設(shè)置打印顏色為黑色 g2.setcolor(color.black); /*/*paper paper = pf.getpaper();/得到頁面格式的紙張 paper.setsize(500,500);/紙張大小 paper.setimageablearea(0,0,500

16、,500); /設(shè)置打印區(qū)域的大小 system.out.println(paper.getwidth(); system.out.println(paper.getheight(); pf.setpaper(paper);/將該紙張作為格式 */ /打印起點(diǎn)坐標(biāo) double x = pf.getimageablex(); double y = pf.getimageabley(); switch(pageindex) case 0: /設(shè)置打印字體(字體名稱、樣式和點(diǎn)大?。ㄗ煮w名稱可以是物理或者邏輯名稱) /java平臺所定義的五種字體系列:serif、sansserif、monospa

17、ced、dialog 和 dialoginput font font = new font(新宋體, font.plain, 9); g2.setfont(font);/設(shè)置字體 /basicstroke bs_3=new basicstroke(0.5f); float dash1 = 4.0f; g2.setstroke(new basicstroke(0.5f, basicstroke.cap_butt, basicstroke.join_miter, 4.0f, dash1, 0.0f); float heigth = font.getsize2d();/字體高度 system.out

18、.println(x=+x); /使用抗鋸齒模式完成文本呈現(xiàn) /*/*g2.setrenderinghint(renderinghints.key_text_antialiasing, renderinghints.value_text_antialias_on);*/ / -1- 用graphics2d直接輸出 /首字符的基線(右下部)位于用戶空間中的 (x, y) 位置處 /g2.drawline(10,10,200,10); image src = toolkit.getdefaulttoolkit().getimage(d:/logo.gif); g2.drawimage(src,(i

19、nt)x,(int)y,c); int img_height=src.getheight(c); int img_width=src.getwidth(c); /system.out.println(img_height=+img_height+img_width=+img_width) ; g2.drawstring(str, (float)x, (float)y+1*heigth+img_height); g2.drawline(int)x,(int)(y+1*heigth+img_height+10),(int)x+200,(int)(y+1*heigth+img_height+10);

20、 g2.drawimage(src,(int)x,(int)(y+1*heigth+img_height+11),c); / -2- 直接構(gòu)造textlayout打印 /*/*fontrendercontext frc = g2.getfontrendercontext(); textlayout layout = new textlayout(str, font, frc); layout.draw(g2, (float)x, (float)y+2*heigth);*/ / -3- 用linebreakmeasurer進(jìn)行打印 /*/*attributedstring text = new

21、attributedstring(str); text.addattribute(textattribute.font, font); linebreakmeasurer linebreaker = new linebreakmeasurer(text.getiterator(), frc); /每行字符顯示長度(點(diǎn)) double width = pf.getimageablewidth(); /首字符的基線位于用戶空間中的 (x, y) 位置處 point2d.double pen = new point2d.double (100, y+3*heigth); while ( (layou

22、t = linebreaker.nextlayout( (float) width) != null) layout.draw(g2, (float)x, (float) pen.y); pen.y += layout.getascent(); */ return page_exists; default: return no_such_page; public static void main(string args) /獲取打印服務(wù)對象 printerjob job = printerjob.getprinterjob(); pageformat pageformat = job.defa

23、ultpage();/得到默認(rèn)頁格式 job.setprintable(new printtest1();/設(shè)置打印類 try /可以用printdialog顯示打印對話框,在用戶確認(rèn)后打?。灰部梢灾苯哟蛴?/boolean a=job.printdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 1 目標(biāo)功能 目前項(xiàng)目中的報表等方面都是直接通過ie打印。將數(shù)據(jù)轉(zhuǎn)換成一個長字符串,然后經(jīng)過javascript分割并填充到表格中。這種方法效率低并且難以進(jìn)行格式定制。 有的客戶希望能夠通

24、過word來打印,并且能夠定制表頭等方面。在每頁都要顯示固定的表頭。并且支持多個表格打印在同一文件中。 系統(tǒng)需要一個通用的模塊來完成這項(xiàng)任務(wù)。 本模塊就是為了這一目標(biāo)來設(shè)計(jì)。2 用例說明a 可通過一個模版來定制一份報表b 用戶輸入若干list數(shù)據(jù),可以將每個list轉(zhuǎn)換成一個表格 c 可定制頁面頭腳 d 可定制多個表格的頭,并且表頭固定于每一頁 e 多個表格之間要進(jìn)行分頁 f 模版中可以定義表格樣式 g 可以通過一個url生成一份報表 3 關(guān)鍵技術(shù) a doc文件的生成: doc文件格式是微軟專利,用java很難直接生成doc文件。經(jīng)過討論與試驗(yàn),發(fā)現(xiàn)ie可以將任意一個后綴名為doc的html

25、文檔當(dāng)作word來打開。因此,采用生成html的方式來取代word生成。待生成doc文件格式不是難題的時候,可以通過修改實(shí)現(xiàn)來完成。b 固定表頭 經(jīng)過試驗(yàn),在word中固定表頭可以通過標(biāo)簽來完成。而將標(biāo)簽放入,可以實(shí)現(xiàn)每頁都顯示表名在頂部。c 表間分頁 表間分頁在word中是通過一個樣式來指定的。 d 對任意list生成表格 對任意list生成表格,要求list中的對象必須是標(biāo)準(zhǔn)的javabean對象,即只有g(shù)et,set方法的對象。生成表格將依照模版中對該javabean的屬性名稱的引用而成。如getname(),則在模版中寫#name#。這項(xiàng)功能通過jakarta的commons-bean

26、utils包來實(shí)現(xiàn)。e xml模版 定制模版采用xml文件,其格式參見下文。xml解析通過dom4j來實(shí)現(xiàn)。這個包的特點(diǎn)是靈活易用,速度比jdom要快。4 接口設(shè)計(jì) 本包主要由report,reportbuilder和templateparser三個接口組成。其中report是最終返回給用戶的結(jié)果。reportbuilderfactory是建立reportbuilder的工廠。reportfacade是提供給調(diào)用者的代理方法。本包主要異常為reportexception,是unchecked exception。 5 使用方式 使用實(shí)例請參見demoservlet.java a 通過模版建立文

27、檔報表printwriter out = response.getwriter();/ 建立新的documentbuilder,工廠方法,現(xiàn)在僅支持word參數(shù)reportbuilder builder = reportbuilderfactory.getbuilder(word);/ 為template建立inputstreaminputstream is = new fileinputstream(new file(d:template.xml);/ 將is給builderbuilder.settemplate(is);/ 建造listlist list = new arraylist()

28、;/ 構(gòu)造數(shù)據(jù),其中的數(shù)據(jù)必須是javabean形式. list.add(javabean) ./ simpletable應(yīng)改與模版中的表格名稱一致,如id=simpletablebuilder.adddata(list1, simpletable);builder.adddata(list2, styledtable);/ 構(gòu)造并返回內(nèi)容,默認(rèn)將采用iso-8859-1編碼report doc = builder.buildreport();/ 輸出或保存doc.save(new file(d:a.doc), iso-8859-1);doc.print(out); b 通過url建立文檔/ 建立新的documentbuilder,工廠方法,現(xiàn)在僅支持word參數(shù)reportbuilder builder = reportbuilderfactory.getbuilder(word);/ 構(gòu)造reportreport report =

溫馨提示

  • 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

提交評論