【问题标题】:Detect in browser if PDF is locked or encrypted在浏览器中检测 PDF 是否被锁定或加密
【发布时间】:2017-11-27 14:52:19
【问题描述】:

在我的应用程序中,用户可以上传 PDF 供其他用户稍后查看。对于我的用例,我需要确保 PDF 没有被锁定或加密,并且可以被任何其他用户查看。

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

我还没有就在浏览器中执行此操作的最佳方法达成共识?如果我不能,我是否尝试读取缓冲区并抛出错误?还是有另一种高效且高效的检测方法?

【问题讨论】:

  • 检测加密应该像在文件中搜索字符串/Encrypt一样少。
  • 那么,在文件缓冲区中(或将文件作为文本读取后),只需搜索'/Encrypt'?还有什么要注意的吗?
  • 我认为“还有什么要注意的吗?”问题最终将要求您更好地理解格式——或者至少是其中可以包含加密/保护标志的部分。考虑一个在其可见内容中包含文本“/Encrypt”的 PDF 文档。除非您使用文件格式的完整上下文进行解析,否则您可能会得到错误匹配,例如“/Encrypt”必须出现在文件的开头,在某个部分内。 en.wikipedia.org/wiki/Portable_Document_Format

标签: javascript reactjs pdf exif-js


【解决方案1】:

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

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

在 onChange 处理函数内部,您可以获取文件字节并加载到缓冲区中。有关代码和更多详细信息,请参阅reading file contents on the client side in javascript in various browsers

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

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

  • 您的目标是低端移动设备,并希望 PDF 文件大小为 +100mb。
  • 您将在有 Javascript 限制的浏览器上运行
  • 总是希望将文件上传到您的服务器,即使 PDF 受到保护,并且您发现用户体验更好

【讨论】:

  • 这更符合我的想法,但是当我使用FileReader 对象读取文件时,我陷入了如何了解锁定/加密状态的问题。有什么想法吗?
  • 我不是PDF格式专家,这里就不多说了。我会从谷歌搜索“js pdf parser”开始,然后开始查看库。或者,您可以获取一组 PDF 样本,稍微了解一下格式,然后自己编写一个快速而肮脏的解析器。第二种方式会更高效,因为您可以将解析专门用于查找您需要的文本,而不是处理所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2011-11-30
  • 2012-01-26
  • 2023-02-26
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多