返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue通过url方式展示PDF的几种方法
  • 601
分享到

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

vue url方式vue展示pdf文件流vue实现pdf预览 2023-01-17 12:01:49 601人浏览 独家记忆
摘要

目录1.使用pdfjs-dist 插件,通过iframe标签显示 2.使用Vue-pdf插件3.第三种方法使用了pdfjs-dist插件,通过url实现PDF转图片显示4.

最近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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue通过url方式展示PDF的几种方法

本文链接: https://lsjlt.com/news/178001.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue通过url方式展示PDF的几种方法
    目录1.使用pdfjs-dist 插件,通过iframe标签显示 2.使用vue-pdf插件3.第三种方法使用了pdfjs-dist插件,通过url实现PDF转图片显示4....
    99+
    2023-01-17
    vue url方式 vue展示pdf文件流 vue实现pdf预览
  • php获取url扩展名的几种方法是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php获取url扩展名的方法方法1:<php $url="http://localhost/user/order.php"; function...
    99+
    2014-10-06
    php url 扩展名
  • vue组件通信有哪几种方式
    vue中组件通信的方式有:1.使用props/$emit实现父子组件通信;2.使用$refs/$parent/$children/$root实现父子组件通信;3.使用$attrs/$listener实现隔代组件通信;4.使用provide/...
    99+
    2024-04-02
  • Vue显示图片的几种方式小结
    目录前言使用原生img标签使用ElementUI的Avatar总结前言 最近在做自己的项目,有这么一个需求,用户列表需要展示用户的头像,之前一直没有处理,趁着这次机会,正好分享下我的...
    99+
    2023-02-05
    Vue显示图片 Vue图片显示
  • Vue组件间通信有哪几种方式
    这篇文章将为大家详细讲解有关Vue组件间通信有哪几种方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue 组件间通信有哪几种方式?Vue 组件间通信是面试常考的知识点...
    99+
    2024-04-02
  • Vue实现组件间通信的几种方式(多种场景)
    目录1、Props 父 >>> 子  (Props)子 >>> 父 ($emit)2、Bus事件总线3、V...
    99+
    2024-04-02
  • SpringBoot通过注解注入Bean的几种方式解析
    目录1、背景xml扫描包的方式2、通过注解注入的一般形式2.1、Bean类2.2、Configuration类2.3、Test类3、通过构造方法注入Bean3.1、Bean类3.2、...
    99+
    2024-04-02
  • 几种常见的HTML与PDF转换方法
    HTML与PDF是两种常见的文档格式,HTML用于在web浏览器中呈现内容,而PDF用于打印和文档共享。有时我们需要将HTML转换成PDF或将PDF转换成HTML以适应不同的需求。本文将介绍几种常见的HTML与PDF转换方法。一、使用在线转...
    99+
    2023-05-14
  • vue引用组件的几种方式
    vue引用组件有3种方式:1、通过v-model或者.sync显式控制组件显示隐藏;2、使用js代码进行引用组件;3、使用Vue指令进行引用组件。具体分析如下:Dialog我习惯把这个东西叫做对话框,实际上还有叫做modal(弹窗)组件的 ...
    99+
    2024-04-02
  • vue时间转换的几种方式
    VUE 时间转换 做一个项目肯定会关系到很多的数据类型,数据类型之间都是可以转化的,,前端有时候从后端拿到的时间不符合标准,此时就需要转换以后再去使用,转换有两种方式,看你个人比较喜...
    99+
    2024-04-02
  • 在vue中写jsx的几种方式
    目录版本render函数jsx/tsx使用jsx的几种方式使用js对象注册component使用.vue文件vue2.7在.vue文件中结合compositionApi和jsx版本 ...
    99+
    2024-04-02
  • vue封装axios的几种方法
    目录基础版第一步:配置axios 第二步:封装请求 第三步:使用 进阶版基础版 第一步:配置axios 首先,创建一个Service.js,这里面存放的时axios的配置以及拦截器...
    99+
    2024-04-02
  • Django动态展示Pyecharts图表数据的几种方法
    目录Django 模板渲染1. 新建一个 Django 项目2. 新建项目 urls 文件3. 编写 Django 和 pyecharts 代码渲染图表定时全量更新图表定时增量更新图...
    99+
    2024-04-02
  • 详解vue样式穿透的几种方式
    目录scoped属性样式穿透总结scoped属性 我们在vue组件写样式一般是在<style>标签里面,但是我们在这里的样式默认是全局样式,如果其它组件的class名取重...
    99+
    2024-04-02
  • Python·安装扩展包的几种方法
    以安装扩展包SymPy为例: 方式一: 格式:pip install xxx    //xxx:包名 示例:pip install SymPy 方式二: 如果有安装Git,也可以使用pip+git的方式安装:pip install git...
    99+
    2023-01-31
    几种方法 Python
  • 详解Spring通过@Value注解注入属性的几种方式
    场景假如有以下属性文件dev.properties, 需要注入下面的tagtag=123通过PropertyPlaceholderConfigurer<bean class="org.springframework.beans.fac...
    99+
    2023-05-31
    spring value 注解
  • vue 组件通信的多种方式
    目录前言一、vuex二、eventBus三、props/emit四、$parent/$children五、$attrs/$listeners六、provide/inject前言 在v...
    99+
    2024-04-02
  • 聊聊Vue提示框设置时间的几种方法
    Vue是一种流行的JavaScript框架,用于构建现代和交互式的Web应用程序。提示框是一个常用的UI组件,可以帮助用户在需要时快速了解信息。在Vue中,可以使用各种库和组件来创建提示框,其中包括一些具有时间参数的选项。本文将讨论Vue提...
    99+
    2023-05-14
  • 浅谈vue中文件下载的几种方式及方法封装
    一、通过对后端发送post请求,使用blob下载文件 function downBlob(res, fileName = "导出报表", format = "xlsx") {   ...
    99+
    2023-01-13
    vue 文件下载
  • java方法调用的方式有哪几种
    在Java中,方法调用的方式主要有以下几种: 直接调用:直接在代码中使用方法名和参数调用方法。 通过对象调用:通过对象名调用对象的...
    99+
    2024-03-11
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作