需求:Web应用中,在客户端实现打印功能
可能遇到的问题:
[list]
[*][b]64bit系统装64bit的jre但是不好使[/b]
[*]装32bit的jre就好了
[*][b]打印时出现invalid header[/b]
[*]有可能是编译文件时的Jasperreport的jar版本和运行时的不一样
[*][b]打印出出现“attribute 'uuid' is not allowed to appear in element 'jasperreport'”[/b]
[*]打开JRXML文件,用正则表达式搜索uuid="\w*-\w*-\w*-\w*-\w*",全部删除
[*][b]applet访问权限受限[/b]
[*]在jre的lib\security\java.policy中的grant {...}代码块中增加
permission java.security.AllPermission;
permission java.net.SocketPermission "*", "accept, connect, listen, resolve";
[/list]
思路:
[list]
[*]利用iReport制作模版
[*]写后台代码,得到JasperPrint并输出到Servlet的流中
[*]用applet接受流,并调用打印机打印
[/list]
使用的框架、设备、环境:
[list]
[*]Spring MVC
[*]Spring Tool Suite(Eclipse系列的,Eclipse穿了个马甲)
[*]打印机EPSON LQ-630K
[/list]
资源:
[list]
[*]报表设计软件,用于制作模版,我使用的是iReport-5.0.0-windows-installer
[url]http://sourceforge.net/projects/ireport/files/iReport/iReport-5.0.0/[/url]
[*]EPSON LQ-630K驱动[url]http://epson.com.cn/[/url]
[/list]
正文:
1. 制作模版
1.1 准备工作
[*]新建一个类,包含需要打印的信息,比如EntityDto,注意要有setter和getter方法
[*]新建一个类,其中包含可以产生Collection<EntityDto>的方法
[*] 引入需要的jar,由于自己做的是maven工程,所以只需在pom文件中增加依赖
[*]编写负责打印的类的代码
1.2 制作模版
[list]
[*]首先安装iReport-5.0.0-windows-installer
[*]新建一个report,如果没有特殊要求就不用选择其他样式的模版,全点击“下一步”
[*]在选项卡中选择“工具”--“选项”--“Classpath”,把编译好的EntityDto所在的jar(没有就打一个jar,如果添加文件夹自己试了不好用,原因不明)添加到其中
[*]在主面板中,在“Preview”的右侧有一个类似数据库似的图标,点击,选择“JavaBeans Datasource”的选项卡,在输入框中输入类的全名(包括所在包路径),点击“Read attributes”,选择需要的属性,然后点击“Add selected field(s)”,确认
[*]在左侧Fields的列表中就可以看到需要的属性了,然后点击把他们拖过来就可以了
[*]点击preview,如果没有什么问题就把report.jrxml,report.jasper都拷贝到工程资源文件下的iReportTemplate目录中
[/list]
2. 准备打印机
[list]
[*]安装驱动
[/list]
3. 使用applet打印
如果现在直接调用代码打印会在服务端打印,由于自己开发的时候是服务端和客户端一体,所以可能忽略这个错误。
[b]注意:这个类一定要放在工程的根目录,也就是不存在任何包中,虽然有点不科学,但是在调用的时候如果有包路径是不好使的[/b]
[*] 写applet类
[*]使用mvc的控制器得到流
[*]编写html代码
最后把编译好的JRPrinterApplet类放在和html同一个文件夹下即可访问,另外注意archive中有的几个包也要和html放在同样的文件夹中