1.需求:导出送货单PDF,PDF还须有条码。
2.技术选型,使用jasper制图工具进行制作模板,然后再将数据填充进对应占位符即可。
下载地址: TIBCO Jaspersoft Studio 当前使用的是6.5.0版本。
最终使用jasper设计模板样子
3.软件使用
创建项目
根据需要的格式选择
面版说明
- Title(标题):只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。
- Page Header(页头):在整个报表中每一页都会显示。在第一页中,出现的位置在 Title Band的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。
- Page Footer(页脚):在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。
- Detail 1(详细):报表内容,每一页都会显示。
- Column Header(列头):Detail中打印的是一张表的话,这Column Header就是表中列的列头。
- Column Footer(列脚):Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。
- Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail 1 Band后面。主要是用来做报表的合计显示。
这个软件可以连接数据库,然后将数据库的字段读取到并可选择填入到模板中,但这里不赘述,可百度自行了解。
这里直接自定义字段进行填充。
将自定义的参数拖拽到模板内或者在模板内填入文本域。
则条码在此处选取,选择128
注意:模板内的文字一定要选择字体,否则导出的模板中文不显示。
点击Preview预览,就可以看到模板最终效果
最后,我们需要执行编译获得.jasper文件。
将.jasper文件拷贝到项目静态目录下。
此外还需要的文件:stsong下面的字体包(解决模板中文不显示问题),和配置文件
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=stsong/fonts.xml
以上模板工作准备好后,剩下的就是Java代码的编写。(springboot)
需要导入的依赖:
<!-- jasperPDF -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.5.0</version>
<exclusions>
<!--排除itext等支持包-->
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
<exclusion>
<groupId>org.olap4j</groupId>
<artifactId>olap4j</artifactId>
</exclusion>
<!--排除jackson支持包-->
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<!-- 条码需要导的包 -->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.16</version>
</dependency>
关键代码
//1. 获取jasper文件流
ClassPathResource readFile = new ClassPathResource("static.template/ps_sheet_A4.jasper"); InputStream in = readFile.getInputStream();
// pdf参数
Map Map<String, Object> param = new HashMap<>();
param.put("sheetNo",master.getSheetNo());
param.put("operDate",DateUtil.format(master.getOperDate(),"yyyy/MM/dd hh:mm:ss"));
param.put("workDate",DateUtil.format(master.getWorkDate(),"yyyy/MM/dd hh:mm:ss"));
param.put("operName",master.getOperName());
param.put("payDate",DateUtil.format(master.getPayDate(),"yyyy/MM/dd"));
param.put("orderMan",master.getOrderManName());
param.put("supName",master.getSupName());
param.put("branchName",master.getBranchName());
param.put("other1",master.getOther1());
param.put("posheetNo",master.getPosheetNo());
param.put("barCode",master.getSheetNo());
List<CoSheetDetailVo> detailVoList = master.getDetailVoList();
BigDecimal count = new BigDecimal(0);
for (CoSheetDetailVo vo : detailVoList) {
count = vo.getLargeQty().add(count);
}
List<CoSheetDetailPDFVo> pdfVos = BeanHelper.copyWithCollection(detailVoList, CoSheetDetailPDFVo.class);
param.put("count",count);
// 构造对象封装数据源中的javaBean数据
JRDataSource dataSource= new JRBeanCollectionDataSource(pdfVos,false);
// 参数1.模板文件输入流;参数2.传递到模板文件中的key-value类型的参数;参数3.数据列表参数
JasperPrint jasperPrint = JasperFillManager.fillReport(in, param,dataSource);
ServletOutputStream out = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint,out);
out.close();
如果有更好更方便的pdf模板生成,欢迎评论区分享!