龙空技术网

JasperReport pdf报表中插入图片(显示图片)

Running的程序员 323

前言:

此时咱们对“设置图片在div中的位置”大体比较关切,我们都想要了解一些“设置图片在div中的位置”的相关文章。那么小编在网上收集了一些有关“设置图片在div中的位置””的相关内容,希望各位老铁们能喜欢,姐妹们快快来学习一下吧!

有时候我们在项目中需要生成pdf文件(详细可看我的另一篇文章),并且pdf中需要动态地显示需要的图片,使用JasperReport可以很便捷的完成我们的诉求。比如我们需要生成如下的pdf文件:

文件中添加图片

接下来演示怎么实现的

设计模板

按自己的需求将image元素拖到指定的位置,拖拽image元素到报表设计区域的时候会让选择图片的资源路径,按默认配置即可,如下图

含有图片的报表模板设计

调节图片大小,以及每行展示的数量(detail栏的元素会根据数据源去遍历展示),如下图:

调整图片元素的位置

然后最重要的就是配置上图中的Expression表达式,即告诉框架要从哪里获取图片资源,这里我是通过字节数组输入流创建图片的,完整的Expression表达式如下,可以直接粘贴使用。说明:$ F{reportDescImage}是图片的字节数组对应的Base64编码后的字符串,所以表达式中要对$F{reportDescImage}进行Base64解码,转换为图片原来的字节数组,这样框架就可以渲染出图片了

new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($F{reportDescImage}.getBytes()))
代码实现

核心代码如下:

public void exportReportOrder(Integer reportId, HttpServletResponse servletResponse) {        //查询自己需要的业务数据        ReportOrderDetailVO detailVO = this.getReportOrderDetail(reportId);        OutputStream outputStream;        try {            outputStream = servletResponse.getOutputStream();            String fileName = reportOrderConverter.getPdfFileName(detailVO);            //设置http的文件类型及编码方式            servletResponse.setContentType("application/pdf;charset=utf-8");            //设置下载的文件名称 名称含有中文的话需要用URLEncoder进行编码            servletResponse.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));            Map<String, String> reportTypeToNameMap = reportTypeEnumService.getCodeToNameMap();            ExportFraudReportOrderResponse response = reportOrderConverter.assembleFraudReportOrder(detailVO, reportTypeToNameMap);            //组装模板中需要的参数 用于填充模板中通过$P{xxx}声明的参数            Map<String, Object> params = reportOrderConverter.assembleReportParams(response);            List<FraudReportOrderEvidenceImage> imageList = reportOrderConverter.getImageResources(detailVO);            //设置JasperReport的数据源 我用的是Json类型的数据源(数据源中的数据用于填充模板中detail区域的通过$F{XXX}指定的参数)            JsonDataSource jsonDataSource = new JsonDataSource(new ByteArrayInputStream(JSON.toJSONString(imageList).getBytes(StandardCharsets.UTF_8)));            boolean hasImage = reportOrderConverter.hasImage(detailVO);            if (hasImage) {                fileGenerateService.generates(EnumFileMeta.PDF_4_FRAUD_REPORT, outputStream, params, jsonDataSource);            } else {                fileGenerateService.generates(EnumFileMeta.PDF_4_FRAUD_REPORT_WITHOUT_IMAGE, outputStream, params, jsonDataSource);            }        } catch (IOException io) {            log.error("获取http输出流失败", io);            throw new ServiceResponseException("获取http输出流失败");        } catch (Exception e) {            log.error("生成报告单失败", e);            throw new ServiceResponseException("生成报告单失败");        }    }public List<FraudReportOrderEvidenceImage> getImageResources(ReportOrderDetailVO detailVO) {        if (!this.hasImage(detailVO)) {            return this.buildEmptyImage();        }        List<String> imageUrls = detailVO.getResourceList().stream()                .filter(f -> EnumResourceType.图片.getCode().equals(f.getResourceType()))                .map(m -> {                    if (!StringUtils.startsWith(m.getResourceUrl(), HTTPS)) {                        return HTTPS + m.getResourceUrl();                    }                    return m.getResourceUrl();                }).collect(Collectors.toList());        log.info("image urls: {}", imageUrls);        List<FraudReportOrderEvidenceImage> images = new ArrayList<>();        //将查询到的图片url按照报表模板中设置的图片每行的数量进行划分        // 模板中设置的一行为4个图片 所以此处我们以4为单位划分        Lists.partition(imageUrls, 4).forEach(items -> {            //对应每行图片的model            FraudReportOrderEvidenceImage image = new FraudReportOrderEvidenceImage();            for (int i = 0; i < items.size(); i++) {                //使用Spring的RestTemplate API去读取图片 读取图片的字节数组                byte[] imageBytes = restTemplate.getForObject(items.get(i), byte[].class);                if (i == 0) {                    image.setReportDescImage(this.byte2String(imageBytes));                    continue;                }                if (i == 1) {                    image.setReportDescImage2(this.byte2String(imageBytes));                    continue;                }                if (i == 2) {                    image.setReportDescImage3(this.byte2String(imageBytes));                    continue;                }                if (i == 3) {                    image.setReportDescImage4(this.byte2String(imageBytes));                }            }            images.add(image);        });        return images;    }    public boolean hasImage(ReportOrderDetailVO detailVO) {        if (Objects.isNull(detailVO) || CollectionUtils.isEmpty(detailVO.getResourceList())) {            return false;        }        List<String> imageUrls = detailVO.getResourceList().stream()                .filter(f -> EnumResourceType.图片.getCode().equals(f.getResourceType()))                .map(m -> m.getResourceUrl())                .collect(Collectors.toList());        if (CollectionUtils.isEmpty(imageUrls)) {            return false;        }        return true;    }    private List<FraudReportOrderEvidenceImage> buildEmptyImage() {        FraudReportOrderEvidenceImage image = new FraudReportOrderEvidenceImage();        byte[] empty = new byte[0];        String emptyImage = new String(org.apache.commons.codec.binary.Base64.encodeBase64(empty), StandardCharsets.UTF_8);        image.setReportDescImage(emptyImage);        image.setReportDescImage2(emptyImage);        image.setReportDescImage3(emptyImage);        image.setReportDescImage4(emptyImage);        return Collections.singletonList(image);    }    /**     * 字节数组编码为Base64字符串     * @param imageBytes     * @return     */    private String byte2String(byte[] imageBytes) {        imageBytes = Objects.isNull(imageBytes) ? new byte[0] : imageBytes;        String imageStr = new String(org.apache.commons.codec.binary.Base64.encodeBase64(imageBytes), StandardCharsets.UTF_8);        return imageStr;    }

至此生成含图片的pdf文件就搞定了,以上供大家参考!

标签: #设置图片在div中的位置 #设置图片在div中的位置在哪里