【问题标题】:PDF files and JavaScript: how to check if PDF is native or scanned [closed]PDF 文件和 JavaScript:如何检查 PDF 是原生的还是扫描的 [关闭]
【发布时间】:2021-09-19 20:10:09
【问题描述】:

我正在使用 JavaScript / HTML / CSS 开发前端应用程序。 此应用程序允许用户上传 PDF 文件。我正在寻找一种方法,使用 JavaScript 来区分 pdf 文件是本机还是扫描

原生 PDF 是“天生数字化”的文档的 PDF,因为 PDF 是从文档的电子版本而不是印刷版创建的。

相比之下,扫描的 PDF 是打印文档的 PDF,例如当您从打印日志中扫描页面然后将此文件另存为 PDF 时。请仅提交原生 PDF。

对于本机 pdf,我不想允许上传,而在另一种情况下,我想允许上传。 我找到了这个 JavaScript 库:https://pdfjs.express/ 也许这就是我需要的,但我不知道从哪里开始。 在 stackoverflow 我发现了一些关于它的东西,但没有关于 JavaScript 代码。

【问题讨论】:

  • “原生”和“自动生成”之间的确切区别是什么?我会假设所有 PDF 文件都是通过任何类型的软件生成的
  • 当 PDF 文件不是 Digital Native 时。所以,在这种情况下,我想 PDF 不是自动生成的。
  • 这只是这些术语的真实定义,但它们对计算机没有任何意义。您必须找到这些 PDF 的技术属性(如果它们确实存在的话),这将帮助您以某种方式将它们区分开来。
  • “而不是从打印”听起来很奇怪,因为有些程序可用于通过虚拟打印机添加 PDF 生成功能。也许您可以通过检查是否只有由图像组成的页面(这将是该“扫描的 PDF”类别的一个很好的指标)来区分这一点,或者您是否可以从 PDF 中提取文本

标签: javascript pdf jspdf pdf.js pdf.js.express


【解决方案1】:

“原生 PDF”几乎总是包含 /Font 对象。

“扫描的 PDF”可能不会。

这应该适用于绝大多数情况:

fetch(url)
  .then(response => response.blob())
  .then(data => data.text())
  .then(data => {
    if (/\/Font/.test(data)) {
      console.log('Probably native');
    } else {
      console.log('Probably scanned');
    }
  })

回应您的 cmets:

为了更准确,需要解析整个文件,因为 PDF 对象通常是 LZW 压缩的,所以这很重要。 Reference。此外,PDF 有时可能会混合扫描文本和常规文本。所以没有办法做到 100% 准确。

JavaScript 访问本地文件会带来安全风险。如果您正在运行服务器,用户可以上传他们的文件,服务器可以使用 Node.js 对其进行解析。

【讨论】:

  • 什么是 /Font 以及为什么“扫描”的 PDF 没有它?
  • 任何包含文本的 PDF 文件都需要 /Font 对象。参考:adobe.com/content/dam/acom/en/devnet/pdf/pdfs/…
  • 如果 PDF 被免费应用程序扫描,这个应用程序是否有可能在里面插入 FETCH,然后这个脚本会失败?您认为如何进行更准确的分析?
  • PDF 文件中字符串“fetch”的存在不会影响此代码。更准确的分析需要对文件进行完整解析,这将需要更多代码。
  • 你如何使这个分析更准确?我需要知道什么才能自己做?另外,您能否修改帖子的代码,使其能够从本地而不是远程 URL 获取 PDF?
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 2019-02-09
  • 2011-02-13
  • 2018-06-07
  • 2017-03-24
  • 2013-07-30
  • 2021-07-05
相关资源
最近更新 更多