用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)行舉報(bào)或認(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紙大致為595×842點(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 = "中華民族是勤勞、勇敢和富有智慧的

5、偉大民族。" /轉(zhuǎn)換成graphics2d graphics2d 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 fo

6、nt font = new font("新宋體", font.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

7、_3);/設(shè)置線寬 float heigth = font.getsize2d();/字體高度 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,(i

8、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+

9、1*heigth+img_height+10); g2.drawimage(src,(int)x,(int)(y+1*heigth+img_height+11),c); return 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

10、設(shè)置頁面的空白邊距和可打印區(qū)域。必須與實(shí)際打印紙張大小相符。 paper p = new paper(); p.setsize(590,840);/紙張大小 p.setimageablearea(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 添加到書中,組成一個(gè)頁面 book.append(new printtest(), pf); /獲取打印服務(wù)對象 printerjob job = printerjob.getpri

11、nterjob(); / 設(shè)置打印類 job.setpageable(book); try /可以用printdialog顯示打印對話框,在用戶確認(rèn)后打印;也可以直接打印 /boolean a=job.printdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 這個(gè)例子實(shí)現(xiàn)了打印字符串,線(包括虛線)和打印圖片。而且通過paper的setimageablearea可以設(shè)置打印的區(qū)域和邊距,讓開發(fā)者隨意的設(shè)置打印的位置。下面的打印代碼沒有設(shè)置打印區(qū)域,默認(rèn)為打印紙張的區(qū)域和邊距,比如

12、我們一般用的a4紙,打印的起點(diǎn)x和y坐標(biāo)則是72,72。無區(qū)域設(shè)置的代碼: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 java.awt.toolkit;import java.awt.renderinghints;import java.awt.font.fontrendercontex

13、t;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.print.pageformat;import java.awt.print.paper;import java.awt.print.printable;import

14、java.awt.print.printerexception;import java.awt.print.printerjob;import java.text.attributedstring;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紙大致為595×842點(diǎn)) * param pageind

15、ex指明頁號 */ 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 graphics2d g2 = (graphics2d) gra; /設(shè)置打印顏色為黑色 g2.setcolo

16、r(color.black); /*/*paper paper = pf.getpaper();/得到頁面格式的紙張 paper.setsize(500,500);/紙張大小 paper.setimageablearea(0,0,500,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.geti

17、mageabley(); switch(pageindex) case 0: /設(shè)置打印字體(字體名稱、樣式和點(diǎn)大小)(字體名稱可以是物理或者邏輯名稱) /java平臺所定義的五種字體系列:serif、sansserif、monospaced、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 ba

18、sicstroke(0.5f, basicstroke.cap_butt, basicstroke.join_miter, 4.0f, dash1, 0.0f); float heigth = font.getsize2d();/字體高度 system.out.println("x="+x); /使用抗鋸齒模式完成文本呈現(xiàn) /*/*g2.setrenderinghint(renderinghints.key_text_antialiasing, renderinghints.value_text_antialias_on);*/ / -1- 用graphics2d直接輸出

19、/首字符的基線(右下部)位于用戶空間中的 (x, y) 位置處 /g2.drawline(10,10,200,10); image src = toolkit.getdefaulttoolkit().getimage("d:/logo.gif"); g2.drawimage(src,(int)x,(int)y,c); int img_height=src.getheight(c); int img_width=src.getwidth(c); /system.out.println("img_height="+img_height+"img_w

20、idth="+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); / -2- 直接構(gòu)造textlayout打印 /*/*fontrendercontext frc = g2.getfont

21、rendercontext(); textlayout layout = new textlayout(str, font, frc); layout.draw(g2, (float)x, (float)y+2*heigth);*/ / -3- 用linebreakmeasurer進(jìn)行打印 /*/*attributedstring text = new attributedstring(str); text.addattribute(textattribute.font, font); linebreakmeasurer linebreaker = new linebreakmeasurer(

22、text.getiterator(), frc); /每行字符顯示長度(點(diǎn)) double width = pf.getimageablewidth(); /首字符的基線位于用戶空間中的 (x, y) 位置處 point2d.double pen = new point2d.double (100, y+3*heigth); while ( (layout = linebreaker.nextlayout( (float) width) != null) layout.draw(g2, (float)x, (float) pen.y); pen.y += layout.getascent();

23、 */ return page_exists; default: return no_such_page; public static void main(string args) /獲取打印服務(wù)對象 printerjob job = printerjob.getprinterjob(); pageformat pageformat = job.defaultpage();/得到默認(rèn)頁格式 job.setprintable(new printtest1();/設(shè)置打印類 try /可以用printdialog顯示打印對話框,在用戶確認(rèn)后打印;也可以直接打印 /boolean a=job.pri

24、ntdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 1 目標(biāo)功能    目前項(xiàng)目中的報(bào)表等方面都是直接通過ie打印。將數(shù)據(jù)轉(zhuǎn)換成一個(gè)長字符串,然后經(jīng)過javascript分割并填充到表格中。這種方法效率低并且難以進(jìn)行格式定制。    有的客戶希望能夠通過word來打印,并且能夠定制表頭等方面。在每頁都要顯示固定的表頭。并且支持多個(gè)表格打印在同一文件中。    系統(tǒng)需要一個(gè)通用的模塊來完成這項(xiàng)

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

26、任意一個(gè)后綴名為doc的html文檔當(dāng)作word來打開。因此,采用生成html的方式來取代word生成。待生成doc文件格式不是難題的時(shí)候,可以通過修改實(shí)現(xiàn)來完成。 b 固定表頭    經(jīng)過試驗(yàn),在word中固定表頭可以通過<thead>標(biāo)簽來完成。而將<caption>標(biāo)簽放入<thead>,可以實(shí)現(xiàn)每頁都顯示表名在頂部。c 表間分頁    表間分頁在word中是通過一個(gè)樣式來指定的。<p style=”page-break:always”>   d 對任

27、意list生成表格    對任意list生成表格,要求list中的對象必須是標(biāo)準(zhǔn)的javabean對象,即只有g(shù)et,set方法的對象。生成表格將依照模版中對該javabean的屬性名稱的引用而成。如getname(),則在模版中寫#name#。這項(xiàng)功能通過jakarta的commons-beanutils包來實(shí)現(xiàn)。e xml模版    定制模版采用xml文件,其格式參見下文。xml解析通過dom4j來實(shí)現(xiàn)。這個(gè)包的特點(diǎn)是靈活易用,速度比jdom要快。4 接口設(shè)計(jì)    本包主要由report,repor

28、tbuilder和templateparser三個(gè)接口組成。其中report是最終返回給用戶的結(jié)果。reportbuilderfactory是建立reportbuilder的工廠。reportfacade是提供給調(diào)用者的代理方法。本包主要異常為reportexception,是unchecked exception。    5 使用方式    使用實(shí)例請參見demoservlet.java  a 通過模版建立文檔報(bào)表printwriter out = response.getwriter(); / 建立新的docu

29、mentbuilder,工廠方法,現(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 arr

30、aylist(); / 構(gòu)造數(shù)據(jù),其中的數(shù)據(jù)必須是javabean形式. list.add(javabean) . / simpletable應(yīng)改與模版中的表格名稱一致,如id="simpletable"builder.adddata(list1, "simpletable");builder.adddata(list2, "styledtable"); / 構(gòu)造并返回內(nèi)容,默認(rèn)將采用iso-8859-1編碼report doc = builder.buildreport(); / 輸出或保存d

31、oc.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 = builder.buildreport(new url(""); 

32、/ 輸出report.print(system.out); 6 設(shè)計(jì)類圖com.zotn.util.report.wordimpl是上述接口的word/xhtml實(shí)現(xiàn)。其主要是運(yùn)用dom4j解析模版,將數(shù)據(jù)與模版拼裝,生成最終xhtml代碼的過程。tree用于構(gòu)建一個(gè)樹形結(jié)構(gòu),保存模版生成的節(jié)點(diǎn)信息。xmltree是其實(shí)現(xiàn)類treenode,保存每個(gè)模版節(jié)點(diǎn),xmltreenode是其實(shí)現(xiàn)類nodevisitor,遍歷每個(gè)節(jié)點(diǎn)的visitor,每個(gè)功能對應(yīng)一個(gè)nodevisitorgenericxmlparser,是templateparser的實(shí)現(xiàn)類,用于分析模版dataholde

33、r,用于保存原始輸入數(shù)據(jù)reporthandler,實(shí)現(xiàn)了datahandler,用于處理輸出結(jié)果并構(gòu)造reportwordtablereportbuilder,reportbuilder的實(shí)現(xiàn)類7 已知缺陷    a 當(dāng)前版本無法處理動(dòng)態(tài)頁碼的問題。    b 不支持其他格式的輸出    c 對于url的解析,無法處理相對路徑的圖片,樣式表等。 8 第三方庫dom4j; 用于xml解析    jakarta commons logging;用于記錄日志 

34、   jakarta commons lang;用于字符串共用方法    jakarta commons beanutils;用于處理javabean    jakarta commons collections; beanutils需要    jakarta oro;處理正則表達(dá)式    9 相關(guān)軟件    在主提供能已經(jīng)完成的后,我偶然注意到了jasperreport這個(gè)開源項(xiàng)目。它是一個(gè)專業(yè)報(bào)表庫,可將數(shù)據(jù)轉(zhuǎn)換為html

35、,xml,pdf,xls等格式報(bào)表。也是通過定義一個(gè)模版來定制格式。因此,很不幸,我重新發(fā)明了輪子,而且還是個(gè)不圓的輪子。模版文件<?xml version='1.0' encoding='iso-8859-1'?><!- 默認(rèn)采用iso-8859-1編碼 -><!- root元素,一般不需要變 -><word>    <!- 頁面頭,內(nèi)容可以寫任意html,但尖括號應(yīng)用&lt;&gt;代替 ->    <header&g

36、t;<!cdata    <p align="center">頁頭</p>    ></header>    <!- 第一個(gè)表格,表格別名用id表示 ->    <table id="simpletable">       <!- 表格數(shù)據(jù) ->    &

37、#160;  <tbody>           <!- 每個(gè)td單元格內(nèi),寫 #屬性名# ,name屬性表示表頭->           <td name="名稱">#name#</td>           <t

38、d name="顏色">#color#</td>           <td name="顏色">#price#</td>       </tbody>    </table>    <!- 第二個(gè)表格,表格參數(shù)(與html相同)可作為屬性或節(jié)點(diǎn)添加 ->

39、60;   <table id="styledtable" width="600">       <!- 表格的樣式,如邊框?qū)挾鹊瓤僧?dāng)作節(jié)點(diǎn) ->       <style>color:blue;border:1px solid black</style>       <!- 復(fù)雜表頭表格,tr表示行,th表示單元表格 ->       <thead>       <!- 固定表格頭 ->           <caption style="color:red"><!cdata&#

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論