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 相关文章推荐
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
dwz 如何去掉ajaxloading具体代码
May 22 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
Jun 14 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
旺旺在线客服代码 旺旺客服代码生成器
Jan 09 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 Javascript
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
十天学会php之第五天
2006/10/09 PHP
PHP实现图片压缩
2020/09/09 PHP
php实现映射操作实例详解
2019/10/02 PHP
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
js简单抽奖代码
2015/01/16 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[55:03]LGD vs EG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python列表推导式的使用方法
2013/11/21 Python
python插入数据到列表的方法
2015/04/30 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python批量创建指定名称的文件夹
2019/03/21 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
大学生村官心得体会范文
2014/01/04 职场文书
学生会主席事迹材料
2014/01/28 职场文书
班风学风建设方案
2014/05/06 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电