博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot集成JasperReports生成PDF文档
阅读量:6861 次
发布时间:2019-06-26

本文共 7614 字,大约阅读时间需要 25 分钟。

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档。本人文采欠缺,写作能力差,下面粗略的介绍其使用步骤,若有不对的地方,望大家莫喷,谢谢!

一、使用Ireport designer 5.6设计模板

ireport的使用由于时间关系不便多说,设计好之后,将其进行编译生成jasper文件,然后将其拷贝放置于项目某个目录下,以供访问获取该文件。

二、在Spring Boot项目中引入依赖包

net.sf.jasperreports
jasperreports
6.0.0
net.sf.jasperreports
jasperreports-fonts
6.0.0
com.itextpdf
itextpdf
5.5.0
com.itextpdf
itext-pdfa
5.5.0
com.itextpdf
itext-asian
5.2.0
org.codehaus.groovy
groovy-all
2.4.11

三、自定义spring mvc通用导出PDF视图类PdfReportView(继承自AbstractView )

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.jasperreports.engine.JRDataSource;import net.sf.jasperreports.engine.JREmptyDataSource;import net.sf.jasperreports.engine.JasperExportManager;import net.sf.jasperreports.engine.JasperFillManager;import net.sf.jasperreports.engine.JasperPrint;import org.springframework.web.servlet.view.AbstractView;public class PdfReportView extends AbstractView {    private static final String CONTENT_TYPE = "application/pdf";    private String templatePath;    private String exportFileName;    public PdfReportView(String templatePath, String exportFileName) {        this.templatePath = templatePath;        if (exportFileName != null) {            try {                exportFileName = URLEncoder.encode(exportFileName, "UTF-8");            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        }        this.exportFileName = exportFileName;        setContentType(CONTENT_TYPE);    }    protected Map
getParamsMap(Map
map) throws Exception { Map
params = new HashMap<>(); for (String key : map.keySet()) { Object val = map.get(key); if (val instanceof JRDataSource) { continue; } else { params.put(key, val); } } return params; } protected JRDataSource getDataSource(Map
map) throws Exception { for (String key : map.keySet()) { Object val = map.get(key); if (val instanceof JRDataSource) { return (JRDataSource) map.get(key); } } return new JREmptyDataSource(); } @Override protected void renderMergedOutputModel(Map
map, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setCharacterEncoding("utf-8"); response.setContentType(getContentType()); //response.setContentType("application/octet-stream"); response.setHeader("content-disposition", "attachment;filename=" + exportFileName + ".pdf"); try (InputStream inputStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream(templatePath)) { try (OutputStream ouputStream = response.getOutputStream()) { JasperPrint jasperPrint = JasperFillManager .fillReport(inputStream, getParamsMap(map), getDataSource(map)); JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream); } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } }}

四、spring mvc调用案例

Map
map = new HashMap<>();List
> dataList = ....map.put("users", new JRMapCollectionDataSource(dataList));map.put("title", "报表名称");return new ModelAndView(new PdfReportView("templates/report/resume.jasper", "professors"),map);

五、解决linux下宋体渲染问题

1、在src/main/resources路径下新建jasperreports_extension.properties文件,内容如下:

net.sf.jasperreports.awt.ignore.missing.font=truenet.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactorynet.sf.jasperreports.extension.simple.font.families.dejavu=fonts/fonts.xml

2、在src/main/resources路径下新建fonts目录,并新建fonts.xml文件,内容如下:

net/sf/jasperreports/fonts/dejavu/DejaVuSans.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSans-Bold.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSans-Oblique.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSans-BoldOblique.ttf
Identity-H
true
'DejaVu Sans', Arial, Helvetica, sans-serif
'DejaVu Sans', Arial, Helvetica, sans-serif
net/sf/jasperreports/fonts/dejavu/DejaVuSerif.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Bold.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSerif-Italic.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSerif-BoldItalic.ttf
Identity-H
true
'DejaVu Serif', 'Times New Roman', Times, serif
'DejaVu Serif', 'Times New Roman', Times, serif
net/sf/jasperreports/fonts/dejavu/DejaVuSansMono.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Bold.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-Oblique.ttf
net/sf/jasperreports/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf
Identity-H
true
'DejaVu Sans Mono', 'Courier New', Courier, monospace
'DejaVu Sans Mono', 'Courier New', Courier, monospace
'DejaVu Sans', Arial, Helvetica, sans-serif
'DejaVu Sans', Arial, Helvetica, sans-serif
'DejaVu Serif', 'Times New Roman', Times, serif
'DejaVu Serif', 'Times New Roman', Times, serif
'DejaVu Sans Mono', 'Courier New', Courier, monospace
'DejaVu Sans Mono', 'Courier New', Courier, monospace
fonts/simsun.ttf
fonts/simsun.ttf
fonts/simsun.ttf
fonts/simsun.ttf
Identity-H
true
'宋体', Arial, Helvetica, sans-serif
'宋体', Arial, Helvetica, sans-serif

3、在src/main/resources/fonts目录放入宋体字体文件 simsun.ttf

转载地址:http://enhyl.baihongyu.com/

你可能感兴趣的文章
千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死...
查看>>
DataReader和DataSet区别
查看>>
揭秘 ClownFish 比手写代码还快的原因
查看>>
JAVA8 十大新特性详解
查看>>
高性能NIO框架Netty入门篇
查看>>
百度编辑器Ueditor 初始化加载内容失败解决办法
查看>>
AE套宗获取内环
查看>>
ios 开源代码
查看>>
在C++工程中设置全局函数
查看>>
2016第26周一
查看>>
codeforces水题100道 第十六题 Codeforces Round #164 (Div. 2) A. Games (brute force)
查看>>
二级联动菜单
查看>>
android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()...
查看>>
主成分分析(PCA)原理及R语言实现
查看>>
mybatis 一对多
查看>>
解读Raft(二 选举和日志复制)
查看>>
MySQL binlog
查看>>
Vertica 高可用性测试
查看>>
用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
查看>>
html 标签 中 的Lang 有什么用
查看>>