python - 尝试获取字数时此 PDF 有什么问题
问题描述
我正在尝试编写一个 python 应用程序来计算 PDF 的字数。
不过,我在这个 PDF 上遇到了一些奇怪的事情。
当我从 PDF 中提取文本时,它显示为某种二进制/符号垃圾。
我已经尝试过PyPDF2
和PyMuPDF
libs 相同的结果。
我怎样才能对像这样的 PDF 进行字数统计?
这是文件。 https://www.dropbox.com/s/hdgqd70l0kcayvo/mhr.pdf?dl=0
解决方案
该 PDF 缺少文本提取所需的信息。因此,尝试从中提取文本通常会输出垃圾。
详细地
该 PDF 中的文本是使用既不公开ToUnicode映射也不公开具有标准化名称的编码的字体绘制的。它也不使用ActualText属性标记内容。此外,字符代码到例如 Latin-1 的朴素身份映射也不会产生任何可理解的结果。
因此,根据 PDF 规范 ISO 32000(第 1 部分和第 2 部分)中提出的算法进行文本提取将为每个字符引导到阶段
如果这些方法无法生成 Unicode 值,则无法确定字符代码代表什么,在这种情况下,符合标准的读者可以选择他们选择的字符代码。
(ISO 32000-1,第 9.10.2 节将字符代码映射到 Unicode 值)
通过应用复制和粘贴,您可以看到 Adobe Acrobat 也不喜欢这样。
但是,在某些此类情况下,深入研究嵌入式字体会发现到 Unicode 的替代映射,并且某些文本提取器确实使用它们。
尽管如此,这种方法在这里也无济于事,该字体是第 3 类字体,即不是基于一些正常的字体格式(例如 TrueType),而是完全使用 PDF 矢量图形序列定义,无需进一步映射到 Unicode。
因此,如果没有某种程度的 OCR(人工或自动化),就无法从该 PDF 中提取文本。
作为旁白
如果此文档确实是由美国某个部门以当前形式发布的(而不是应用于其原始文档的某些转换工具的输出),您可能需要联系该部门并讨论可访问性和第 508 节等主题...
推荐阅读
- robotframework - RobotFramework-Oracle 数据库连接问题-2
- php - 使用 Ajax Echo 的未定义索引将 Javascript 变量传递给 PHP
- go - 如何使用 Go lang http 客户端向启用 SSO 的服务器提交 http 请求
- javascript - Error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array
- ubuntu - 如何在 Ubuntu 中创建一个孤立的“环境”?
- sql - 在 SQL 中按月和年分组
- java - 使用 Java 进行图像处理(最小过滤器);将元素放置在二维矩阵的中心
- excel - 在一个范围内查找组合框选择
- php - Laravel - 语法错误或访问冲突:1066 不是唯一的表/别名
- c# - 对于作为类的模型属性,Razor Pages 模型返回 null