我正在遵循这本指南,学习如何使用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)
2条答案
按热度按时间2o7dmzc51#
PyMuPDF
Page
对象的属性first_annot
要么包含第一个注解,要么包含None
(如果没有注解的话)。这就是错误的来源。但是您似乎也对以下事实感到困惑:注解与页面的文本无关-通过方法Page.get_text()
提取。使用选项“words”返回一个(x0, y0, x1, y1, "word", ...)
项的列表。前四个子项是包围文本“word”的矩形的坐标。如果按第一个参数(x 0),那么那些最左边的项目将首先出现--与它们的垂直位置无关。我希望这是你真正想要的--你的代码建议不是这样。若要以一般方式排序(从左上角到右下角),只要使用方法的这个格式即可:
page.get_text("words", sort=True)
.还要注意,看起来在同一行中的单词可能仍然有一些微小的y坐标差异(肉眼无法区分),因此您可能需要自己编写排序代码-例如使用舍入的y坐标等。
0h4hbjxa2#
问题似乎与您使用的PDF文件有关。我不确定您是如何从您共享的指南中提取完全相同的PDF的。
如果您已保存这些图像并导出为PDF,则可能会出现以下2种行为:
page1.first_annot
将返回None
,因为导出到PDF后样本图像中的边界框似乎不起作用。如果您尝试在导出的PDF中重绘这些边界框,它将为您提供第一个边界框的结果。page1.get_text("words")
,它在这种情况下是不会起作用的,它会给予空的结果。我会建议尝试这与一个样本pdf,你从谷歌和看到的结果。