vue中如何实现pdf文件预览的方法


Posted in Javascript onJuly 12, 2018

今天产品提出一个优化的需求,就是之前我们做的图片展示就是一个img标签搞定,由于我们做的是海外后台管理系统,那边的人上传的文件时pdf格式,vue本事是不支持这种格式文件展示的,于是就google搜索,发现有iframe、embed、vueshowpdf(测试了不咋好用)、pdf等,本文说一下pdf插件的使用过程。

说明:iframe标签这种,对于有的链接是可以的,比如这种链接在服务器端没有设置享有头content-disposition,就可以直接显示,如下:

vue中如何实现pdf文件预览的方法

想复制代码如下:

<iframe src="http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf" width="100%" height="100%">
 This browser does not support PDFs. Please download the PDF to view it: <a href="/test.pdf" rel="external nofollow" >Download PDF</a>
</iframe>

显示效果如下:

vue中如何实现pdf文件预览的方法

如果pdf有很多页,也不用考虑分页功能,自动可以向下滑动就翻页,看着挺好,但是,且往下继续看----->

我们把上边的链接换成' https://ecs7.tokopedia.net/instant-loan/file/29a2218e-bef9-44cb-b92b-8e81bc4d5228_DOC-20171013-WA0035.pdf ',发现什么了?快看截图。。。同样是pdf链接,怎么这个就不行?

vue中如何实现pdf文件预览的方法

什么情况,下载框,必须下载才能看到,那多影响体验,下到本地还占我磁盘,不行不行,把上边那个连接放到浏览器,回车看一下响应头部:

content-disposition :attachment; filename="DOC-20171013-WA0035.pdf"

就是它,让我们必须弹出下载框,由于这些文件是在远程服务器上存贮着,想着让后端看能不能检测到这个响应头,他们也懒得处理,后来只能自己处理了,鉴于这种情况,网上也是有很多解决办法的,本人试验过可以的。中间也是借用了一篇文章 ,根据自己需求,做了简单的处理。

过程如下:

  • 执行npm install pdf-dist --save
  • 在comments目录下创建两个文件:pdf.vue 和 index.js
< !--pdf.vue--><template >
 <div id = "container": class = "{'back': isShow}" >
 <canvas id = "the-canvas" > 
</canvas> 
 <!-- / / 添加关闭pdf功能-->
<span: class = "{'close':isShow}"@click = "closePdf" > close < /span> 
 <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 > 
</div>
 </template > 
<script >
 import PDFJS from 'pdfjs-dist'export
default {
 data() {
  return {
  isShow:
  false,
  //通过该属性动态添加类,让pdf显示或隐藏 
  pdfDoc: null,
  //可以打印发现是一个对象,里面有页数信息等 
  pageNum: 1,
  pageRendering: false,
  pageNumPending: null,
  scale: 0.9
  }
 },
 methods: {
  closePdf() {
  this.isShow = false
  },
  showPDF(url) {
  this.isShow = true 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 ">
.back { 
background-color: rgba(0, 0, 0, 0.788); position:fixed; 
width: 100%; 
 height: 100%; 
top: 0; left: 0; 
 text-align: center; 
 padding: 20px; 
z-index: 100; 
 overflow: scroll;
}
.close{ 
 position: absolute; 
 right: 20px; 
 top: 20px; 
z-index: 200; 
color: #fff; 
cursor: pointer;
} 
.foot {
 position: absolute; 
bottom: 50px; 
left: 50%; 
 transform: translate(-50%,0);
}
</style>"
// index.js
import PDF from './pdf'
var $vmexport
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)
  }
 }
 }

3. 在main.js中引入

import pdf from './components/pdf'
Vue.use(pdf)

这样就可以全局使用了,使用的时候就直接使用,本文是在一个图片展示 的地方加上一个点击事件,点击时触发该函数即可;

function showPdf() {
 let url = 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf'
 // let url = 'https://ecs7.tokopedia.net/instant-loan/file/29a2218e-bef9-44cb-b92b-8e81bc4d5228_DOC-20171013-WA0035.pdf' 
 this.$showPDF(url)
}

文中添加了关闭功能,点击close即可关闭pdf的展示, 同时组件中也有分页功能,如果页数大于1就会显示下一页按钮;

vue中如何实现pdf文件预览的方法

以上既是本人实现的过程,至于跨域问题,我这边还没遇到,现在是本地访问可以的,等到线上再看看行不行,如果不行后边再追加方法实现。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
Jul 18 Javascript
jQuery基础语法实例入门
Dec 23 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
微信小程序从注册账号到上架(图文详解)
Jul 17 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 Javascript
vue props default Array或是Object的正确写法说明
Jul 30 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 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
JavaScript类的继承方法小结【组合继承分析】
Jul 11 #Javascript
You might like
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
python解释器spython使用及原理解析
2019/08/24 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
门面房租房协议书
2014/08/20 职场文书
个人授权委托书格式
2014/08/30 职场文书
小学班级口号大全
2015/12/25 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫