jasper模板生成PDF

970 阅读2分钟

1.需求:导出送货单PDF,PDF还须有条码。

2.技术选型,使用jasper制图工具进行制作模板,然后再将数据填充进对应占位符即可。

下载地址: TIBCO Jaspersoft Studio 当前使用的是6.5.0版本。

最终使用jasper设计模板样子

截图 (6).png

3.软件使用

创建项目

1.png

2.png

3.png

根据需要的格式选择

4.png

5.png

面版说明

  • 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后面。主要是用来做报表的合计显示。

这个软件可以连接数据库,然后将数据库的字段读取到并可选择填入到模板中,但这里不赘述,可百度自行了解。

这里直接自定义字段进行填充。

截图.png

截图 (1).png

将自定义的参数拖拽到模板内或者在模板内填入文本域。

截图 (3).png

则条码在此处选取,选择128

截图 (4).png

截图 (5).png

注意:模板内的文字一定要选择字体,否则导出的模板中文不显示。

截图 (7).png

点击Preview预览,就可以看到模板最终效果

截图 (8).png

截图 (9).png

最后,我们需要执行编译获得.jasper文件。

截图 (10).png

截图 (11).png

将.jasper文件拷贝到项目静态目录下。

截图 (12).png

此外还需要的文件:stsong下面的字体包(解决模板中文不显示问题),和配置文件

截图 (13).png

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模板生成,欢迎评论区分享!