vue通过url方式展示PDF的几种方法

 更新时间:2023年01月17日 09:42:57   作者:今天的砖格外烫手.  
小编最近接手的项目中有个需求,前端显示后端返回的PDF格式的文件,下面这篇文章主要给大家介绍了关于vue通过url方式展示PDF的几种方法,需要的朋友可以参考下

最近vue项目中遇到预览pdf出现乱码问题,尝试了各种办法受尽折磨,以此记录一下使用的几种方法

1.使用pdfjs-dist 插件,通过iframe标签显示 

首先 npm install pdfjs-dist --save

 npm直接下载插件  npm install --save pdfjs-dist@2.0.943,@2.0.943这是指定版本号,不需要指定版本的就不需要带,下载后在使用的页面直接引入。

 然后直接设置pdf路径就可以直接展示,downloadUrl 是插件中的viewer.html地址,resFile是文件下载地址,到此就能正常预览PDF,组件功能也很多,如需要额外的功能也可以在viewer.js自行修改

2.使用vue-pdf插件

执行下面命令下载插件(vue-pdf是基于pdfjs-dist),并修改pacakge.json文件 

        npm i pdfjs-dist@2.5.207 --save
        npm i vue-pdf@4.2.0 --save

        "dependencies": {
                  "pdfjs-dist": "2.5.207",
                  "vue-pdf": "4.2.0",
          }

在使用的页面中直接引入插件,标签为<pdf>就可以,路径赋值同第一种方法

3.第三种方法使用了pdfjs-dist插件,通过url实现PDF转图片显示

引入需要的插件pdfjs-dist,workerSrc(具体功能可以百度,没搞明白)

 本地文件URL:

 通过URL转换blob类型,然后转为base64,这块可以直接拿去用,getDay()方法可以换成自己想要的文件名,这个方法转成base64后是包含前面类型的,又处理了一下,看个人需求

fileLinkToStreamDownload(url) {
      let fileName = this.getDay()
      let reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\/])+$/
      if (!reg.test(url)) {
        throw new Error('传入参数不合法,不是标准的文件链接')
      } else {
        let xhr = new XMLHttpRequest()
        xhr.open('get', url, true)
        xhr.setRequestHeader('Content-Type', `application/pdf;charset-UTF-8`)
        xhr.responseType = 'blob'
        let that =this
        xhr.onload = function() {
          if (this.status == 200) {
            //接受二进制文件流
            var blob = this.response
            // that.downloadExportFile(blob, fileName);
            that.blobToBase64(blob).then(res => {
                // blob转base64
                let baseArr = res.split(',');
                that.showPdf(baseArr[1]);
              })
          }
        }
        xhr.send()
      }
    },
     //Blob类型转BASE64
      blobToBase64(blob) {
      return new Promise((resolve, reject) => {
        const fileReader = new FileReader();
        fileReader.onload = (e) => {
          resolve(e.target.result);
        };
        // readAsDataURL
        fileReader.readAsDataURL(blob);
        fileReader.onerror = () => {
          reject(new Error('blobToBase64 error'));
        };
      });
    },
    getDay() {
      let time = new Date(),
      year = time.getFullYear(),
      month = time.getMonth() + 1,
      day = time.getDate(),
      timeStem = time.getTime()
      return `${year}/${month}/${day}/${timeStem}.pdf`
    },

拿到base64后,开始转图片处理:这个原理这里不多说了,也是照搬的, 如果PDFJS.getDocument()获取不到pdf对象,可以考虑一下版本问题(@2.2.228亲测好用)

async showPdf(base64Val) {
      let pdfList = document.querySelector('.pdfList') //通过querySelector选择DOM节点,使用document.getElementById()也一样
      let base64 = base64Val //获得bas464编码
      let decodedBase64 = window.atob(base64) //使用浏览器自带的方法解码
      let pdfCurrent = await PDFJS.getDocument({data: decodedBase64}) //返回一个pdf对象
      let pages = pdfCurrent.numPages //声明一个pages变量等于当前pdf文件的页数
      for (let i = 1; i <= pages; i++) { //循环页数
        let canvas = document.createElement('canvas') 
        let page = await pdfCurrent.getPage(i) //调用getPage方法传入当前循环的页数,返回一个page对象
        let scale = 1;//缩放倍数,1表示原始大小
        let viewport = page.getViewport(scale); 
        let context = canvas.getContext('2d'); //创建绘制canvas的对象
        canvas.height = viewport.height; //定义canvas高和宽
        canvas.width = viewport.width;
        let renderContext = {
          canvasContext: context,
          viewport: viewport
        };
        await page.render(renderContext)
        canvas.className = 'canvas' //给canvas节点定义一个class名,这里我取名为canvas
        pdfList.appendChild(canvas) //插入到pdfList节点的最后
      }
    },

通过这个方法亲测可以成功转图片,但是依旧没解决图片乱码问题

4.直接通过iframe标签 

页面标签

 还是通过转码,创建下载链接,直接给地址赋值皆可以了,#toolbar = 0 设置工具栏不显示

 我这块需求是不能下载,只能打印,所以隐藏了工具栏,新增了打印按钮,最开始想的是直接window.print()方法打印页面,先看效果

 只打印pdf界面右侧的小图(没搞懂),然后决定使用print-js打印插件,还是npm install--save print-js 先下载插件 

在需要的页面直接引入

 用法很简单,按钮绑定

 直接用就可以,直接把地址附上,type是pdf类型就可以了

到这就实现了预览,打印功能,但还没找到获取打印页面按钮的方法,有知道的可以交流。

期间还涉及到了vue父窗口,子窗口通信的问题,碰到同样问题的可以看一下,附上图片

父页面

子页面调用

 地址如下

https://www.jb51.net/article/272949.htm

总结

到此这篇关于vue通过url方式展示PDF的几种方法的文章就介绍到这了,更多相关vue url方式展示PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Vue提供的三种调试方式你知道吗

    Vue提供的三种调试方式你知道吗

    这篇文章主要为大家介绍了Vue提供的三种调试方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Vite代理如何解决跨域问题详解

    Vite代理如何解决跨域问题详解

    跨域是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制,下面这篇文章主要给大家介绍了关于Vite代理如何解决跨域问题的相关资料,需要的朋友可以参考下
    2023-03-03
  • Vue nextTick获取更新后的DOM的实现

    Vue nextTick获取更新后的DOM的实现

    本文主要介绍了Vue nextTick获取更新后的DOM的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Vue cli及Vue router实例详解

    Vue cli及Vue router实例详解

    vue-cli是vue官方出品的快速构建单页应用的脚手架,里面集成了webpack,npm,nodejs,babel,vue,vue-router,这篇文章主要介绍了Vue cli及Vue router详解,需要的朋友可以参考下
    2022-08-08
  • vue实现一个获取按键展示快捷键效果的Input组件

    vue实现一个获取按键展示快捷键效果的Input组件

    这篇文章主要介绍了vue如何实现一个获取按键展示快捷键效果的Input组件,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • Vue3中组件数据通信方式总结

    Vue3中组件数据通信方式总结

    如果在面试中,面试官问你Vue组件之间有哪些数据通信方式,你会怎么回复,不要担心,本文为大家整理了超全的Vue3中组件数据通信方式,需要的小伙伴快收藏起来吧
    2023-06-06
  • vue嵌套路由与404重定向实现方法分析

    vue嵌套路由与404重定向实现方法分析

    这篇文章主要介绍了vue嵌套路由与404重定向实现方法,结合实例形式分析了vue.js嵌套路由与404重定向的概念、原理、实现步骤与相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Vue3使用ref和reactive管理状态的代码示例

    Vue3使用ref和reactive管理状态的代码示例

    ref 和 reactive 是 Composition API 中用来声明响应式数据的两个核心函数,在 Vue 3 中,使用 setup 语法糖可以更简洁地使用这些功能,本文将探讨如何使用 ref 和 reactive 来管理状态,并解释它们之间的区别,需要的朋友可以参考下
    2024-09-09
  • vue v-for中key的原理详析

    vue v-for中key的原理详析

    key属性可以用来提升v-for渲染的效率,vue中使用v-for渲染数据的时候,并不会去改变原有的元素和数据,下面这篇文章主要给大家介绍了关于vue v-for中key原理的相关资料,需要的朋友可以参考下
    2022-04-04
  • vue中如何给多个按钮动态添加类名

    vue中如何给多个按钮动态添加类名

    这篇文章主要介绍了vue中如何给多个按钮动态添加类名问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论