上一篇文章写的是jaspersoft Studio的使用和创建模板,链接为:Java Jaspersoft Studio使用1-CSDN博客
这一篇文章是关于如何结合Java,vue前后端分离时怎么进行打印
效果如下:
1、单个打印:
2、批量打印:
一、先进行配置文件
pom:
<!-- jasper依赖-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.20.0</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
</exclusions>
</dependency>
1.1、创建文件
在resources下面创建一个文件夹用于放字体文件和模板文件
1.2、字体
可以通过以下路径进行查找自己需要的字体,最好找字体后缀为:.ttf,.TTF
因为我再使用其它后缀时没成功
1.3、配置字体XML
注意:一个字体文件对应一个xml文件
当有了字体后进行创建一个XXX.xml文件
xml里面配置:
1.仿宋字体配置:
<!--注意:使用的是什么字体一定要改成什么字体文件-->
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<!-- name 是 什么字体 如果不清楚是什么字体的话可以点开一个.ttf文件,前两个字就是指的是什么字体-->
<fontFamily name="仿宋">
<!-- 放入仿宋ttf字体文件的路径-->
<normal>jasperReport/fonts/simfang.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<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>
2.华文仿宋字体配置:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="华文仿宋">
<normal>jasperReport/fonts/STFANGSO.TTF</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<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>
3.楷体字体配置:
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="楷体">
<normal>jasperReport/fonts/simkai.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<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>
可以参考以上字体进行配置其它ttf文件的字体
1.4、模板配置
打开通过:Java Jaspersoft Studio使用1-CSDN博客
以上链接的最后一部获取.jasper文件放入到一个文件里面
1.5、创建properties文件
用于配置字体的xml文件
jasperreports_extension.properties配置:
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
#jasperReport/fonts/font_simfang.xml是自己配置哪个字体的文件存储位置
net.sf.jasperreports.extension.simple.font.families.lobstertwo=jasperReport/fonts/font_simfang.xml
二、编写代码
2.1、单个打印
controller层:
@GetMapping("/exportJasper/{locationNo}")
public void exportJasper(@PathVariable("locationNo")String locationNo,HttpServletResponse response)
{
try {
//读取编译下的路径文件test1.jasper
ClassPathResource resource = new ClassPathResource("jasperReport/jasper/location.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream stream = response.getOutputStream();
Map params = new HashMap<>();
//查询打印的数据
List<PrintLocationDto> list = productStorageLocationService.listLocationJaper(locationNo);
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
byte[] bytes = JasperRunManager.runReportToPdf(fis, params, dataSource);
stream.write(bytes);
response.setContentType("application/pdf");
} catch (Exception e) {
e.printStackTrace();
System.out.println("产生报表出错:" + e.getMessage());
}
}
serve层:
serve层:
@Override
public List<PrintLocationDto> listLocationJaper(String locationNo) {
return alterStorageLocationMapper.listLocationJaper(locationNo);
}
前端:
xx.js:
// jasper
export function getLocationJasper(locationNo) {
return request({
url: '/XXX/XXXXXXX/exportJasper/' + locationNo,
method: 'get',
data: locationNo,
responseType: 'arraybuffer'
})
}
页面:
xxx.vue:
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-export"
@click="handleJasper(scope.row)"
>打印</el-button
>
</template>
</el-table-column>
import {getLocationJasper} from "@/api/XXX/XXXXX";
handleJasper(row) {
const locationNo = row.locationNo || this.locationNos;
var that = this;
getLocationJasper(locationNo).then((response) => {
const binaryData = [];
binaryData.push(response); //获取blob链接
that.pdfUrl = window.URL.createObjectURL(
new Blob(binaryData, { type: "application/pdf" })
);
console.log("pdfUrl:" + that.pdfUrl);
that.$refs.pdfFrame.contentWindow.location.reload();
console.log("查看iframe" + that.$refs.pdfFrame);
});
},
2.2、批量打印
这个批量打印和单个打印是不同的,但是这个批量打印也适用于单个打印,只不过单个打印上面那个需要SQL查询,但是这个批量的不需要SQL查询
controller层:
@PostMapping("/exportJasper")
public void exportJasper(@RequestBody List<PrintInbound> list, HttpServletResponse response)
{
System.out.println("list = " + list);
try {
//读取编译下的路径文件
ClassPathResource resource = new ClassPathResource("jasperReport/jasper/into.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream stream = response.getOutputStream();
Map params = new HashMap<>();
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
byte[] bytes = JasperRunManager.runReportToPdf(fis, params, dataSource);
stream.write(bytes);
response.setContentType("application/pdf");
} catch (Exception e) {
e.printStackTrace();
// System.out.println("产生报表出错:" + e.getMessage());
}
}
前端:
XX.js:
// 打印jasper
export function getExportJasper(list) {
return request({
url: '/XXX/XXX/exportJasper',
method: 'post',
data:list,
responseType: 'arraybuffer'
})
}
页面:
XXX.vue:
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-export"
size="mini"
:disabled="multiple"
@click="handleJasperInto"
>jasper导出</el-button
>
</el-col>
import { getExportJasper } from "@/api/XX/XXXXX";
data() {
return {
pdfUrl: "",
//多选中jasper打印
jasperList:[],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
}
}
handleJasperInto() {
var that = this;
getExportJasper(this.jasperList).then((response) => {
console.log(response);
const binaryData = [];
binaryData.push(response); //获取blob链接
that.pdfUrl = window.URL.createObjectURL(
new Blob(binaryData, { type: "application/pdf" })
);
console.log("pdfUrl:" + that.pdfUrl);
that.$refs.pdfFrame.contentWindow.location.reload();
// console.log("查看iframe" + that.$refs.pdfFrame);
});
},
// 多选框选中数据
handleSelectionChange(selection) {
this.jasperList = selection
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},