项目实战—OFD文件转换成图片

引言:项目需要预览OFD文件,但前端对OFD文件支持太差,因此将OFD文件直接转换成PNG格式、Base64编码的数据并返回给前端

依赖

xml 复制代码
 <dependency>
    <groupId>org.ofdrw</groupId>
    <artifactId>ofdrw-converter</artifactId>
    <version>1.17.2</version>
    <!--  如果项目已经引入了log4j,则排除log4j        -->
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </exclusion>
    </exclusions>
</dependency>

接口

java 复制代码
/**
     * ofd文件转换成png图片

     * @return
     * @throws Exception
     */
    @GetMapping(value = "/getOfdToPng")
	public Result<List<String>> getOfdToPng() throws Exception {
        long start = System.currentTimeMillis();
        // 这里是minio访问url
        String ofdPath = "http://127.0.0.1:9000/ofd/42181c66_20240531_%E8%88%AA%E4%BD%B3%EF%BC%88%E6%8A%95%E6%A0%87%EF%BC%89%E5%AD%972024%E5%B9%B4%E7%AC%ACHJ000033%E5%8F%B7%E4%BF%9D%E5%87%BD.ofd?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin%2F20240612%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240612T080307Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&versionId=null&X-Amz-Signature=30626032831f76333120327cba020c4aaffcf68c27912d629bf31c99d37b6aa9";
        InputStream isFromUrl = DocUtils.getIsFromUrl(ofdPath);
        List<String> list = new ArrayList<>();
        // 输入OFD文件路径
        // 输出图片路径
        try (OFDReader reader = new OFDReader(isFromUrl)) {
            // ppm 设置来指定图片生成的分辨率,数值越高图片越清晰,生成时间越慢
            ImageMaker imageMaker = new ImageMaker(reader,16);
            int pageSize = imageMaker.pageSize();
            for (int i = 0; i < pageSize; i++) {
                BufferedImage bufferedImage = imageMaker.makePage(i);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, "png", outputStream);
                byte[] imageBytes = outputStream.toByteArray();
                // 生成base64格式的图片
                String base64String = "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
                outputStream.close();
                list.add(base64String);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            isFromUrl.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("耗费时间:" + (end -start) * 1.0 / 1000);
        return Result.ok(list);
    }
	
	// 将远程url转换成InputStream 
	public static InputStream getIsFromUrl(String remoteUrl) throws Exception {
        byte[] fileBytes = null;
        InputStream inStream = null;
        ByteArrayOutputStream bOutStream = null;
        try {
            URL url = new URL(remoteUrl);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            httpConn.connect();
            inStream = httpConn.getInputStream();
            return inStream;
        } catch (UnknownHostException e) {
            String msg = MessageFormat.format("网络请求时发生UnknownHostException异常: {0}", e.getMessage());
            Exception ex = new Exception(msg);
            ex.initCause(e);
            throw ex;
        } catch (MalformedURLException e) {
            String msg = MessageFormat.format("网络请求时发生MalformedURLException异常: {0}", e.getMessage());
            Exception ex = new Exception(msg);
            ex.initCause(e);
            throw ex;
        } catch (IOException e) {
            String msg = MessageFormat.format("从远程Url中获取文件流时发生IOException异常: {0}", e.getMessage());
            Exception ex = new Exception(msg);
            ex.initCause(e);
            throw ex;
        }
    }

前端展示

请求接口

js 复制代码
getAction("/getOfdToPng").then(res =>{
         this.imgList = res.result
      })

因为是PNG格式、Base64编码的数据,可以直接使用img标签

html 复制代码
<div style="display:flex;justify-content:center;" v-for="img in imgList" :key="img">
     <img class="imgOfd" :src="img">
 </div>
相关推荐
下次再写18 小时前
互联网大厂Java面试三轮技术问答及详解——涵盖Spring Boot与微服务
java·springboot·microservices·interview
吕永强2 天前
基于SpringBoot+Vue校园报修系统的设计与实现(源码+论文+部署)
vue·毕业设计·springboot·毕业论文·报修系统·校园报修
Flittly3 天前
【SpringSecurity新手村系列】(3)自定义登录页与表单认证
java·笔记·安全·spring·springboot
Flittly5 天前
【SpringSecurity新手村系列】(2)整合 MyBatis 实现数据库认证
java·安全·spring·springboot·安全架构
极光代码工作室5 天前
基于SpringBoot的在线考试系统
java·springboot·web开发·后端开发
YDS8296 天前
大营销平台 —— 抽奖规则决策树
java·springboot·ddd
码农张37 天前
自定义跨字段校验必填注解
springboot
格鸰爱童话7 天前
向AI学习项目技能(七)
学习·springboot
代码漫谈7 天前
微服务 vs 单体架构:架构选型、实战拆解与决策指南
java·微服务·springboot·springcloud
文慧的科技江湖7 天前
光储充一体化系统落地 PRD 全功能清单 - 慧知开源充电桩平台
java·mysql·开源·springboot·慧知开源充电桩平台·充电重复订单解决方案源码