【问题标题】:how can I extract Chinese text from PDF using simple ‘with open’?如何使用简单的“with open”从 PDF 中提取中文文本?
【发布时间】:2021-01-01 03:49:54
【问题描述】:

我需要使用python提取pdf文本,但是pdfminer和其他人太大而无法使用,但是在使用简单的“with open xxx as xxx”方法时,我遇到了一个问题,内容部分没有正确提取。文本看起来像字节,因为它以 b' 开头。我的代码和结果截图:

with open(r"C:\Users\admin\Desktop\aaa.pdf","rb") as file:
    aa=file.readlines()
    for a in aa:
        print(a)

输出截图:

【问题讨论】:

  • 你仍然需要解码 pdf..
  • 如果没有你提到的 pdf 阅读库,我认为你做不到
  • PDF 不是纯文本。这就是存在库来解码它们的原因。 open 可以从文件中读取/写入字节,而不是对其看到的数据执行任何实际解码或编码。
  • “pdfminer 和其他软件太大而无法使用” - 你有没有想过它们这么大是有原因的?本质上它们是如此之大,因为您需要大量代码来提取足够的文本。特别是提取中文文本;对于带有英文文本的简单 pdf,有一些在良性情况下工作的排序削减,但对于 CJK 文本,你不应该期望这样的捷径。
  • 如果您想尝试自己实现文本提取,请获取 ISO 32000-1 或 ISO 32000-2 的副本(Google for pdf32000 可免费获得前者的副本)并研究该 pdf 规范。基于这些信息,您可以逐步学习将这些二进制字符串解析为 pdf 对象,在其中找到内容流,解析这些内容流中的指令,并检索这些指令绘制的文本。

标签: python pdf text-extraction


【解决方案1】:

要从 cmets 生成答案...

当使用简单的“with open xxx as xxx”方法时,我遇到了一个问题,内容部分没有正确提取

原因是 PDF 不是纯文本格式,而是一种二进制格式,其内容可以被压缩和/或加密。例如您发布了screenshot 的对象,

4 0 obj
<</Filter/FlateDecode/Length 210>>
stream
...
endstream
endobj

包含streamendstream 之间的FLATE 压缩数据(由FilterFlateDecode 指示)。

但即使它没有被压缩或加密,您可能仍然无法识别任何显示的文本,因为每个 PDF 字体对象都可以使用自己的完全自定义编码。此外,您在文本行中看到的字形不需要由 PDF 中的相同绘图指令绘制,您可能必须按坐标排列绘图指令中的所有字符串才能找到文本行的文本。

(有关更多详细信息和背景,请阅读this answer,它侧重于在 PDF 中替换文本的相关主题。)

因此,当你说

pdfminer等都太大用不着

请考虑它们之所以如此之大是有原因的:它们如此之大是因为您需要大量代码来提取足够的文本。对于中文文本尤其如此;对于带有英文文本的简单 PDF,有一些在良性情况下可以使用的快捷方式,但对于带有 CJK 文本的 PDF,您不应该期望这样的快捷方式。

如果您仍然想尝试并自己实施文本提取,请获取 ISO 32000-1 或 ISO 32000-2 的副本(Google for pdf32000 获取前者的免费副本)并研究该 pdf 规范。基于这些信息,您可以逐步学习将这些二进制字符串解析为 pdf 对象,在其中找到内容流,解析这些内容流中的指令,检索这些指令绘制的文本片段,并将这些片段正确排列为整个文本.

不要指望你的解决方案比 pdfminer 等小很多...

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2023-04-02
    • 2016-04-22
    相关资源
    最近更新 更多