vue项目中实现pdf文件预览功能

pdf预览相对word、excel、ppt等文件的预览比较容易,因为常见的浏览器都是支持pdf文件直接预览,所以最简单的实现方法就是在浏览器中直接输入pdf文件存放在服务器上的路径地址就可以直接预览;

1、使用浏览器默认支持访问pdf文件的功能

1.1、当后端返回的是pdf文件在服务器上的路径时,直接访问该路径即可

1.2、当后端返回的是pdf文件流时,直接访问文件流接口时,浏览器会默认下载该pdf文件,此时需要对该接口的响应头进行设置,具体如下:

Content-Disposition: inline;filename=<pdf的文件名>
Content-Type: application/pdf;charset=UTF-8

Content-Disposition有两个值:attachment和inline,attachment表示下载文件,inline表示内嵌显示;

上面设置的目的就是告诉浏览器,当前接口返回的文件流是pdf格式,且需要内嵌显示,也就是告诉浏览器不要下载文件,应该预览。

这样当我们调用后端接口,后端返回pdf文件流时就可以直接在浏览器上访问;

2、使用PDF.js进行预览

PDF.js是mozilla开源的一个可以解析、预览pdf文件的插件,它本身提供了预览页面方便我们直接传入pdf文件地址进行预览,具体使用如下:

在这里插入图片描述
  • 2、解压下载好的PDF.js插件

  • 3、在vue项目根目录下创建static文件夹用于存放静态资源(已存在则不需要重复创建),在static下新建名称pdf文件夹并将解压后的pdf.js文件放在该目录中

在这里插入图片描述
  • 4、webpack配置将static文件夹下的静态资源复制到dist目录下,这样开启本地服务或上线后可以访问到静态资源

  • 4.1、安装copy-webpack-plugin插件

npm install -D copy-webpack-plugin

  • 4.2、在webpack配置文件中引入:
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  ...
  plugins: [
    new CopyPlugin([
      { 
        from: path.resolve(__dirname, './static'),
        to: path.resolve(__dirname, './dist/static'),
        ignore: ['.*']
      }
    ]),
  ],
  ...
};

  • 5、在vue文件中使用pdf.js提供的预览页面来预览pdf文件
在这里插入图片描述

我们就是利用viewier.html文件来进行pdf文件的预览。

window.open(`/static/pdf/web/viewer.html?file=${pdfFileUrl}`);

使用上面代码就可以新开页预览pdf文件,就是使用viewer.html通过传入文件地址来进行预览,pdfFileUrl为pdf文件存放服务器的地址

Q&A:

1、PDF.js是一个开源的插件,为什么不使用npm install方式安装?

因为需求比较简单,只要预览就可以,对预览页面涨什么样没有要求,所以采用PDF.js提供的预览页面也就是viewer.html来实现预览是最省事的。npm上关于PDF.js的包有两个分别是pdfjs和pdfjs-dist,其中pdfjs-dist的下载量比pdfjs的多,通过npm install安装pdfjs和pdfjs-dist后可以发现其文件中均没有viewer.html(如下图所示),所以无法使用PDF.js提供的预览页面来预览。那使用pdfjs和pdfjs-dist的是如何预览的?它们负责提供解析pdf文件,并将解析内容输出来,预览的话需要自己来写一个预览页面,对于对pdf预览页面有特殊定制需求的话可以使用该方法;

在这里插入图片描述
在这里插入图片描述

2、为什么要使用copy-webpack-plugin插件将静态资源复制一份到dist目录下?

我们在本地启动项目后,通过localhost:8080访问时,其实就是访问webpack-dev-server上的静态资源,webpack会自动打包项目代码并将打包后代码放在webpack-dev-server上,也就是使用dist下的资源作为静态资源,因此,无论是开启本地服务还是上线之后,我们都需要将PDF.js的文件作为静态资源放在服务器上;而copy-webpack-plugin插件可以很方便的帮助我们将静态资源放在dist目录下。

可能会遇到的问题:
2.1、在使用copy-webpack-plugin插件时,需要注意由于copy-webpack-plugin插件版本与webpack版本不兼容带来的问题。
我们项目使用的webpack版本是3.x版本的,如果安装最新的copy-webpack-plugin插件也就是5.x版本的,会出现如下报错:

TypeError: Cannot read property 'emit' of undefined at CopyPlugin.apply

在这里插入图片描述

解决办法:
对于webpack 3.x版本的,推荐安装copy-webpack-plugin 4.x版本的,这样就不会出现版本兼容问题,亲测有效。

3、在使用viewer.html预览时,当传入pdf文件地址时报如下错误:

在这里插入图片描述

这是由于pdf.js不支持跨域请求,才报的错:file origin does not match viewer’s

解决办法:

简单粗暴的方法就是把viewer.js的判断远程地址的代码注释掉即可
在viewer.js文件中找到如下判断,注释即可:

// if (origin !== viewerOrigin && protocol !== 'blob:') {
//   throw new Error('file origin does not match viewer\'s');
// }

转载自:vue项目中实现pdf文件预览功能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容