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函数
Nov 20 Javascript
Javascript 调试利器 Firebug使用详解六
Jul 05 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
node.js中的fs.rmdirSync方法使用说明
Dec 16 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
Mar 18 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
Sep 21 Javascript
vue完美实现el-table列宽自适应
May 08 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP多文件上传类实例
2015/03/07 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
domReady的实现案例
2016/11/23 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
Python线程的两种编程方式
2015/04/14 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
医学类导师推荐信范文
2013/11/19 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
高级编程求职信模板
2014/02/16 职场文书
小学英语课后反思
2014/04/26 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
敬老院标语
2014/06/27 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
2014年变电站工作总结
2014/12/19 职场文书
团队拓展训练感想
2015/08/07 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Python OpenCV超详细讲解基本功能
2022/04/02 Python