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 相关文章推荐
JS定时器实例详细分析
Oct 11 Javascript
jQuery filter函数使用方法
May 19 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
Underscore源码分析
Dec 30 Javascript
全面了解addEventListener和on的区别
Jul 14 Javascript
JS获取一个未知DIV高度的方法
Aug 09 Javascript
js实现上传图片预览方法
Oct 25 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
JavaScript实现的数字与字符串转换功能示例
Aug 23 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
vue-i18n结合Element-ui的配置方法
May 20 Javascript
Vue实现省市区三级联动
Dec 27 Vue.js
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
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php实现的短网址算法分享
2014/06/20 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
资产经营总监岗位职责范文
2013/12/01 职场文书
超市中秋节促销方案
2014/03/21 职场文书
合作意向书格式及范文
2014/03/31 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
专家推荐信怎么写
2015/03/25 职场文书