如何使用简单的“with open”从PDF中提取中文文本?

2024-04-26 04:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用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)

输出屏幕截图: Output Screenshot


Tags: 工具方法代码文本内容字节pdf屏幕
1条回答
网友
1楼 · 发布于 2024-04-26 04:39:45

要根据评论生成答案

when using simple "with open xxx as xxx" method, I met a problem , the content part didn't extract appropriately

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

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

包含介于streamendstream之间的扁平压缩数据(由过滤器扁平编码指示)

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

(欲了解更多详情和背景,请阅读this answer,重点介绍PDF中文本替换的相关主题。)

因此,当你说

pdfminer and others are too big to use

请考虑它们有这么大的原因:它们太大了,因为你需要足够多的代码来进行足够的文本提取。中文文本尤其如此;对于带有英文文本的简单PDF,有一些捷径可以在良好的环境下工作,但是对于带有CJK文本的PDF,您不应该期望有这样的捷径

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

不要期望您的解决方案比pdfminer等小得多

相关问题 更多 >