文章目錄
-
- 簡介
- 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);
}