文章目录
-
- 简介
- 1. Maven相关jar包
- 2. 在报表中显示中文
-
- 2.1 修改jar文件
- 2.2 把文件字体拷贝到这里
- 3. 使用JasperReport制作报表
- 4. 把文件复制到WEB-INF下
- 5. 生成条形码工具类
- 6. 生成条形码
- 7. 生成PDF
- 8. 效果图
简介
使用SSM技术集成 JasperReport报表+barcode4j条形码
1. Maven相关jar包
<!--JsperReport-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.17.0</version>
</dependency>
<dependency>
<groupId>org.olap4j</groupId>
<artifactId>olap4j</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>iText</artifactId>
<version>2.1.7</version>
</dependency>
<!--字体 需要手动修改jar包-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<!--条形码-->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
2. 在报表中显示中文
在jasperreport中显示中文需要使用jasperreports-fonts 并修改jar文件
2.1 修改jar文件
以华文宋体为例,我们需要准备华文宋体的字体样式
百度云: https://pan.baidu.com/s/1b5YN1ly_IkHMWk0nxkf1JQ
提取码:szy1
打开jasperreports-fonts-6.17.0.jar
把相关文件放入jar中 切记jar包不用解压 直接把文件放进去
<fontFamily name="华文宋体">
<normal>net/sf/jasperreports/fonts/dejavu/stsong.TTF</normal>
<bold>net/sf/jasperreports/fonts/dejavu/stsong.TTF</bold>
<italic>net/sf/jasperreports/fonts/dejavu/stsong.TTF</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/stsong.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>
<!--
<locales>
<locale>en_US</locale>
<locale>de_DE</locale>
</locales>
-->
</fontFamily>
2.2 把文件字体拷贝到这里
此时解决中文字体的问题
jar包百度云 支持华文宋体
百度云: https://pan.baidu.com/s/11hHNd19iY0DCPwxf_BPDlg
提取码:szy1
3. 使用JasperReport制作报表
4. 把文件复制到WEB-INF下
5. 生成条形码工具类
package org.express.utils;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
public class DemoApplicationTests {
/**
* 生成文件
*
* @param msg
* @param path
* @return
*/
public static void generateFile(String msg, String path) {
//生成高度
int height = 160;
//生成宽度
double width = UnitConv.in2mm(1.0f / height);
//输出流
File file = new File(path);
OutputStream out;
try {
out = new FileOutputStream(file);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
Code39Bean c39 = new Code39Bean();
// 设置属性
c39.setModuleWidth(width);
c39.setWideFactor(2);
// 输出类型
String format = "image/png";
BitmapCanvasProvider canvas = new BitmapCanvasProvider(out, format, height, BufferedImage.TYPE_BYTE_BINARY, false, 0);
// 生成图片
c39.generateBarcode(canvas, msg);
try {
// 关闭流
canvas.finish();
System.out.println("ok...");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
6. 生成条形码
//修改自己的地址
String path = ResourceUtils.getURL("classpath:").getFile().toString()+"\\..\\..\\static\\upload\\"+expId+".png";
//命名方式
String msg = expId;
//输出
DemoApplicationTests.generateFile(msg, path);
7. 生成PDF
@Override
public void expressRoport(ExpressPo expressPo, HttpServletResponse response) throws Exception {
//1.获取模板文件 获取项目的更目录
File rootFile = new File(ResourceUtils.getURL("classpath:").getFile());
File templateFile = new File(rootFile, "../pdf_template/expressWaybill.jasper");
//TODO 2.准备数据库的链接 数据库查询 需要更改自己的接口
Express expressById = expressMapper.getExpressById(expressPo.getExpId());
String expImages = expressById.getExpImages();
expressById.setExpImages(rootFile+"\\..\\.."+expImages);
//2.准备数据库的链接
Map<String, Object> params = EntityUtils.entityToMap(expressById);
//将JasperPrint已PDF的形式输出
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(templateFile),params,new JREmptyDataSource());
//获取输出流
ServletOutputStream outputStream = response.getOutputStream();
//设置导入名称
String filename= "运单报表.pdf";
//设置导出的字符编码
response.setContentType("application/pdf");
response.setHeader("content-disposition","attachment:filename="+new String(filename.getBytes(),"ISO-8859-1"));
//3.打印
JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
}