目录
web项目引入PDF.js并添加水印禁止下载

  1. 下载并引入PDF.js实现预览
  2. 动态预览PDF文件
  3. 隐藏打开、下载、打印等功能
  4. 禁止键盘组合按键下载或另存为
  5. 禁用鼠标操作
  6. 添加全局水印
  7. PDF文件预览效果

web项目引入PDF.js并添加水印禁止下载

普通SSH项目引入PDF.js实现在线预览PDF文件

  1. 下载并引入PDF.js实现预览
  2. 官网下载地址:https://mozilla.github.io/pdf.js,下载完成后将压缩包解压;这里我下载的是pdfjs-2.2.228-dist
  3. 将在WebRoot/script目录下创建一个pdfjs-dist目录,将解压后的文件复制到此目录下(仅复制pdfjs-dist下的子目录即可,根目录下的文件这里未进行复制)
  4. 将pdfjs下载时自带的pdf预览文件compressed.tracemonkey-pldi-09.pdf复制到WebRoot目录下用以测试
  5. 运行web项目,在网页中预览该文件,PDF可正常显示,如提示无法加载pdf.worker.js文件,可在/web/viewer.js文件中找到如下片段进行修改:
workerSrc: {value: '../build/pdf.worker.js',kind: OptionKind.WORKER
}
改为如下内容:
workerSrc: {value: '/script/pdfjs-dist/build/pdf.worker.js',kind: OptionKind.WORKER
}
  1. 预览成功即出现以下界面
  2. 动态预览PDF文件

以上步骤只是实现了PDF文件的预览,下面开始配置动态预览项目中的PDF文件

  1. 在WebRoot目录下创建pdfView目录(PDF预览的业务目录,用作最后Struts2的跳转视图路径),将pdfjs-dist目录下的viewer.html文件复制到此目录下,将后缀改为jsp,便于后面动态预览不同的PDF文件
  2. 实现预览不同的PDF,只需要将PDF文件加载路径修改即可,在viewer.jsp的head标签内中加入如下代码:
<script type="text/javascript">var productFilePath = "file=${filePath}";//后台Action传入前台的pdf文件路径参数赋值给url
</script>
  1. 然后在viewer.js中找到functiion webViewerInitialized函数的位置:
var file;
var queryString = document.location.search.substring(1);//修改这行的内容
var params = (0, _ui_utils.parseQueryString)(queryString);
file = 'file' in params ? params.file : _app_options.AppOptions.get('defaultUrl');
validateFileURL(file);
这里的queryString即从url中读取file参数来设置文件路径,将这行进行修改:
var queryString = productFilePath;
  1. 重新预览,即可根据前台不同的预览链接实现不同文件的预览要求
  2. 隐藏打开、下载、打印等功能
  3. 隐藏功能比较简单,仅需修改viewer.jsp中的按钮是否显示即可,如此处隐藏打开、下载、打印几个按钮

在div#toolbarViewerRight下找到id分别为openFile、print、download等button,在class属性中添加visibleMediumView即可隐藏,效果如下:

2. 如需隐藏鼠标选择、查看文档信息,可在div#secondaryToolbarButtonContainer下找到id分别为cursorSelectTool、documentProperties,在class属性中添加visibleMediumView即可:

<button id="documentProperties" class="secondaryToolbarButton documentProperties visibleMediumView" title="Document Properties…" tabindex="68" data-l10n-id="document_properties"><span data-l10n-id="document_properties_label">Document Properties…</span>
</button>

4 禁止键盘组合按键下载或另存为
1.找到键盘组合按键打印的位置:

var hasAttachEvent = !!document.attachEvent;
window.addEventListener('keydown', function (event) {if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {window.print();if (hasAttachEvent) {return;}event.preventDefault();if (event.stopImmediatePropagation) {event.stopImmediatePropagation();} else {event.stopPropagation();}return;}
}, true);

2.改为如下内容:

var hasAttachEvent = !!document.attachEvent;
window.addEventListener('keydown', function (event) {if ((event.keyCode === 80 || event.keyCode === 83) && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {//window.print();if (hasAttachEvent) {return;}event.preventDefault();if (event.stopImmediatePropagation) {event.stopImmediatePropagation();} else {event.stopPropagation();}return;}
}, false);

重新刷新网页,此时尝试通过Ctrrl+P打印或Ctrl+S另存已经不会起作用 原文参考
5. 禁用鼠标操作
禁用鼠标选择、鼠标右键等操作,修改viewer.jsp的body标签,添加属性改为如下内容:

<body tabindex="1" class="loadingInProgress"tabindex="1" class="loadingInProgress"oncontextmenu="return false;" leftMargin="0" topMargin="0"oncopy="return false;" oncut="return false;"onselectstart="return false">
  1. 添加全局水印

利用canvas添加全局水印,其实就是在viewer.js中遍历文件元素节点的同时,创建水印元素节点并插入到每一页的位置。原文参考

1 在viewer.js中找到如下内容,位置大概在11973行前后:

if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {var textLayerDiv = document.createElement('div');textLayerDiv.className = 'textLayer';textLayerDiv.style.width = canvasWrapper.style.width;textLayerDiv.style.height = canvasWrapper.style.height;//---这里就是要插入水印的位置---if (this.annotationLayer && this.annotationLayer.div) {div.insertBefore(textLayerDiv, this.annotationLayer.div);} else {div.appendChild(textLayerDiv);}textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE);
}

2.插入水印代码后内容如下:

if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {var textLayerDiv = document.createElement('div');textLayerDiv.className = 'textLayer';textLayerDiv.style.width = canvasWrapper.style.width;textLayerDiv.style.height = canvasWrapper.style.height;//---------------------水印开始---------------------var cover = document.createElement('div');cover.className = "cover";cover.innerText = "内容保密,请勿复制或下载"; //这里就是水印内容,如果要按照不同的文件显示不同的水印,可参考pdf文件路径的传值方式,在viewer.jsp中head部位接收后台传值并在这里使用if (this.annotationLayer) {// annotationLayer needs to stay on topdiv.insertBefore(textLayerDiv, this.annotationLayer.div);div.appendChild(cover);} else {div.appendChild(textLayerDiv);div.appendChild(cover);}var coverEle = document.getElementsByClassName('cover'),size = 0,nowWidth = +canvasWrapper.style.width.split("p")[0],//714为100%时,每页的宽度。对比当前的宽度可以计算出页面变化后字体的数值size = 50 * nowWidth / 714 + "px";for(var i=0, len=coverEle.length; i<len; i++){coverEle[i].style.fontSize = size;coverEle[i].style.width = canvasWrapper.style.width;coverEle[i].style.height = canvasWrapper.style.height / 10;}//---------------------水印结束---------------------if (this.annotationLayer && this.annotationLayer.div) {div.insertBefore(textLayerDiv, this.annotationLayer.div);} else {div.appendChild(textLayerDiv);}textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE);
}

3 最后在viewer.css文件开始位置添加水印的css样式完成水印显示:

/* 水印遮罩层 */
.cover{z-index: 100;position: absolute;top: 41%;left: 1%;transform: rotate(330deg);text-align: center;font-size: 310%;padding-left: 30px;letter-spacing: 18px;color:rgba(162, 162, 162, 0.4);
}

6 PDF文件预览效果

web项目引入PDF.js并添加水印禁止下载相关推荐

  1. pdf.js使用说明及禁止下载,打印

    PdfJS使用的一些说明 参考:https://blog.csdn.net/qubernet/article/details/82599613?utm_medium=distribute.pc_rel ...

  2. 关于在vue项目中引入pdf.js的跨域问题(已解决)。

    最近公司项目要做一个电子合同盖章的功能,博主想的是用pdf来实现,主要想谈一谈引入pdf.js跨域问题. 之前小编在遇到这个问题的时候也是百度了好多关于解决这方面问题的文章,但最终都没有实际解决.举两 ...

  3. 前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现

    前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现 1.vue项目pdf展示 2.pdf工具栏放大缩小功能 文章目录 前端vue项目(使用pdf.js) pdf展示及pdf工 ...

  4. angular项目引入reveal.js

    angular项目引入reveal.js 一 背景 二 解决方案 1 引入reveal.js 2 在angular.json的styles中引入reveal.js的css样式,作为全局样式. 3 修改 ...

  5. ElementUI项目使用pdf.js预览pdf文件

    最近因为要用Elementui展示pdf文件.查了很多资料,发现vue-pdf还比较初级,不如pdf.js成熟.所以使用的pdf.js. 1.下载pdf.js 点击这里可以[下载]. 2.解压 打开e ...

  6. uni-app 项目引入第三方js插件,单个js文件引入成功,调用该插件方法

    通过"vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错(问题已解决)"成功移到UNI-APP上 方法一: 引用网址:https://www.cnblogs. ...

  7. Vue Cli项目使用PDF.js预览pdf无法访问到viewer.html

    今天在开发移动端项目中有个需求是手机端预览pdf,ios可以直接在浏览器预览,安卓不行,所以使用pdf.js来解决,之前项目用过该插件很好用,但是今天使用的时候发现根本没有访问到viewer.html ...

  8. php vue pdf预览,Vue项目使用pdf.js

    前段时间有个支持在线学习功能的项目,有需要在线预览pdf格式课件的功能,我就想在线预览pdf多简单,因为大部分浏览器都支持打开pdf文件,所以直接放个iframe然后src是pdf文件的地址不就行了吗 ...

  9. js和css和img,Node.js压缩web项目中的js,css和图片

    安装node.js 这个非常简单,下载下来,配置下环境变量就可以了,使用node -v查看是否安装成功 安装压缩需要的模块分别是uglify-js,clean-css,node-smushit 命令是 ...

最新文章

  1. mv命令(移动和重命名)
  2. STM32F7xx —— 输出
  3. 图解HTTP笔记(二)——HTTP状态码
  4. python读取HDF5数据
  5. VMware centos7配置以及SecureCRT连接
  6. QTcpSocket的读写操作
  7. Excel 合并当前工作簿全部工作表的VBA代码
  8. 飞饭网面试题 2014/9/2
  9. 为什么学校计算机没有声音,电脑为什么没声音,教您电脑为什么没声音
  10. 定位的坑:class属性有空格
  11. Java--多线程之并发,并行,进程,线程(一)
  12. redis自定义lua脚本
  13. 公司职位英文及缩写大全
  14. STM32 烧录程序后上电不工作,但调试模式下可正常工作的解决办法
  15. pycharm选择虚拟环境
  16. 最新版去水印小程序搭建教程
  17. CQL 函数及多深度关系节点
  18. Siri触发器原理及改进
  19. L-edit软件界面简介
  20. 使用python库elasticsearch操作es

热门文章

  1. Objective-c:内存管理
  2. 无线打印机服务器安全吗,注意安全 彻底拒绝打印机被非法共享
  3. #C++我的武器库系列#之远控核心技术实现
  4. 华为ensp园区网络设计与实施
  5. Email清教徒十大手则
  6. mysql 主从备份_mysql 主从备份(一)
  7. Excel 之 VBA 入门学习(一)宏与 VBA ,使用技巧
  8. web前端期末大作业基于html+css+javascript+jquery制作家乡主题风景网页设计与实现——张家口
  9. helm安装etcd-ha的失败的原因是bitnami不支持ARM架构-过程分享
  10. 2015 macbook air换第三方SSD(西数SN750)