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

相关推荐
karatttt2 分钟前
用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1
后端·qt·rpc·架构·golang
余渔鱼112334 分钟前
ASP.NET CORE部署IIS的三种方式
后端·github·asp.net
是席木木啊44 分钟前
SpringBoot集成WebSocket,单元测试执行报错
spring boot·websocket·单元测试
嘻嘻嘻嘻嘻嘻ys1 小时前
《Spring Boot 3 + GraalVM原生镜像实战:云原生时代的毫秒启动与性能调优》
前端·后端
嘻嘻嘻嘻嘻嘻ys1 小时前
《Spring Boot 3.0×GraalVM:云原生时代的毫秒级启动实战革命》
前端·后端
嘻嘻嘻嘻嘻嘻ys1 小时前
《Vue 3.4响应式内核优化与WebAssembly性能突破实战指南》
前端·后端
绵阳的脑内SSD1 小时前
Redis 通用命令与keyspace
后端
嘻嘻嘻嘻嘻嘻ys1 小时前
《Spring Boot 3百万并发实战:基于JDK21虚拟线程的性能革新》
前端·后端
极客智谷1 小时前
Spring AI应用系列——基于DashScope平台的Chat应用
人工智能·后端