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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
Dec 10 Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
May 08 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
Jan 04 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 Javascript
详解vue.js移动端配置flexible.js及注意事项
Apr 10 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
Vue 3.0 全家桶抢先体验
Apr 28 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
python文件排序的方法总结
2020/09/13 Python
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
商务专员岗位职责
2013/11/23 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
python异步的ASGI与Fast Api实现
2021/07/16 Python
Ruby处理CSV数据方法详解
2022/04/18 Ruby