【问题标题】:PyMuPDF - How to Data Extract from Unstructured PDFs using PyMuPDF in python?PyMuPDF - 如何在 python 中使用 PyMuPDF 从非结构化 PDF 中提取数据?
【发布时间】:2022-11-02 03:04:29
【问题描述】:

我正在关注如何使用 PyMuPDF 从非结构化 PDF 中提取数据的指南。

https://www.analyticsvidhya.com/blog/2021/06/data-extraction-from-unstructured-pdfs/

我收到一个 AttributeError: 'NoneType' object has no attribute '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)

【问题讨论】:

    标签: python csv pdf pypdf2 pymupdf


    【解决方案1】:

    PyMuPDF Page 对象的 first_annot 属性要么包含第一个注释,要么包含 None(如果没有注释)。 这就是您的错误的来源。 但是您似乎也对以下事实感到困惑,即注释与页面文本无关 - 您通过方法 Page.get_text() 提取的文本。在此通用提取方法中使用选项“words”返回项目列表(x0, y0, x1, y1, "word", ...)。 前四个子项是包围文本“word”的矩形的坐标。如果您仅按第一个参数 (x0) 排序,那么这些项目将首先出现,它们出现在最左边 - 与它们的垂直位置无关。 我希望这是您真正想要的-您的代码另有说明。

    要以常用方式排序(从左上到右下),只需使用这种形式的方法:page.get_text("words", sort=True)

    另请注意,出现在同一行中的单词可能仍具有 y 坐标,它们的值相差一些微小的值(眼睛无法区分),因此您可能需要自己编写排序代码 - 例如使用四舍五入的 y 坐标等。

    【讨论】:

      猜你喜欢
      • 2022-07-28
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多