vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法


Posted in Javascript onJuly 12, 2018

目前大多数PC浏览器支持在线预览pdf文件,但大多数手机浏览器还未支持,尝试用手机浏览器打开一个pdf文件会弹出是否下载的提示框。网上查了一些资料,在实现的过程中,还是走了比较多的弯路,最后采用了备受推荐的pdf.js插件来实现。

pdf.js可以从github上clone下来,然后本地gulp生成可用的pdf.js和pdf.worker.js(参考readme即可)。

不过更简单的方法是使用cnpm来安装: cnpm isntall --save pdfjs-dist,然后可以在项目中使用了,我使用插件的方式。具体使用示例:

pdf.vue

<template><p id="container">
  <!-- <p class='pdf-page'> -->
   <canvas id="the-canvas"></canvas></p><p class="foot" v-if="pdfDoc"><button class="left" click="onPrevPage" v-if="pageNum>1">上一页</button><button class="right" click="onNextPage" v-if="pageNum<pdfDoc.numPages">下一页</button></p>
  <!-- </p> --><p></p>
</template>
<script>
import PDFJS from 'pdfjs-dist'
 
export default {
 data () {
  return {
   pdfDoc: null,
   pageNum: 1,
   pageRendering: false,
   pageNumPending: null,
   scale: 0.9
  }
 },
 methods: {
  showPDF (url) {
   let _this = this
   PDFJS.getDocument(url).then(function (pdf) {
    _this.pdfDoc = pdf
    _this.renderPage(1)
   })
  },
  renderPage (num) {
   this.pageRendering = true
   let _this = this
   this.pdfDoc.getPage(num).then(function (page) {
    var viewport = page.getViewport(_this.scale)
    let canvas = document.getElementById('the-canvas')
    canvas.height = viewport.height
    canvas.width = viewport.width
 
    // Render PDF page into canvas context
    var renderContext = {
     canvasContext: canvas.getContext('2d'),
     viewport: viewport
    }
    var renderTask = page.render(renderContext)
 
    // Wait for rendering to finish
    renderTask.promise.then(function () {
     _this.pageRendering = false
     if (_this.pageNumPending !== null) {
      // New page rendering is pending
      this.renderPage(_this.pageNumPending)
      _this.pageNumPending = null
     }
    })
   })
  },
  queueRenderPage (num) {
   if (this.pageRendering) {
    this.pageNumPending = num
   } else {
    this.renderPage(num)
   }
  },
  onPrevPage () {
   if (this.pageNum <= 1) {
    return
   }
   this.pageNum--
   this.queueRenderPage(this.pageNum)
  },
  onNextPage () {
   if (this.pageNum >= this.pdfDoc.numPages) {
    return
   }
   this.pageNum++
   this.queueRenderPage(this.pageNum)
  }
 }
}
</script><style scoped="" type="text/css">#container {
 background-color: rgba(0,0,0,0.75);
 position:fixed;
 width: 100%;
 height: 100%;
 top: 0;
 left: 0;
 text-align: center;
 padding: 5px;
}
 
.pdf-page {
 
}
 
.foot {
 position: fixed;
 transform: translate(-50%,0);
 left: 50%;
}</style>

index.js:

import PDF from './PDF'
 
var $vm
export default {
 install (Vue, options) {
  if (!$vm) {
   const PDFPlugin = Vue.extend(PDF)
   $vm = new PDFPlugin().$mount()
   document.body.appendChild($vm.$el)
  }
  Vue.prototype.$showPDF = function (url) {
   $vm.showPDF(url)
  }
 }
}

把两个文件放到同一文件夹pdf中形成一个插件,在main.js引入并use:

import pdf from '@/components/pdf'
Vue.use(pdf)

这样,在需要显示pdf的地方调用vue的$showPDF方法即可。

效果显示(手机浏览器验证显示正常):

vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法

不过需要注意一点问题是:

pdf.js不能处理跨域文件和本地文件,所以本地调试的时候应该请求服务器的文件,如果请求的是远程服务器,存在跨域,那就需要在config/index.js中配置一下代理:

// ...
proxyTable: {
 '/media': {
  target: 'https://xxxx.cn', // 换成正确的服务器域名
  changeOrigin: true,
  pathRewrite: {
   '^/media': '/media'
  }
 }
}
// ...

然后在使用的地方填相对路径即可:

// ...
mounted () {
 this.$showPDF('/media/up/2018/3/9/494079c7ec333bd371798dd0a73c0a0b.pdf')
}
// ...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
ExtJS 2.0实用简明教程之应用ExtJS
Apr 29 Javascript
JS小框架 fly javascript framework
Nov 26 Javascript
JavaScript 常见对象类创建代码与优缺点分析
Dec 07 Javascript
一个简单的js鼠标划过切换效果
Jun 30 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
Jun 27 Javascript
JavaScript Math.floor方法(对数值向下取整)
Jan 09 Javascript
如何实现json数据可视化详解
Nov 24 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
Dec 07 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 jQuery
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
vue中如何实现pdf文件预览的方法
Jul 12 #Javascript
js+css实现红包雨效果
Jul 12 #Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 #Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 #Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 #Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 #Javascript
Vue.js实现的计算器功能完整示例
Jul 11 #Javascript
You might like
使用PHPMailer发送邮件实例
2017/02/15 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python当中的array数组对象实例详解
2019/06/12 Python
python3.7 sys模块的具体使用
2019/07/22 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
运动会解说词100字
2014/01/31 职场文书
化妆品促销方案
2014/02/24 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
新年联欢会主持词
2014/03/27 职场文书
开发房地产协议书
2014/09/14 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
python爬虫selenium模块详解
2021/03/30 Python
浅谈python数据类型及其操作
2021/05/25 Python
JavaScript流程控制(分支)
2021/12/06 Javascript
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL