文章目录
- 一、前言
- 二、后端代码
- 1、pom依赖
- 2、Jaspersoft Studio生成的jasper文件
- 3、main程序测试案例
- 4、解决中文不显示问题
- 5、web接口案例
- 三、Vue前端代码
- 四、演示效果
一、前言
以前,在流行jdk1.6的时候,作pdf报表,用的软件是iReport。
后来,主流jdk升级到1.8后,这个,软件就停止更新了。
现在使用的是JasperReport Studio
下载Jaspersoft Studio 6
链接:https://pan.baidu.com/s/1mgkRC5qnz74k8AwdOMZqYQ
提取码:cwqb
二、后端代码
1、pom依赖
网上说一大堆的依赖,其实,只需要一个即可。
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.17.0</version>
</dependency>
2、Jaspersoft Studio生成的jasper文件
3、main程序测试案例
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import org.springframework.util.ResourceUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
public class Test01 {
public static void main(String[] args) throws FileNotFoundException, JRException {
File file = ResourceUtils.getFile("classpath:templates/test01.jasper");
Map<String,Object> params = new HashMap<>();
params.put("username","张三");
params.put("email","123456@qq.com");
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), params, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint,"pdf/test01.pdf");
}
}
4、解决中文不显示问题
创建目录:src/main/resources/fonts
创建文件:fonts.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="黑体"><!--字体名称-->
<normal>fonts/simhei.ttf</normal><!--字体文件的路径-->
<bold>fonts/simhei.ttf</bold>
<italic>fonts/simhei.ttf</italic>
<boldItalic>fonts/simhei.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'黑体', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'黑体', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
从windows的目录:C:\Windows\Fonts
中找.ttf
文件格式的字体,放入fonts中
添加配置文件: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
5、web接口案例
@GetMapping(value = "/preview/pdf")
public void preview(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 封装参数 对应jasper report里面的filed
Map<String,Object> params = new HashMap<>();
params.put("username","张三");
params.put("email","123456@qq.com");
File file = ResourceUtils.getFile("classpath:templates/test01.jasper");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setContentType("application/pdf");
// String fileName = new Date()+"测试报告.pdf";
// 设置header的这个属性,就变成了直接下载
// response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
// new JREmptyDataSource() 给一个空数据源,因为,params已经查询到了具体的数据。
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), params, new JREmptyDataSource());
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
}
三、Vue前端代码
这里需要一点axios
的基本功。
checkPdf().then(res => {
// 将获取到的PDF文件流转换为Blob对象
const blob = new Blob([res], { type: 'application/pdf' })
// 创建一个URL对象
const urlTwo = URL.createObjectURL(blob)
// 设置PDF源为创建的URL
window.open(urlTwo, '_blank')
})