vue 使用 vue-pdf 实现pdf在线预览的示例代码


Posted in Javascript onApril 26, 2020

背景

之前的demo增加了图片预览,于是今天下午追完番剧就突然想到能不能把pdf在线预览也做了,说干就干,刚开始查了很多教程,我发现很多人都在说什么pdf.js这个库,这当然没什么问题,pdf.js的确可以非常完美的实现pdf在线预览的过程,但是感觉这样直接进去有点不太优雅,于是找找看看有没有什么现成的组件,发现有vue-pdf这个组件,虽然说它没有原生那样强大,比如不支持pdf文字复制,打印会乱码,但是我感觉已经足以满足我的需求了。本篇笔记循序渐进,从基础的demo,到一个可用的程度,文末列出了大家在实际使用的过程中可能会遇到的问题和解决方案。

安装:

这个没有啥背景知识可讲,我们直接跳到安装环节,vue-pdf 和其他vue组件的安装并无不同,打开命令行,敲入:

npm install --save vue-pdf

注意路径。别在桌面调出来个终端安装了,这种直接打回去重学Vue。

vue-pdf 初体验:

安装完之后,使用vue-pdf非常简单,和其他的组件并没有什么不同,上代码:

首先我们需要引入这个组件:

<script>
import pdf from 'vue-pdf'
export default {
 components:{
   pdf
 },
 data(){
   return {
     url:"http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf",
   }
 }
</script>

然后在页面使用vue-pdf,只需要添加标签:

<template>
<div>
 <pdf 
  ref="pdf"
  :src="url">
 </pdf>
</div>
</template>

重启你的项目,访问这个界面,你大概率会发现pdf已经成功显示在你的界面上了。这没有任何问题,但是,正当你准备拿起一根烟,点上,伴着舒适的《美丽的梭罗河》,欣赏你成功的杰作的时候,你会发现,我擦,为啥只有一页,当玻璃杯碰在一起,满世界都是梦破碎的声音。

所以,这只是初体验,如果你的pdf只有一页,这样写当然没什么问题,但是当我们呢pdf 有很多页的时候,你会发现,这行不通了。所以,接下来,我们来看看怎么让它显示多页。

vue-pdf 渐入佳境:

其实,想要显示多页也没那么复杂,你每次就显示一页,我,直接v-for 循环,直接显示完,简单粗暴。

页面代码:

<template>
 <div>
 <pdf v-for="i in numPages" :key="i" :src="url" :page="i"></pdf> 
 </div>
</template>

<script>
 import pdf from 'vue-pdf'
 export default {
 components: {
  pdf
 },
 data(){
  return{
    url: '',
    numPages:1,
  }
  },
 mounted: function() {
  this.getNumPages("http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf")
  
 }, 
 methods: {
  getNumPages(url) {
  var loadingTask = pdf.createLoadingTask(url)
  loadingTask.then(pdf => {
   this.url = loadingTask
   this.numPages = pdf.numPages
  }).catch((err) => {
   console.error('pdf加载失败')
  })
  },
 }
 }
</script>

各个属性:

  • url :pdf 文件的路径,可以是本地路径,也可以是在线路径。
  • numPages : pdf 文件总页数。

getNumPages 计算总页数,顺便给url和numPages赋值。

唯一需要大家注意的是这句:

this.getNumPages("http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf")

注意啊,这句不一定非要写到mounted里面,你想写哪就写哪,比如你前端请求后端,后端返回一个pdf 的url,在那里写就行,写在你需要的地方。

vue-pdf 轻车熟路:

很多人看到这,就这,就这?万一,我pdf有一千页,我浏览器还不得裂开,我追求的是那种在微醺的下午,一页一页的翻看的感觉,你能给我吗?

我不能,才怪,保证满足你。

<template>
 <div>
 <div class="tools">
  <bk-button :theme="'default'" type="submit" :title="'基础按钮'" @click.stop="prePage" class="mr10"> 上一页</bk-button>
  <bk-button :theme="'default'" type="submit" :title="'基础按钮'" @click.stop="nextPage" class="mr10"> 下一页</bk-button>
  <div class="page">{{pageNum}}/{{pageTotalNum}} </div>
  <bk-button :theme="'default'" type="submit" :title="'基础按钮'" @click.stop="clock" class="mr10"> 顺时针</bk-button>
  <bk-button :theme="'default'" type="submit" :title="'基础按钮'" @click.stop="counterClock" class="mr10"> 逆时针</bk-button>
 </div>
 <pdf ref="pdf" 
 :src="url" 
 :page="pageNum"
 :rotate="pageRotate" 
 @progress="loadedRatio = $event"
 @page-loaded="pageLoaded($event)" 
 @num-pages="pageTotalNum=$event" 
 @error="pdfError($event)" 
 @link-clicked="page = $event">
 </pdf>
 </div>
</template>

接下来,我们一一介绍这些都是个啥。

参数介绍:

  • page: 当前显示的页数,比如第一页page=1
  • rotate : 旋转角度,比如0就是不旋转,+90,-90 就是水平旋转。
  • progress :当前页面的加载进度,范围是0-1 ,等于1的时候代表当前页已经完全加载完成了。
  • page-loaded :页面加载成功的回调函数,不咋能用到。
  • num-pages :总页数
  • error :加载错误的回调
  • link-clicked:单机pdf内的链接会触发。

其他:

  • print 这个是打印函数。 注意:谷歌浏览器会出现乱码,这个和字体有关系。

来,js代码走一个:

<script>
 import pdf from 'vue-pdf'
 export default {
 name: 'Home',
 components: {
  pdf
 },
 data() {
  return {
  url: "http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf",
  pageNum: 1,
  pageTotalNum: 1,
  pageRotate: 0,
  // 加载进度
  loadedRatio: 0,
  curPageNum: 0,
  }
 },
 mounted: function() {},
 methods: {
      // 上一页函数,
  prePage() {
  var page = this.pageNum
  page = page > 1 ? page - 1 : this.pageTotalNum
  this.pageNum = page
  },
      // 下一页函数
  nextPage() {
  var page = this.pageNum
  page = page < this.pageTotalNum ? page + 1 : 1
  this.pageNum = page
  },
      // 页面顺时针翻转90度。
  clock() {
  this.pageRotate += 90
  },
      // 页面逆时针翻转90度。
  counterClock() {
  this.pageRotate -= 90
  },
      // 页面加载回调函数,其中e为当前页数
  pageLoaded(e) {
  this.curPageNum = e
  },
      // 其他的一些回调函数。
  pdfError(error) {
  console.error(error)
  },
 }
 }
</script>

其他骚操作:

// 打印全部
pdfPrintAll() {
 this.$refs.pdf.print()
 },
// 打印指定部分
pdfPrint() {
 this.$refs.pdf.print(100, [1, 2])
 },

具体样式什么的我就不贴出来了,这些都不是重点,完全可以改成自己喜欢的。

成品展示:

vue 使用 vue-pdf 实现pdf在线预览的示例代码

其他问题以及解决方案:

跨域问题:
网上用pdf.js 很多都会遇到跨域问题,这个我今天实际应用到自己的项目里面了,由于我服务端设置了跨域,所以没有出现跨域的问题,如果出现跨域需要修改你后端的请求头。

打印界面字符乱码:
这个我倒是碰到了,谷歌浏览器打印的时候,预览界面真的变成了 真·方块字 ,全是方块。这个问题是因为你pdf中使用了自定义字体导致的,具体解决方案如下:

首先,找到这个文件:node_modules/vue-pdf/src/pdfjsWrapper.js

然后根据github上这个issue,其中红色的是要删掉的,绿色的是要加上去的,照着改就可以解决了。

地址: https://github.com/FranckFreiburger/vue-pdf/pull/130/commits/253f6186ff0676abf9277786087dda8d95dd8ea7

根据我的实际测试,是可以解决打印乱码的问题的。

到此这篇关于vue 使用 vue-pdf 实现pdf在线预览的示例代码的文章就介绍到这了,更多相关vue pdf在线预览内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JQuery 获取和设置Select选项的代码
Feb 07 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
Sep 23 Javascript
JavaScript里四舍五入函数round用法实例
Apr 06 Javascript
JavaScript小技巧整理篇(非常全)
Jan 26 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
Apr 02 Javascript
javascript实现简单搜索功能
Mar 26 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 #Javascript
详解关于Vue单元测试的几个坑
Apr 26 #Javascript
es6函数之箭头函数用法实例详解
Apr 25 #Javascript
es6数组之扩展运算符操作实例分析
Apr 25 #Javascript
es6函数之尾调用优化实例分析
Apr 25 #Javascript
es6函数之尾递归用法实例分析
Apr 25 #Javascript
javascript 易错知识点实例小结
Apr 25 #Javascript
You might like
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
论坛头像随机变换代码
2006/10/09 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
JavaScript类的写法
2016/09/17 Javascript
AngularJS  双向数据绑定详解简单实例
2016/10/20 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
Java面试题及答案
2012/09/08 面试题
尊师重教演讲稿
2014/09/04 职场文书
关于工作经历的证明书
2014/10/11 职场文书
财政局个人年终总结
2015/03/03 职场文书
放假通知格式
2015/04/14 职场文书
党员违纪检讨书
2015/05/05 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL