天天看点

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例

文章目录

    • 简介
    • 1. Maven相关jar包
    • 2. 在报表中显示中文
      • 2.1 修改jar文件
      • 2.2 把文件字体拷贝到这里
    • 3. 使用JasperReport制作报表
    • 4. 把文件复制到WEB-INF下
    • 5. 生成条形码工具类
    • 6. 生成条形码
    • 7. 生成PDF
    • 8. 效果图

简介

使用SSM技术集成 JasperReport报表+barcode4j条形码

PDF报表操作05~~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

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例
把相关文件放入jar中 切记jar包不用解压 直接把文件放进去
PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例
<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>
           
PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例

2.2 把文件字体拷贝到这里

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例

此时解决中文字体的问题

jar包百度云 支持华文宋体

百度云: https://pan.baidu.com/s/11hHNd19iY0DCPwxf_BPDlg

提取码:szy1

3. 使用JasperReport制作报表

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例

4. 把文件复制到WEB-INF下

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例

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);
}
           

8. 效果图

PDF报表操作05~~SSM整合JasperReport+barcode4j制作动态报表(数据库交互)案例