一、引入maven包
项目结构如下:pom文件插入依赖
<!-- jasperreports -->
<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>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.20.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.0</version>
</dependency>
.jasper文件无需编译,pom中加入:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.xls</exclude>
<exclude>**/*.xlsx</exclude>
<exclude>**/*.csv</exclude>
<exclude>**/*.jasper</exclude>
<exclude>**/*.jrxml</exclude>
<exclude>**/*.ttf</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<!-- 新增一个资源块来专门处理.jasper和.jrxml文件 -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.jasper</include>
<include>**/*.jrxml</include>
<include>**/*.ttf</include>
</includes>
</resource>
</resources>
</build>
二、添加jasper文件
添加两个主子报表编译后的.jasper文件到resources新建reports文件夹中三、编写报告生成方法
接口以流的方式返回@Override
public void generateReport(VDeliveryFormParam vDeliveryFormParam, HttpServletResponse response) throws Exception {
response.setContentType("application/pdf; charset=utf-8");
response.setDateHeader("Expires", 0);
OutputStream os = response.getOutputStream();
QueryWrapper<VDeliveryForm> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(VDeliveryForm.FULL_LIST_ID,vDeliveryFormParam.getFullListId());
List<VDeliveryForm> vDeliveryFormList = this.getEntityList(queryWrapper);
String listNo = vDeliveryFormList.stream().map(VDeliveryForm::getListNo).findFirst().get();
// 使用ClassPathResource加载资源jrxml
// ClassPathResource resource = new ClassPathResource("reports/proj_delivery_list.jrxml");
// InputStream reportInputStream = resource.getInputStream();
// 编译JRXML文件
// JasperReport jasperReport = JasperCompileManager.compileReport(reportInputStream);
InputStream reportInputStream = resourceLoader.getResource("classpath:/reports/proj_delivery_list.jasper").getInputStream();
//subReport子报表路径(到文件夹即可,文件名会自动拼接上)
String subPath = resourceLoader.getResource("classpath:/reports/").getURL().toString();
if (reportInputStream == null) {
throw new RuntimeException("报告模板未找到: reports/proj_delivery_list.jasper");
}
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportInputStream);
// 准备数据源、参数等...
Map<String, Object> parameters = new HashMap<>();
// 设置其他必要的参数...
parameters.put("subPath",subPath);
JSONObject json = new JSONObject();
json.put("full_list_no", listNo);
json.put("delivery_list", vDeliveryFormList);
String jsonStr = JSON.toJSONString(json, JSONWriter.Feature.WriteNullStringAsEmpty);
InputStream inputStream = new ByteArrayInputStream(jsonStr.getBytes("UTF-8"));
parameters.put("JSON_INPUT_STREAM", inputStream); //填充报表数据源数据流
// 填充报表
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);
// 输出报表
JasperExportManager.exportReportToPdfStream(jasperPrint, os);
}
四、pdf文件中文字体
下载所需的字体,ttf类型的文件在resources中新建文件夹fonts,将字体文件放入其中
并在fonts中新建fonts.xml文件
在resources中新建jasperreports_extension.properties文件
目录结构如下
fonts.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="宋体">
<normal>fonts/simsun.ttf</normal>
<bold>fonts/simsun.ttf</bold>
<italic>fonts/simsun.ttf</italic>
<boldItalic>fonts/simsun.ttf</boldItalic>
<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>
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
五、接口测试
由于是流的形式返回,response保存成文件,并修改文件后缀