需求是 在web端实现在线预览
只能预览 不能下载 右键保存等操作
本实现基于 angular 框架开发的
实现的方法:
方法一:通过 a 链接 href 的形式
1 | <a href="文档地址"></a> |
ps:
<a>
链接方式会打开一个新的页面
如果需要在当前页面预览 则不满足实际需求
方法二:通过iframe标签内嵌的形式
1 | <iframe style="width: 100%;height: 1080px;margin-top: 62px;" [src]="file" frameborder="0" ></iframe> |
1 | this.file = this.sanitizer.bypassSecurityTrustResourceUrl(`${this.data.file}#toolbar=0`); |
ps:
angular
中访问文件 需要是安全 可被信任的地址 才可访问 所以提供了DomSanitizer
服务 需要调用此方法#toolbar=0
: 隐藏默认头部的功能条 以防止用户点击下载此方法右键可另存为 尝试过以下方法均无效
禁止右键菜单事件 只能禁止父页面的右键行为 子页面 iframe 则无效
在预览的pdf上罩一个透明的层 解决了右键的问题 但带来了滚动条无法滚动的问题
在遮罩透明的层的基础上 使用
css3
的pointer-events:none
属性 可无视遮罩层 鼠标不在监听当前层 而监听下层的事件 滚动解决了 但右键的问题又回来了…
方法三:通过标签的形式
1 | <!-- 1. <object> --> |
ps:
<object>
: 使用方法和 iframe 区别不是很大 所以也不满足需求<embed>
: 使用方法差不多 但不同的是 此标签是闭合的 如果浏览器不支持 pdf 嵌入 则这个标签内容什么内容都看不到
方法四:使用 pdf.js 库的形式
首先 下载 pdf.js 库
下载下来包含两个文件夹:
build
和web
放到项目中预览的文档地址是:
项目本地的路径/pdf/web/viewer.html?file=文档地址
注意:?file=
是必写的 不然就无法预览
在 html
中可用一下三种方式实现:
window.open
:window.open(“项目本地的路径/pdf/web/viewer.html?file=文档地址”);iframe
:<iframe src="项目本地的路径/pdf/web/viewer.html?file=文档地址" />
1 | <iframe style="width: 100%;height: 1080px;margin-top: 62px;" [src]="file" frameborder="0" ></iframe> |
1 | let url = `/assets/data/pdf/web/viewer.html?file=${this.data.file}`; |
以上方法都好了之后 在页面上看效果时 发现以下三个问题:
- console 中报了 跨域的错误
解决如下:
找到项目包中的 viewer.js
注释掉以下代码
1 | if (fileOrigin !== viewerOrigin) { |
如果仍有跨域问题
则需要与后台配合下
在服务器 响应头添加
'Access-Control-Allow-Origin' '*'
'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'
Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'
Access-Control-Expose-Headers' 'Content-Length,Content-Range
如果还是不行
那就打包后 放到服务器
看正式版本的就可以了的
- 右键还是可也另存为的
解决如下:
找到项目包中的 viewer.html
在 head
标签里增加如下代码 即可
1 | <script> |
- 功能条里面有下载的按钮
解决如下:
找到项目包中的 viewer.html
搜索到 id=”download” 的 button
添加 style="visibility:hidden"
样式 即可隐藏
1 | <button style="visibility:hidden" id="download" class="toolbarButton download hiddenMediumView" |
- ctrl + s 也是可以保存的
解决如下:
找到项目包中的 viewer.js
注释掉这两行即可禁用键盘事件
1 | if (cmd === 1 || cmd === 8) { |
总结:
如果文档随意可以下载的话 那建议使用
iframe
相对比较简单快速如果文档不可随意下载的话 那就只能使用
pdf.js
等其他第三方的库 来控制一些权限等