SpringBoot集成jasperreport实现打印功能


1.jaspersoft studio工具下载地址

下载直通车

2.工具使用方法查看以下链接

工具使用

3.将工具编译后的.jasper文件放到SpringBoot项目的resources/templates下

4.引入需要的jar


        net.sf.jasperreports
        jasperreports
        6.18.1
        
            
                com.lowagie
                itext
            
            
                com.fasterxml.jackson.core
                jackson-databind
            
            
                com.fasterxml.jackson.core
                jackson-annotations
            
            
                commons-beanutils
                commons-beanutils
            
            
                commons-collections
                commons-collections
            
            
                commons-logging
                commons-logging
            
        
    
    
        com.lowagie
        itext
        2.1.7
    
    
        org.codehaus.groovy
        groovy-all
        2.4.11
    
    
        net.sf.jasperreports
        jasperreports-fonts
        6.18.1
    
    
        com.itextpdf
        itext-pdfa
        5.5.0
    

ps:jasperreports 、jasperreports-fonts这两jar的版本取决于使用的jaspersoft studio工具的版本(一定要一致,否则可能出现类型转换异常)

5.pom文件配置

		
			${project.build.directory}/classes
			src/main/resources
			true
			
				**/*.jasper
				**/*.jrxml
			
		
		
			${project.build.directory}/classes
			src/main/resources
			false
			
				**/*.jasper
				**/*.jrxml
			
		

		
			maven-resources-plugin
			2.4
			
				${project.build.sourceEncoding}
				
					$
					@
				
				false
				${basedir}/target/classes/
				
					
					woff
					woff2
					eot
					ttf
					svg
					xlsx
					xls
					docx
					doc
					pdf
					jasper
				
			
		

ps:配置要有,否则可能会出现io异常

6.服务代码,我这里使用的是map传参的方式

//引入jasper文件
	ClassPathResource resource = new ClassPathResource("templates/collate.jasper");
	try {
		//文件输入流的两种获取方式
//			FileInputStream fis = new FileInputStream(resource.getFile());
		InputStream inputStream = resource.getInputStream();
		Map map = new HashMap<>();
         map.put("userName","zhangsan");
         map.put("pass","123456")
         /**查看底层代码发现JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource())
          *中有调用(JasperReport) JRLoader.loadObject(inputStream)所以在这里我注掉了
          *如果要使用(JasperReport) JRLoader.loadObject(inputStream)该方法
          *fillReport方法的参数改为JasperFillManager.fillReport(jasperReport, map,new JREmptyDataSource())
          */
//			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);
		//将数据源传递collate.jasper进行数据拼装
         //fillReport接口就是处理数据和.jasper文件交互的方法
		JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
		/**
		 *JasperCompileManager: 用于编译JRXML报表模板。
		 *JasperFillManager: 用于填充一个报表,从数据源的数据
		 *JasperPrintManager: 用于打印的JasperReports类库生成的文件
		 *JasperExportManager: 用于获取PDF,HTML或XML内容以供报表填充过程中产生的			  *文件
		 *JasperViewer: 它代表了一个简单的Java Swing应用程序,可以加载和显示报表。
		 *JasperDesignViewer: 用于在设计时预览报表模板。
		 */
		//调用打印方法
		JasperPrintManager.printReport(jasperPrint,true);
	} catch (Exception e) {
		e.printStackTrace();
	}

参数解释:
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
//参数1输入流,即读取的文件
//参数2数据map集合
//参数3数据源,我这里使用的是map传参所有数据源给的空数据源对象,必须要有数据源对象
//也可以使用数据源的方式调用,map给个空的hasmap即可,数据源即jdbc连接

7.项目设置

8.部署项目到linux时的字体问题解决


找到jasper文件中使用的字体,复制到项目resources/fonts下,并且在该目录下创建fonts.xml文件,fonts.xml文件内容为

<?xml version="1.0" encoding="UTF-8"?>


    fonts/STSONG.TTF
    fonts/STSONG.TTF
    fonts/STSONG.TTF
    fonts/STSONG.TTF
    Identity-H
    true
    
        '华文宋体', Arial, Helvetica, sans-serif
        '华文宋体', Arial, Helvetica, sans-serif
    


在resources下创建配置文件jasperreports.properties忽略字体检测,内容为:

net.sf.jasperreports.awt.ignore.missing.font=true

在resources下创建配置文件jasperreports_extension.properties指定使用的字体配置,内容为:

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml

9.以下在正常部署项目到linux中启动报错headlessException时使用

如果是在linux系统运行可以使用 nohup java -Djava.awt.headless=false -jar xxx.jar >catalina.out 2>&1 &