Java后端返回PDF预览给前端的实现

 更新时间:2023年09月27日 16:33:14   作者:YuiDesu  
前端要预览服务器PDF 可直接将要blob流返回给前端,即可用浏览器自带pdf预览功能打开,本文就来介绍一下如何实现,感兴趣的可以了解一下

前端要预览服务器PDF 可直接将要blob流返回给前端 即可用浏览器自带pdf预览功能打开,现有两种方式

方式1 返回blob流给前端 代码如下       

    @PostMapping(value = "/preview")
    @ResponseBody
    public void showPdf(HttpServletResponse response) {
        try {
            File file = new File("filePath");
            OutputStream out = null;
            try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
            ) {
                byte[] bs = new byte[1024];
                int len;
                response.reset(); // 非常重要
                URL u = new URL("file:///" + "filePath");
                String contentType = u.openConnection().getContentType();
                response.setContentType(contentType);
                response.setHeader("Content-Disposition", "inline;filename="
                        + "preview.pdf");
                out = response.getOutputStream();
                while ((len = br.read(bs)) > 0) {
                    out.write(bs, 0, len);
                }
                out.flush();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

此时 前端解析可直接拿返回的文件流 例子如下

let blob = this.response;
          const binaryData = [];
          binaryData.push(blob);
          const url = window.URL.createObjectURL(new Blob(binaryData, { type: 'application/pdf' }));
          window.open(url);

但有的时候 不想返回文件流 可把文件返回为base64 (注意 base64可能超长)此时代码修改如下

        File file = new File("filePath");
            OutputStream out = null;
            try (BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
                         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            ) {
                int len;
                URL u = new URL("file:///" + "filePath");
                String contentType = u.openConnection().getContentType();
                byte[] buffer = new byte[1024];
                //每次读取的字符串长度,如果为-1,代表全部读取完毕
                //使用输入流从buffer里把数据读取出来
                while ((len = br.read(buffer)) != -1) {
                    //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                    outStream.write(buffer, 0, len);
                }
                // 对字节数组Base64编码
                Base64Encoder base64 = new Base64Encoder();
                String base64Str = replaceEnter(base64.encode(outStream.toByteArray()));
            }
        } catch (Exception e) {
        }

前端修改如下

 let base64 = resBase64.data.base64;
      base64 = base64.replace(/[\n\r]/g, '')
      const raw = window.atob(base64)
      const rawLength = raw.length
      const uInt8Array = new Uint8Array(rawLength)
      for (let i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i)
      }
      const url = window.URL.createObjectURL(new Blob([uInt8Array], { type: resBase64.data.contentType }));
      window.open(url);

到此这篇关于Java后端返回PDF预览给前端的实现的文章就介绍到这了,更多相关Java 返回PDF预览给前端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java构建树形结构的实现过程

    java构建树形结构的实现过程

    文章介绍了五种构建树形结构的方式,包括定义实体类、利用Map集合、使用Stream流、基于Hutool以及MyBatis-Plus的@TableName属性,最后,还提供了一个基于Java实现树结构模糊搜索功能的示例
    2025-11-11
  • 使用SpringBoot中web项目推荐目录结构的问题

    使用SpringBoot中web项目推荐目录结构的问题

    这篇文章主要介绍了SpringBoot中web项目推荐目录结构的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Java中的适配器原理解析

    Java中的适配器原理解析

    这篇文章主要介绍了Java中的适配器原理解析,当实现接口时,为了使所用的类中只实现需要的方法,使代码更加简洁,可以定义一个抽象类实现接口,将所需要的方法定义为 抽象方法,然后让类继承此抽象方法即可,需要的朋友可以参考下
    2023-11-11
  • Spring Boot整合Bootstrap的超详细步骤

    Spring Boot整合Bootstrap的超详细步骤

    之前做前端开发,在使用bootstrap的时候都是去官网下载,然后放到项目中,在页面引用,下面这篇文章主要给大家介绍了关于Spring Boot整合Bootstrap的超详细步骤,需要的朋友可以参考下
    2023-05-05
  • Java的JDBC编程使用之连接Mysql数据库

    Java的JDBC编程使用之连接Mysql数据库

    这篇文章主要给大家介绍了关于Java的JDBC编程使用之连接Mysql数据库的相关资料,JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,需要的朋友可以参考下
    2023-12-12
  • Spring 代码技巧梳理总结让你爱不释手

    Spring 代码技巧梳理总结让你爱不释手

    这篇文章主要分享了Spring 代码技巧梳理总结,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 详解Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

    详解Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

    这篇文章主要介绍了Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat的区别于用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解SpringMVC Controller介绍及常用注解

    详解SpringMVC Controller介绍及常用注解

    本篇文章主要介绍了SpringMVC Controller介绍及常用注解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java使用rmi传输大文件示例分享

    java使用rmi传输大文件示例分享

    由于在rmi中无法传输文件流,可以先用FileInputStream将文件读到一个Byte数组中,然后把这个Byte数组作为参数传进RMI的方法中,然后在服务器端将Byte数组还原为outputStream,这样就能通过RMI 来传输文件了,下面我们来看实例
    2014-01-01
  • Mybatis-Plus CRUD操作方法

    Mybatis-Plus CRUD操作方法

    通用 Service CRUD 封装 IService 接口,进一步封装 CRUD 采用 get 查询、remove 删除 、list 查询集合、page 分页的前缀命名方式区分 Mapper 层避免混淆,这篇文章主要介绍了Mybatis-Plus CRUD的相关知识,需要的朋友可以参考下
    2023-10-10

最新评论