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 相关文章推荐
JavaScript 学习笔记(十一)
Jan 19 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
Jan 04 Javascript
从阶乘函数对比Javascript和C#的异同
May 31 Javascript
仿新浪微博返回顶部的jquery实现代码
Oct 01 Javascript
JS图片无缝滚动(简单利于使用)
Jun 17 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
jquery 使用简明教程
Mar 05 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
Oct 25 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 Javascript
H5 js点击按钮复制文本到粘贴板
Nov 19 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
thinkphp 多表 事务详解
2013/06/17 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
PHP pear安装配置教程
2016/05/14 PHP
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Django 重写用户模型的实现
2019/07/29 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
python中实现栈的三种方法
2020/12/19 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
一份软件工程师的面试试题
2016/02/01 面试题
几道Web/Ajax的面试题
2016/11/05 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
医院门卫岗位职责
2013/12/30 职场文书
集体婚礼证婚词
2014/01/13 职场文书
2014年销售员工作总结
2014/12/01 职场文书
承诺函格式模板
2015/01/21 职场文书
个人德育工作总结
2015/03/05 职场文书
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python