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应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
javascript replace方法与正则表达式
Feb 19 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
详解AngularJS controller调用factory
May 19 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
vue-自定义组件传值的实例讲解
Sep 18 Javascript
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
javascript canvas时钟模拟器
Jul 13 Javascript
JavaScript中的Proxy对象
Nov 27 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生成略缩图代码
2012/07/16 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python机器学习之决策树算法实例详解
2017/12/06 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
建龙钢铁面试总结
2014/04/15 面试题
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
入党积极分子评语
2014/05/04 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
廉政承诺书
2015/01/19 职场文书
KTV员工管理制度
2015/08/06 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL