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编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
jQuery基于Ajax方式提交表单功能示例
Feb 10 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 jQuery
Javascript获取某个月的天数
May 30 Javascript
ES6入门教程之let、const的使用方法
Apr 13 Javascript
Node使用Selenium进行前端自动化操作的代码实现
Oct 10 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
Apr 09 Javascript
js+css实现全屏侧边栏
Jun 16 Javascript
JavaScript设计模式之原型模式详情
Jun 21 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
php实现转换ubb代码的方法
2015/06/18 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
小程序实现多列选择器
2019/02/15 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
python之pandas用法大全
2018/03/13 Python
python中pika模块问题的深入探究
2018/10/13 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
个人工作表现自我评价
2015/03/06 职场文书
个人简历求职信范文
2015/03/20 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
新学期家长寄语2016
2015/12/03 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python