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 相关文章推荐
Array.slice()与Array.splice()的返回值类型
Oct 09 Javascript
再论Javascript的类继承
Mar 05 Javascript
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
javascript判断chrome浏览器的方法
Mar 26 Javascript
sails框架的学习指南
Dec 22 Javascript
javascript中CheckBox全选终极方案
May 20 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 Javascript
简单的三步vuex入门
May 20 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
小试小程序云开发(小结)
Jun 06 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
优化使用mysql存储session的php代码
2008/01/10 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
python3下载抖音视频的完整代码
2019/06/05 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
机电职业生涯规划书范文
2014/03/08 职场文书
年终考核实施方案
2014/05/26 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书