pdf.js中如何拦截save按钮阻止用户下载到本地,并生成的PDF文件上传到后台服务器

在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 });
});

​四、增强安全性的补充措施​

  1. ​禁用右键菜单​

    ini 复制代码
    javascript
    复制
    document.addEventListener('contextmenu', e => e.preventDefault());
  2. ​混淆前端代码 ​

    使用Webpack打包压缩代码,防止用户通过调试工具绕过拦截。

  3. ​服务端校验​

    • 检查文件MIME类型:application/pdf
    • 限制文件大小(如10MB)
    • 校验数字签名防止篡改

​五、注意事项​

  1. 跨域问题 :确保服务器配置CORS头(如Access-Control-Allow-Origin)。
  2. 浏览器兼容性:部分API需兼容低版本浏览器(如IE11需polyfill)。
  3. 用户体验:拦截下载后需提供明确的提示,例如弹窗说明文件已自动保存至云端。

通过上述方案,既可实现PDF.js环境下阻止本地下载,又能将文件安全上传至服务器。如需完整代码示例,可参考PDF.js官方文档及文件上传最佳实践。

相关推荐
货拉拉技术几秒前
一句话叫车:货拉拉小程序 AI 叫车实战
前端·agent·ai编程
yunyi5 分钟前
给桌面客户端做下载加速:从「桶直接公开」到「边缘优先、源站兜底」的三代演进
前端·后端
world781122611 分钟前
【C++】set 和 map
java·前端·c++·set·map
程序猿乐锅13 分钟前
Streamlit 实现 AI 聊天 Agent:角色提示词、流式输出与会话管理
开发语言·前端·笔记·后端·python·学习
niucloud-admin16 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:客户报表
前端·人工智能·ai编程
漫步人生走在路上21 分钟前
外贸B2B行业GEO优化白皮书:从0到1完整落地流程
前端·人工智能·搜索引擎·chatgpt·twitter
程序猿乐锅1 小时前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
老木避暑研究所1 小时前
负氧离子数据的采集、清洗与可视化:一套可复用的环境监测数据分析模板
前端·人工智能·数据分析
计算机魔术师1 小时前
AI 推翻了一个当了30年地基的假设,查的人恰好是立论者
前端
范同学~1 小时前
项目添加水印
java·前端·javascript