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 相关文章推荐
jQuery 选择表格(table)里的行和列及改变简单样式
Dec 15 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
常用javascript表单验证汇总
Jul 20 Javascript
easyui导出excel无法弹出下载框的快速解决方法
Nov 10 Javascript
require.js中的define函数详解
Jul 10 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 Javascript
在vue中配置不同的代理同时访问不同的后台操作
Sep 11 Javascript
vue选项卡切换的实现案例
Apr 11 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使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
分页栏的web标准实现
2011/11/01 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
微信小程序实现animation动画
2018/01/26 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python基础教程项目二之画幅好画
2018/04/02 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
社区八一活动方案
2014/02/03 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
预备党员转正材料
2014/12/19 职场文书
2015年司机工作总结
2015/04/23 职场文书
Python实现简繁体转换
2021/06/07 Python
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
python实现手机推送 代码也就10行左右
2022/04/12 Python
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript