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 包。

相关推荐
Java编程爱好者9 分钟前
十万个why:加了 LIMIT 1,为什么查询反而变慢了?
后端
JavaTalks30 分钟前
高并发保护实战:限流、熔断、降级如何配合落地
后端·架构·设计
代码丰36 分钟前
为什么Java 接口中的存在 Static 和 Default 方法?
后端
用户5711551768336 分钟前
深入解析Spring BeanPostProcessor
后端
掘金者阿豪2 小时前
🚀 CentOS Stream 9服务器Docker部署KWDB:从零到跨模查询实战全记录
后端
yang_xin_yu2 小时前
一文带你精通泛型PECS原则与四大核心函数式接口
后端
孟陬3 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
树獭叔叔3 小时前
13-KV Cache与位置编码表:大模型推理加速的核心技术
后端·aigc·openai
想用offer打牌3 小时前
一站式了解四种限流算法
java·后端·go
嘻哈baby3 小时前
用 C++ 写线程池是怎样一种体验?
后端