SpringBoot集成ireport打印,并解决PDF中文显示问题

1、相关jar包引入

XML 复制代码
<!--==========  ireport报表相关  start=============-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>4.5.1</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-collections</groupId>
                    <artifactId>commons-collections</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-beanutils</groupId>
                    <artifactId>commons-beanutils</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--itex pdf相关-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.6</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>4.0.0</version>
        </dependency>
        <!-- 解决中文字体显示问题 -->
        <dependency>
            <groupId>cn.lesper</groupId>
            <artifactId>iTextAsian</artifactId>
            <version>3.0</version>
        </dependency>
        <!--pdf itext 的jar依赖  -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-pdfa</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.13</version>
        </dependency>
        <!--==========  ireport报表相关  end=============-->

2、工具类

java 复制代码
/**
     * @param response              httpServletResponse
     * @param fileName              显示/保存 的文件名,不需要(.pdf)后缀
     * @param data                  Fields 数据集合
     * @param params                其它 params参数
     * @param downLoad              是否下载  true:下载  false:在线预览
     */
    public static void printPDF(HttpServletResponse response, String fileName, InputStream templateStream, List<?> data, Map<String,Object> params, boolean downLoad) throws IOException, JRException {
        // 1. 获取数据源
        JRDataSource jrDataSource  = new JRBeanCollectionDataSource(data);
        // 2. 获取模板文件
        // File jasperFile = ResourceUtils.getFile("classpath:" + jrxmlTemplate);
        // 3. 编译 jrxml
        JasperReport jasperReport = JasperCompileManager.compileReport(templateStream);
        // 4. 获取报表
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, jrDataSource);
        // 通过outputStream输出
        JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());

        // 5. 设置响应格式
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/pdf");
        if(downLoad){
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
        }else{
            response.setHeader("content-disposition", "inline;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".pdf");
        }
    }

3、调用Demo

java 复制代码
    @RequestMapping(value = "/printTest", method = RequestMethod.GET)
    public Result printTest(HttpServletResponse response) throws Exception {
      
        List<Map<String,Object>> data = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("phone","88888888");
        data.add(map);
        String objectName = "test.jrxml";
        OSS ossClient = aliyunOssClient.createOssClient();
        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
        InputStream templateStream = ossObject.getObjectContent();
        iReportHelper.printPDF(response,"打印预览", templateStream,data,map,false);
        return Result.setSucMsg("success");
    }

4、模板注意点

a) 模板数据源:list对应Fields,map对应Parameters

b) 模板字体尽量选用默认字体,jasper内置自带,其他字体容易报错jvm找不到字体,需要服务器安装。

c) 打印PDF选中以下属性,中文字体方可正常显示。且注意引入jasperreports-fonts 包。

相关推荐
bing_1583 小时前
简单工厂模式 (Simple Factory Pattern) 在Spring Boot 中的应用
spring boot·后端·简单工厂模式
天上掉下来个程小白3 小时前
案例-14.文件上传-简介
数据库·spring boot·后端·mybatis·状态模式
Asthenia04124 小时前
基于Jackson注解的JSON工具封装与Redis集成实战
后端
编程星空4 小时前
css主题色修改后会多出一个css吗?css怎么定义变量?
开发语言·后端·rust
程序员侠客行5 小时前
Spring事务原理 二
java·后端·spring
dmy5 小时前
docker 快速构建开发环境
后端·docker·容器
sjsjsbbsbsn6 小时前
Spring Boot定时任务原理
java·spring boot·后端
菜鸟单飞6 小时前
介绍一款非常实用的PDF阅读软件!
windows·pdf·电脑
计算机毕设指导66 小时前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
计算机-秋大田6 小时前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计