问题描述
我需要用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)
输出截图:
解决方法
要从评论中生成答案...
在使用简单的“with open xxx as xxx”方法时,遇到一个问题,内容部分没有正确提取
原因是 PDF 不是纯文本格式,而是一种二进制格式,其内容可以被压缩和/或加密。例如,您发布了 screenshot 的对象,
4 0 obj
<</Filter/FlateDecode/Length 210>>
stream
...
endstream
endobj
包含 stream
和 endstream
之间的 FLATE 压缩数据(由 Filter 值 FlateDecode 指示)。
但即使它没有被压缩或加密,您可能仍然无法识别任何显示的文本,因为每个 PDF 字体对象都可以使用自己的、完全自定义的编码。此外,您在文本行中看到的分组字形不需要由 PDF 中的同一绘图指令绘制,您可能必须按坐标排列绘图指令中的所有字符串才能找到文本行的文本。
(有关更多详细信息和背景,请阅读 this answer,其中重点介绍了 PDF 中文本替换的相关主题。)
因此,当你说
pdfminer 和其他的太大了,无法使用
请考虑它们如此之大的原因:它们如此之大是因为您需要那么多代码来进行足够的文本提取。对于中文文本尤其如此;对于带有英文文本的简单 PDF,在良性环境下有一些捷径,但对于带有 CJK 文本的 PDF,您不应该期待这样的捷径。
如果您仍然想尝试并自己实现文本提取,请获取 ISO 32000-1 或 ISO 32000-2 的副本(Google for pdf32000 获取前者的免费副本)并研究该 pdf 规范。根据这些信息,您可以逐步学习将这些二进制字符串解析为 pdf 对象,在其中查找内容流,解析这些内容流中的指令,检索这些指令绘制的文本片段,并将这些片段正确排列为整个文本.
不要期望您的解决方案比 pdfminer 等小得多...