我遵循本指南学习如何使用PyMuPDF从非结构化PDF中提取数据。
https://www.analyticsvidhya.com/blog/2021/06/data-extraction-from-unstructured-pdfs/
我得到一个AttributeError:"NoneType"对象在执行代码时没有属性"rect"错误,并且不确定发生了什么,因为我是Python的新手。
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-7f394b979351> in <module>
1 first_annots=[]
2
----> 3 rec=page1.first_annot.rect
4
5 rec
AttributeError: 'NoneType' object has no attribute 'rect'
---------------------------------------------------------------------------
代码
import fitz
import pandas as pd
doc = fitz.open('Mansfield--70-21009048 - ConvertToExcel.pdf')
page1 = doc[0]
words = page1.get_text("words")
words[0]
first_annots=[]
rec=page1.first_annot.rect
rec
#Information of words in first object is stored in mywords
mywords = [w for w in words if fitz.Rect(w[:4]) in rec]
ann= make_text(mywords)
first_annots.append(ann)
def make_text(words):
line_dict = {}
words.sort(key=lambda w: w[0])
for w in words:
y1 = round(w[3], 1)
word = w[4]
line = line_dict.get(y1, [])
line.append(word)
line_dict[y1] = line
lines = list(line_dict.items())
lines.sort()
return "n".join([" ".join(line[1]) for line in lines])
print(rec)
print(first_annots)
PyMuPDFPage
对象的属性first_annot
包含第一个注释,如果没有注释,则包含None
。这就是你的错误来源。但您似乎也对这样一个事实感到困惑,即注释与页面的文本无关——您可以通过方法Page.get_text()
提取文本。使用选项";单词";在该广义提取方法中返回项目列表CCD_ 5。前四个子项是包装文本"的矩形的坐标;单词";。如果只按第一个参数(x0(排序,那么这些项目将首先出现,它们显示在最左边,与它们的垂直位置无关。我希望这是你真正想要的——你的代码建议不要这样。
要以常见的方式(从左上到右下(进行排序,只需使用以下形式的方法:page.get_text("words", sort=True)
。
还要注意,看起来在同一行的单词可能仍然有相差一些微小值的y坐标(肉眼无法区分(,因此您可能需要自己对排序进行编码,例如使用四舍五入的y坐标等。
问题似乎与您使用的PDF文件有关。我不确定你是如何从你分享的指南中获得完全相同的pdf的。
如果您保存了这些图像并导出为PDF,则可以预期以下2种行为:
page1.first_annot
将返回None
,因为导出到pdf后样本图像中的边界框似乎不起作用。如果您尝试在导出的PDF中重新绘制这些边界框,它将为您提供第一个边界框的结果- 不管怎样,如果您尝试调用
page1.get_text("words")
在这种情况下是行不通的。它将给出空的结果
我建议你从谷歌获得一个pdf样本,看看结果。