Vue使用pdf.js和docx-preview实现docx和pdf的在线预览

 更新时间:2025年03月12日 09:57:50   作者:当new作码  
这篇文章主要为大家详细介绍了在Vue中使用pdf.js和docx-preview实现docx和pdf的在线预览的相关知识,文中的示例代码讲解详细,需要的可以参考下

后端代码:

        SshConfig sshConfig = new SshConfig("ip", port, "username", "password");
        ChannelSftp channelSftp = sshConfig.getChannelSftp();
 
        String downUrl = "/**/**/";//服务器相对路径
        String pathname1 = downUrl + fileId + ".docx";
        String pathname2 = downUrl + fileId + ".pdf";
 
        InputStream inputStream1 = null;
        InputStream inputStream2 = null;
 
       //文件可能是docx或者pdf,因此需要分别尝试获取文件输入流
        try {
            inputStream1 = channelSftp.get(pathname1);
        } catch (SftpException e) {
            inputStream2 = channelSftp.get(pathname2);
        }
 
        byte[] buffer = new byte[1024];
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        if (inputStream1 != null) {
            while ((bytesRead = inputStream1.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
            byte[] fileBytes1 = output.toByteArray();
            // 现在fileBytes中包含了远程文件的字节流
            if (fileBytes1 != null) {
                channelSftp.disconnect();
                sshConfig.disconnect();
                // Convert the file to base64
                String base64 = Base64.getEncoder().encodeToString(fileBytes1);
                map.put("fileUrl", pathname1);
                map.put("base64", base64);
                return map;
            }
        } else {
            while ((bytesRead = inputStream2.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
            byte[] fileBytes1 = output.toByteArray();
            // 现在fileBytes中包含了远程文件的字节流
            if (fileBytes1 != null) {
                channelSftp.disconnect();
                sshConfig.disconnect();
                // Convert the file to base64
                String base64 = Base64.getEncoder().encodeToString(fileBytes1);
                map.put("fileUrl", pathname2);
                map.put("base64", base64);
                return map;
            }
        }
 
        return map;

前端代码:

mounted方法中判断使用哪一个插件 

  mounted() {
    let fileUrl = sessionStorage.getItem("fileUrl");
    if (fileUrl.indexOf('.docx') !== -1) {
      let bstr = sessionStorage.getItem("bstr");
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      console.log("docx");
      //u8arr.buffer 转成arrayBuffer类型
      this.docxRender(u8arr.buffer, this.title);
    } else {
      let bstr = sessionStorage.getItem("bstr");
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      this.pdfData = u8arr;
      console.log("pdf");
      this.pdfReader(u8arr);
    }
 
  },

docx文件的渲染

    //渲染docx
    docxRender(buffer, fileName) {
      let box = document.createElement('div')  // 创建一个div
      let docx = require("docx-preview")
      docx.renderAsync(buffer, box).then(() => {  // 渲染文件
        let zhengwen = document.getElementById('zhengwen');
        zhengwen.appendChild(box);
        //document.write(box.outerHTML);
        //渲染文件后将div添加到新窗口中,div不能提前添加,否则新窗口中不能渲染出文件
        //注意这里不能直接用box
        document.title = fileName // 窗口标题
        document.getElementsByClassName('docx')[0].style.width = 'auto'
        // 如果文件显示正常,不用设置宽度
      }).catch(function () {
        Message({
          type: "error",
          message: "该文档可能已损坏,请尝试下载查阅"
        })
      })
    },

渲染效果图:

pfd文件渲染:

    //渲染pdf
    pdfReader(u8arr) {
      // 获取PDF容器元素
      let container = this.$refs.pdfContainer;
 
      // 配置PDFJS worker路径
      pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.min.js';
      // 加载PDF文件流
      pdfjsLib.getDocument(u8arr).promise.then((pdf) => {
        // 获取页面数量
        const numPages = pdf.numPages;
        // 循环遍历所有页面
        for (let i = 1; i <= numPages; i++) {
          pdf.getPage(i).then((page) => {
            // 设置缩放比例
            const scale = 1.7;
            // 获取渲染上下文
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            // 计算画布大小
            const viewport = page.getViewport({scale});
            canvas.height = viewport.height;
            canvas.width = viewport.width;
            // 将PDF页面渲染到画布上
            const renderContext = {
              canvasContext: ctx,
              viewport: viewport
            };
            page.render(renderContext);
            // 添加画布到容器中
            container.appendChild(canvas);
          });
        }
      }).catch(function () {
        Message({
          type: "error",
          message: "该文档可能已损坏,请尝试下载查阅"
        })
      });
    },

注意,使用前需要下载相应的库,docx-preview工具不适用于渲染doc文件,需要自己去转换文件类型(比如直接修改文件后缀名)

npm install pdfjs-dist
npm install docx-preview

以上就是Vue使用pdf.js和docx-preview实现docx和pdf的在线预览的详细内容,更多关于Vue文件在线预览的资料请关注脚本之家其它相关文章!

相关文章

  • 用vue 实现手机触屏滑动功能

    用vue 实现手机触屏滑动功能

    这篇文章主要介绍了用vue 实现手机触屏滑动的功能,文中通过示例代码给大家介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Vue导出Excel,后端返回的文件流,前端接收后无法打开文件的解决

    Vue导出Excel,后端返回的文件流,前端接收后无法打开文件的解决

    在使用Vue导出Excel时,如果后端返回文件流,前端接收后无法打开文件,通常是由于响应类型设置不正确导致的,通过设置axios请求接口时的响应类型为`blob`,并使用blob转换文件流,可以解决文件损坏无法打开的问题
    2025-12-12
  • Vue中Class和Style实现v-bind绑定的几种用法

    Vue中Class和Style实现v-bind绑定的几种用法

    项目开发中给元素添加/删除 class 是非常常见的行为之一, 例如网站导航都会给选中项添加一个 active 类用来区别选与未选中的样式,那么在 vue 中 我们如何处理这类的效果呢?下面我们就一起来了解一下
    2021-05-05
  • vue实现前端列表拖拽功能

    vue实现前端列表拖拽功能

    这篇文章主要为大家详细介绍了如何利用vue实现前端列表拖拽功能,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2023-12-12
  • 源码分析Vue3响应式核心之reactive

    源码分析Vue3响应式核心之reactive

    这篇文章主要为大家详细介绍了Vue3响应式核心之reactive的相关知识,文中的示例代码讲解详细,对我们学习Vue3有一定的帮助,需要的可以参考一下
    2023-04-04
  • Vue使用pdf.js和docx-preview实现docx和pdf的在线预览

    Vue使用pdf.js和docx-preview实现docx和pdf的在线预览

    这篇文章主要为大家详细介绍了在Vue中使用pdf.js和docx-preview实现docx和pdf的在线预览的相关知识,文中的示例代码讲解详细,需要的可以参考下
    2025-03-03
  • element表格去掉表头的实现方法

    element表格去掉表头的实现方法

    本文主要介绍了element表格去掉表头的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • vue实现手机验证码登录

    vue实现手机验证码登录

    这篇文章主要为大家详细介绍了vue实现手机验证码登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 用vue写一个仿简书的轮播图的示例代码

    用vue写一个仿简书的轮播图的示例代码

    本篇文章主要介绍了用vue写一个仿简书的轮播图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • vue侧边栏动态生成下级菜单的方法

    vue侧边栏动态生成下级菜单的方法

    今天小编就为大家分享一篇vue侧边栏动态生成下级菜单的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09

最新评论