用Java实现打印_第1页
用Java实现打印_第2页
用Java实现打印_第3页
用Java实现打印_第4页
用Java实现打印_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用java实现打印,java.awt中提供了一些打印的api,要实现打印,首先要获得打印对象,然后继承printable实现接口方法print,以便打印机进行打印,最后用用graphics2d直接输出直接输出。下面代码实现了简单的打印功能: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指明打印的图形环境 * param pagefor

4、mat指明打印页格式(页面大小以点为计量单位,1点为1英才的1/72,1英寸为25.4毫米。a4纸大致为595×842点) * 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、伟大民族。" /转换成graphics2d graphics2d g2 = (graphics2d) gra; /设置打印颜色为黑色 g2.setcolor(color.black); /打印起点坐标 double x = pf.getimageablex(); double y = pf.getimageabley(); switch(pageindex) case 0: /设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称) /java平台所定义的五种字体系列:serif、sansserif、monospaced、dialog 和 dialoginput fo

6、nt font = new font("新宋体", font.plain, 9); g2.setfont(font);/设置字体 /basicstroke bs_3=new basicstroke(0.5f); float dash1 = 2.0f; /设置打印线的属性。 /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);/设置线宽 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(); / 设置成竖打 pageformat pf = new pageformat(); pf.setorientation(pageformat.portrait); / 通过paper

10、设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。 paper p = new paper(); p.setsize(590,840);/纸张大小 p.setimageablearea(10,10, 590,840);/a4(595 x 842)设置打印区域,其实0,0应该是72,72,因为a4纸的默认x,y边距是72 pf.setpaper(p); / 把 pageformat 和 printable 添加到书中,组成一个页面 book.append(new printtest(), pf); /获取打印服务对象 printerjob job = printerjob.getpri

11、nterjob(); / 设置打印类 job.setpageable(book); try /可以用printdialog显示打印对话框,在用户确认后打印;也可以直接打印 /boolean a=job.printdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 这个例子实现了打印字符串,线(包括虚线)和打印图片。而且通过paper的setimageablearea可以设置打印的区域和边距,让开发者随意的设置打印的位置。下面的打印代码没有设置打印区域,默认为打印纸张的区域和边距,比如

12、我们一般用的a4纸,打印的起点x和y坐标则是72,72。无区域设置的代码: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指明打印的图形环境 * param pageformat指明打印页格式(页面大小以点为计量单位,1点为1英才的1/72,1英寸为25.4毫米。a4纸大致为595×842点) * 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 = "中华民族是勤劳、勇敢和富有智慧的伟大民族。" /转换成graphics2d graphics2d g2 = (graphics2d) gra; /设置打印颜色为黑色 g2.setcolo

16、r(color.black); /*/*paper paper = pf.getpaper();/得到页面格式的纸张 paper.setsize(500,500);/纸张大小 paper.setimageablearea(0,0,500,500); /设置打印区域的大小 system.out.println(paper.getwidth(); system.out.println(paper.getheight(); pf.setpaper(paper);/将该纸张作为格式 */ /打印起点坐标 double x = pf.getimageablex(); double y = pf.geti

17、mageabley(); switch(pageindex) case 0: /设置打印字体(字体名称、样式和点大小)(字体名称可以是物理或者逻辑名称) /java平台所定义的五种字体系列:serif、sansserif、monospaced、dialog 和 dialoginput font font = new font("新宋体", font.plain, 9); g2.setfont(font);/设置字体 /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); /使用抗锯齿模式完成文本呈现 /*/*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- 直接构造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进行打印 /*/*attributedstring text = new attributedstring(str); text.addattribute(textattribute.font, font); linebreakmeasurer linebreaker = new linebreakmeasurer(

22、text.getiterator(), frc); /每行字符显示长度(点) 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) /获取打印服务对象 printerjob job = printerjob.getprinterjob(); pageformat pageformat = job.defaultpage();/得到默认页格式 job.setprintable(new printtest1();/设置打印类 try /可以用printdialog显示打印对话框,在用户确认后打印;也可以直接打印 /boolean a=job.pri

24、ntdialog(); /if(a) / job.print(); / catch (printerexception e) e.printstacktrace(); 1 目标功能    目前项目中的报表等方面都是直接通过ie打印。将数据转换成一个长字符串,然后经过javascript分割并填充到表格中。这种方法效率低并且难以进行格式定制。    有的客户希望能够通过word来打印,并且能够定制表头等方面。在每页都要显示固定的表头。并且支持多个表格打印在同一文件中。    系统需要一个通用的模块来完成这项

25、任务。    本模块就是为了这一目标来设计。 2 用例说明a 可通过一个模版来定制一份报表b 用户输入若干list数据,可以将每个list转换成一个表格  c 可定制页面头脚  d 可定制多个表格的头,并且表头固定于每一页  e 多个表格之间要进行分页  f 模版中可以定义表格样式  g 可以通过一个url生成一份报表  3 关键技术  a doc文件的生成:    doc文件格式是微软专利,用java很难直接生成doc文件。经过讨论与试验,发现ie可以将

26、任意一个后缀名为doc的html文档当作word来打开。因此,采用生成html的方式来取代word生成。待生成doc文件格式不是难题的时候,可以通过修改实现来完成。 b 固定表头    经过试验,在word中固定表头可以通过<thead>标签来完成。而将<caption>标签放入<thead>,可以实现每页都显示表名在顶部。c 表间分页    表间分页在word中是通过一个样式来指定的。<p style=”page-break:always”>   d 对任

27、意list生成表格    对任意list生成表格,要求list中的对象必须是标准的javabean对象,即只有get,set方法的对象。生成表格将依照模版中对该javabean的属性名称的引用而成。如getname(),则在模版中写#name#。这项功能通过jakarta的commons-beanutils包来实现。e xml模版    定制模版采用xml文件,其格式参见下文。xml解析通过dom4j来实现。这个包的特点是灵活易用,速度比jdom要快。4 接口设计    本包主要由report,repor

28、tbuilder和templateparser三个接口组成。其中report是最终返回给用户的结果。reportbuilderfactory是建立reportbuilder的工厂。reportfacade是提供给调用者的代理方法。本包主要异常为reportexception,是unchecked exception。    5 使用方式    使用实例请参见demoservlet.java  a 通过模版建立文档报表printwriter out = response.getwriter(); / 建立新的docu

29、mentbuilder,工厂方法,现在仅支持word参数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(); / 构造数据,其中的数据必须是javabean形式. list.add(javabean) . / simpletable应改与模版中的表格名称一致,如id="simpletable"builder.adddata(list1, "simpletable");builder.adddata(list2, "styledtable"); / 构造并返回内容,默认将采用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,工厂方法,现在仅支持word参数reportbuilder builder = reportbuilderfactory.getbuilder("word"); / 构造reportreport report = builder.buildreport(new url(""); 

32、/ 输出report.print(system.out); 6 设计类图com.zotn.util.report.wordimpl是上述接口的word/xhtml实现。其主要是运用dom4j解析模版,将数据与模版拼装,生成最终xhtml代码的过程。tree用于构建一个树形结构,保存模版生成的节点信息。xmltree是其实现类treenode,保存每个模版节点,xmltreenode是其实现类nodevisitor,遍历每个节点的visitor,每个功能对应一个nodevisitorgenericxmlparser,是templateparser的实现类,用于分析模版dataholde

33、r,用于保存原始输入数据reporthandler,实现了datahandler,用于处理输出结果并构造reportwordtablereportbuilder,reportbuilder的实现类7 已知缺陷    a 当前版本无法处理动态页码的问题。    b 不支持其他格式的输出    c 对于url的解析,无法处理相对路径的图片,样式表等。 8 第三方库dom4j; 用于xml解析    jakarta commons logging;用于记录日志 

34、   jakarta commons lang;用于字符串共用方法    jakarta commons beanutils;用于处理javabean    jakarta commons collections; beanutils需要    jakarta oro;处理正则表达式    9 相关软件    在主提供能已经完成的后,我偶然注意到了jasperreport这个开源项目。它是一个专业报表库,可将数据转换为html

35、,xml,pdf,xls等格式报表。也是通过定义一个模版来定制格式。因此,很不幸,我重新发明了轮子,而且还是个不圆的轮子。模版文件<?xml version='1.0' encoding='iso-8859-1'?><!- 默认采用iso-8859-1编码 -><!- root元素,一般不需要变 -><word>    <!- 页面头,内容可以写任意html,但尖括号应用&lt;&gt;代替 ->    <header&g

36、t;<!cdata    <p align="center">页头</p>    ></header>    <!- 第一个表格,表格别名用id表示 ->    <table id="simpletable">       <!- 表格数据 ->    &

37、#160;  <tbody>           <!- 每个td单元格内,写 #属性名# ,name属性表示表头->           <td name="名称">#name#</td>           <t

38、d name="颜色">#color#</td>           <td name="颜色">#price#</td>       </tbody>    </table>    <!- 第二个表格,表格参数(与html相同)可作为属性或节点添加 ->

39、60;   <table id="styledtable" width="600">       <!- 表格的样式,如边框宽度等可当作节点 ->       <style>color:blue;border:1px solid black</style>       <!- 复杂表头表格,tr表示行,th表示单元表格 ->       <thead>       <!- 固定表格头 ->           <caption style="color:red"><!cdata&#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论