在PDF.js中实现拦截保存按钮并阻止本地下载,同时将生成的PDF文件上传至后台服务器,需结合DOM操作、事件监听及文件上传技术。以下是具体实现方案及代码示例:
一、拦截保存按钮的核心方法
1. 隐藏默认下载控件
PDF.js默认工具栏包含下载按钮,可通过CSS直接隐藏:
css
css
复制
#download { display: none !important; }
或通过JavaScript动态隐藏:
dart
javascript
复制
document.querySelector('.toolbarButton#download').style.display = 'none';
此方法简单但安全性较低,用户仍可通过快捷键或开发者工具绕过。
2. 事件监听与阻止默认行为
通过监听beforeunload
或自定义按钮点击事件拦截操作:
scss
javascript
复制
// 监听PDF查看器容器内所有点击事件
document.getElementById('viewerContainer').addEventListener('click', function(e) {
const target = e.target.closest('.toolbarButton#download');
if (target) {
e.preventDefault();
e.stopPropagation();
uploadPDFToServer(); // 触发自定义上传逻辑
}
});
此方法需配合PDF.js的eventBus
实现更精准的事件捕获。
二、获取PDF二进制数据
1. 从现有PDF文件获取数据
若需上传当前展示的PDF文件:
ini
javascript
复制
const pdfUrl = '/path/to/file.pdf';
fetch(pdfUrl)
.then(response => response.blob())
.then(blob => uploadPDF(blob));
function uploadPDF(blob) {
const formData = new FormData();
formData.append('pdf', blob, 'document.pdf');
// 发送至服务器...
}
2. 动态生成PDF内容
若通过PDF.js编辑后生成新内容:
ini
javascript
复制
const loadingTask = pdfjsLib.getDocument({ data: existingPdfBytes });
loadingTask.promise.then(pdf => {
return pdf.saveDocument();
}).then(newPdfBytes => {
const blob = new Blob([newPdfBytes], { type: 'application/pdf' });
uploadPDF(blob);
});
三、文件上传至服务器
1. 前端上传实现
使用FormData
与Fetch API
异步上传:
javascript
javascript
复制
function uploadPDFToServer() {
pdfDoc.getData().then(function(data) {
const blob = new Blob([data], { type: 'application/pdf' });
const formData = new FormData();
formData.append('file', blob, 'protected.pdf');
fetch('/upload', {
method: 'POST',
body: formData
}).then(response => {
if (response.ok) alert('上传成功');
else alert('上传失败');
});
});
}
2. 服务端接收处理(Node.js示例)
php
javascript
复制
const express = require('express');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) return res.status(400).json({ error: '无文件上传' });
// 处理文件存储或数据库记录
res.json({ path: req.file.path });
});
四、增强安全性的补充措施
-
禁用右键菜单
inijavascript 复制 document.addEventListener('contextmenu', e => e.preventDefault());
-
混淆前端代码
使用Webpack打包压缩代码,防止用户通过调试工具绕过拦截。
-
服务端校验
- 检查文件MIME类型:
application/pdf
- 限制文件大小(如10MB)
- 校验数字签名防止篡改
- 检查文件MIME类型:
五、注意事项
- 跨域问题 :确保服务器配置CORS头(如
Access-Control-Allow-Origin
)。 - 浏览器兼容性:部分API需兼容低版本浏览器(如IE11需polyfill)。
- 用户体验:拦截下载后需提供明确的提示,例如弹窗说明文件已自动保存至云端。
通过上述方案,既可实现PDF.js环境下阻止本地下载,又能将文件安全上传至服务器。如需完整代码示例,可参考PDF.js官方文档及文件上传最佳实践。