如果PDF锁定或加密,则在浏览器中检测



在我的应用程序中,用户可以上传其他用户以后可以查看的PDF。对于我的用户酶,我需要确保PDF不会锁定或加密,并且任何其他用户都可以查看。

为此,我要求用户上传解锁的PDF,并在我尝试上传到S3之前,想在PDF上锁定错误。

我尚未就浏览器内的最佳方法达成共识?如果无法的话,我会尝试阅读缓冲区并丢失错误吗?或者是否有另一种绩效和有效的方法来检测?

您可以尝试使用以下解决方案:

const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {
var files = new Blob([reader.result], {type: 'application/pdf'});
files.text().then(x=> {
    console.log("isEncrypted", x.includes("Encrypt")) // true, if Encrypted
    console.log("isEncrypted", x.substring(x.lastIndexOf("<<"), x.lastIndexOf(">>")).includes("/Encrypt"));
    console.log(file.name);
});

更好的是用户体验,带宽和性能,可以检测客户端的状态。您可以在页面上有一个文件输入元素,然后捕获Onchange事件。

<input type="file" id="pdfFile" size="50" onChange='processFile' />

在Onchange处理功能的内部,您可以在文件字节上获取并加载到缓冲区中。有关代码和更多详细信息,请参阅各种浏览器中JavaScript中客户端的读取文件内容。

您需要进行一些PDF解析以学习锁定/加密状态,但我想有一些JS库可以做到这一点。即使您的PDF可以解析非常大,它总是比将PDF上传到服务器更快,因为上传时间将是文件大小的函数。

我可以看到上传文件而不是客户端解析的情况:

  • 您是针对低端移动设备,并期望PDF为 100MB。
  • 您将在具有JavaScript限制的浏览器上运行
  • 始终也想将文件上传到服务器,即使PDF受到保护,您已经确定了用户体验更好

您可以做的就是使用PDFJ打开PDF文件并尝试获取页数。当文件受到密码保护时,您将获得passwordException。

看这个小提琴:https://jsfiddle.net/fe6jlgr5/15/

document.getElementById("pdfFile").addEventListener("change",
   function(event) {
      let file = event.target.files[0];
      let reader = new FileReader();
      reader.readAsArrayBuffer(file);
      reader.onload = function(e) {
         var docInitParams = {
         data: e.target.result,
         password: ''
      };
      pdfjsLib.getDocument(docInitParams).promise.then((pdfDocument) =>
      {
         // get all the pages from pdf, works if not password protected.
         const numPages = pdfDocument.numPages;
         console.log('Doc not password protected');
      }).catch(err => console.log(err))
   }
},false);

最新更新