vue实现pdf文档在线预览功能


Posted in Javascript onNovember 26, 2019

针对android系统不支持pdf文档在线预览,可通过引入pdf.js插件实现,其具体实现步骤如下

一、引入插件

方式一:npm install --save pdfjs-dist,安装完成后在vue项目的node_modules出现如下依赖

vue实现pdf文档在线预览功能

方式二:只引入pdf.js的核心文件pdf.js和pdf.work.js,其他无关的文件全部删除,如图

vue实现pdf文档在线预览功能

方式三:将插件直接放在static文件夹下,如图

vue实现pdf文档在线预览功能

二、前端页面代码

方式一和方式二:特点精简

<template>
 <div>
 <canvas v-for="page in pages" :id="'the-canvas'+page" :key="page"></canvas>
 </div>
</template>
 
<script>
// 方式一
import PDFJS from 'pdfjs-dist'
// 方式二
import * as PDFJS from '../../../static/pdf/build/pdf'
 
export default {
 // 返回数据
 data () {
 return {
 pdfDoc: null,
 pages: 0
 }
 },
 created () {
 },
 mounted () {
 this.showPdf()
 },
 methods: {
 showPdf: function () {
 // 请求本地文件
 let url = '/static/pdf/web/compressed.tracemonkey-pldi-09.pdf'
 // 跨域请求文件,需要走后台代理,后台需要将文件流返回前端才可在页面显示
 // let url = '/pdf/showPdf?pdfUrl=http://test.hccb.cc/corporBankWXTest/static/123.pdf'
 this.loadFile(url)
 },
 renderPage: function (num) {
 let _this = this
 this.pdfDoc.getPage(num).then(function (page) {
 let canvas = document.getElementById('the-canvas' + num)
 let ctx = canvas.getContext('2d')
 let dpr = window.devicePixelRatio || 1.0
 let bsr = ctx.webkitBackingStorePixelRatio ||
  ctx.mozBackingStorePixelRatio ||
  ctx.msBackingStorePixelRatio ||
  ctx.oBackingStorePixelRatio ||
  ctx.backingStorePixelRatio || 1.0
 let ratio = dpr / bsr
 let viewport = page.getViewport(window.screen.availWidth / page.getViewport(1).width)
 canvas.width = viewport.width * ratio
 canvas.height = viewport.height * ratio
 canvas.style.width = viewport.width + 'px'
 canvas.style.height = viewport.height + 'px'
 ctx.setTransform(ratio, 0, 0, ratio, 0, 0)
 var renderContext = {
  canvasContext: ctx,
  viewport: viewport
 }
 page.render(renderContext)
 if (_this.pages > num) {
  _this.renderPage(num + 1)
 }
 })
 },
 loadFile: function (url) {
 let _this = this
 PDFJS.getDocument(url).then(function (pdf) {
 _this.pdfDoc = pdf
 _this.pages = _this.pdfDoc.numPages
 _this.$nextTick(() => {
  _this.renderPage(1)
 })
 })
 }
 }
}
</script>
 
<style scoped>
canvas {
 display: block;
 border-bottom: 1px solid black;
}
</style>

方式三:功能强大,但是引入过多无用文件,此种方式的filePath如为本地文件不进行编码也可发送请求,如为跨域文件不进行编码无法发送请求,因此建议统一进行编码。

<template>
 <div >
 <iframe :src="url" id="iframe" style="width: 100%;" @load="sureHeight"></iframe>
 </div>
</template>
 
<script>
export default {
 // 返回数据
 data () {
 return {
 url: ''
 }
 },
 // 模块创建时执行
 created () {
 },
 // 模块渲染时执行
 mounted () {
 // 本地请求文件
 let filePath = encodeURIComponent('/static/pdf/web/compressed.tracemonkey-pldi-09.pdf')
 // 跨域请求文件,需走后台代理
 // let filePath2 = encodeURIComponent('/pdf/showPdf?pdfUrl=http://test.hccb.cc/corporBankWXTest/static/123.pdf')
 // pdf文档展示的页面
 this.url = '/static/pdf/web/viewer.html?file=' + filePath
 },
 // 定义模块测试方法
 methods: {
 // 此方法用于动态确定元素iframe的高度,使展示的pdf文档占满整个屏幕
 sureHeight: function () {
 let element = document.getElementById('iframe')
 element.style.height = window.screen.height + 'px'
 }
 }
}
</script>
 
<style scoped>
 
</style>

三、后台代码实现

后台通过http请求将获取的文档流返回给前端

@Controller
public class ShowPdfController {
 @RequestMapping(name = "/showPdf")
 public String showPdf(HttpServletRequest request, HttpServletResponse response, String pdfUrl) {
 try {
  pdfUrl = pdfUrl.trim();
  URL url = new URL(pdfUrl);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  conn.setConnectTimeout(5*1000);
  InputStream inputStream = conn.getInputStream();
  response.setHeader("Content-Disposition", "attachment;fileName=show.pdf");
  response.setContentType("multipart/form-data");
  OutputStream outputStream = response.getOutputStream();
  IOUtils.write(IOUtils.toByteArray(inputStream), outputStream);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return null;
 }
}

具体采用哪种方式实现pdf文档的在线预览,可根据项目实际情况选择,如业务简单建议使用方式一和方式二(精简),如业务复杂建议使用方式三(功能强大)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 面向对象的之私有成员和公开成员
May 04 Javascript
javascript中打印当前的时间实现思路及代码
Dec 18 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
浅谈javascript基础之客户端事件驱动
Jun 10 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
Nov 13 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Dec 15 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
Jun 13 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
Jun 22 jQuery
Vue移动端右滑屏幕返回上一页附源码下载
Jun 26 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 jQuery
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
Vue实现商品飞入购物车效果(电商项目)
Nov 26 #Javascript
使用Vue生成动态表单
Nov 26 #Javascript
vue实现在线预览pdf文件和下载(pdf.js)
Nov 26 #Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 #Javascript
详解小程序如何动态绑定点击的执行方法
Nov 26 #Javascript
vue element-ui读取pdf文件的方法
Nov 26 #Javascript
Vue+Element-UI实现上传图片并压缩
Nov 26 #Javascript
You might like
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
2015/12/03 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
Python生成随机验证码的两种方法
2015/12/22 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python异常处理try except过程解析
2020/02/03 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
建筑工程实习自我鉴定
2013/09/19 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
道歉的话怎么说
2015/05/12 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS