csv 如何在python中使用PyMuPDF从非结构化PDF中提取数据?

nx7onnlm  于 2022-12-06  发布在  Python
关注(0)|答案(2)|浏览(143)

我正在遵循这本指南,学习如何使用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)
2o7dmzc5

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坐标等。

0h4hbjxa

0h4hbjxa2#

问题似乎与您使用的PDF文件有关。我不确定您是如何从您共享的指南中提取完全相同的PDF的。
如果您已保存这些图像并导出为PDF,则可能会出现以下2种行为:

  • page1.first_annot将返回None,因为导出到PDF后样本图像中的边界框似乎不起作用。如果您尝试在导出的PDF中重绘这些边界框,它将为您提供第一个边界框的结果。
  • 不管怎样,如果你试图调用page1.get_text("words"),它在这种情况下是不会起作用的,它会给予空的结果。

我会建议尝试这与一个样本pdf,你从谷歌和看到的结果。

相关问题