日期:2014-05-16  浏览次数:20899 次

Jasperreport+applet实现客户端打印
需求:Web应用中,在客户端实现打印功能

可能遇到的问题:

  • 64bit系统装64bit的jre但是不好使
  • 装32bit的jre就好了
  • 打印时出现invalid header
  • 有可能是编译文件时的Jasperreport的jar版本和运行时的不一样
  • 打印出出现“attribute 'uuid' is not allowed to appear in element 'jasperreport'”
  • 打开JRXML文件,用正则表达式搜索uuid="\w*-\w*-\w*-\w*-\w*",全部删除
  • applet访问权限受限
  • 在jre的lib\security\java.policy中的grant {...}代码块中增加
  • permission java.security.AllPermission;
    permission java.net.SocketPermission "*", "accept, connect, listen, resolve";


思路:

  • 利用iReport制作模版
  • 写后台代码,得到JasperPrint并输出到Servlet的流中
  • 用applet接受流,并调用打印机打印


使用的框架、设备、环境:

  • Spring MVC
  • Spring Tool Suite(Eclipse系列的,Eclipse穿了个马甲)
  • 打印机EPSON LQ-630K


资源:


  • 报表设计软件,用于制作模版,我使用的是iReport-5.0.0-windows-installer
  • http://sourceforge.net/projects/ireport/files/iReport/iReport-5.0.0/
  • EPSON LQ-630K驱动http://epson.com.cn/



正文:

1. 制作模版

1.1 准备工作
  • 新建一个类,包含需要打印的信息,比如EntityDto,注意要有setter和getter方法

  • public class EntityDto {
    
    	private String name;			
    	
    	private String pwd;	
    	
    	public EntityDto(){
    	}
    	
    	public EntityDto(String name, String pwd){
    		this.name = name;
    		this.pwd = pwd;
    	}	
    	//setter和getter方法,一定要有
    }
    

  • 新建一个类,其中包含可以产生Collection<EntityDto>的方法

  • public class EntityDtoFactory {
    	
    	//方法参数可以自行设定
    	public static Collection<EntityDto> getBeanCollection() throws SSException {
    		List<EntityDto> entityDtos = new ArrayList<EntityDto>();
    		
    		//自行定义获取结果方法,这里仅仅是一个示例
    		entityDtos.add(new EntityDto("notesth","name for short"));
    		entityDtos.add(new EntityDto("notesomething","full name"));
    		
    		return entityDtos;
    	}
    
    }
    

  • 引入需要的jar,由于自己做的是maven工程,所以只需在pom文件中增加依赖

  • <!-- 为了解决此包冲突,提前引入 -->
    <dependency>
    	<groupId>commons-collections</groupId>
    	<artifactId>commons-collections</artifactId>
    	<version>3.1</version>
    </dependency>
    
    <!-- 解决打印时条形码异常类找不到 -->
    <dependency>
    	<groupId>net.sourceforge.barbecue</groupId>
    	<artifactId>barbecue</artifactId>
    	<version>1.5-beta1</version>
    </dependency>
    
    
    <!-- 关于打印部分 -->
    <dependency>
    	<groupId>net.sf.jasperreports</groupId>
    	<artifactId>jasperreports</artifactId>
    	<version>4.5.1</version>
    </dependency>
    
    <dependency>
    	<groupId>org.codehaus.groovy</groupId>
    	<artifactId>groovy-all</artifactId>
    	<version>1.7.5</version>
    </dependency>
    
    <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>itext-asian</artifactId>
    	<version>5.2.0</version>
    </dependency>
    
    <dependency>	
    	<groupId>com.lowagie</groupId>
    	<artifactId>itext</artifactId>
    	<version>2.1.7</version>
    </dependency>
    

  • 编写负责打印的类的代码
  • public class PrintService(){
    	
    	//需要参数自行设定
    	public JasperPrint print() {
    		
    		//把制作好的模版文件放在工程的Class文件夹的/iReportTemplate中,比如名字叫report.jrxml,这个文件会在之后制作
    		InputStream in = readFile("/iReportTemplate/report.jrxml");
        	
    		Map<String, Object> parameters = new HashMap<String, Object>();
    
    		try{
    			// 设定数据源
    			JRDataSource dataSource = new JRBeanCollectionDataSource(
    					EntityDtoFactory.getBeanCollection());
    			// 编译jrxml文件
    			JasperReport jasperReport = JasperCompileManager
    					.compileReport(in);
    			
    			// 填充数据
    			JasperPrint jasperPrint = JasperFillManager.fillReport(
    					jasperReport, parameters, dataSource);
    
    		}catch (JRException e){
    			e.printStackTrace();
    		}
    		catch (Exception