首页 > 解决方案 > 从 PDF 中提取单词并像表格一样解析

问题描述

我正在尝试解析像表格布局这样的 PDF 文件。考虑下面的PDF文件:

在此处输入图像描述

我正在尝试这样做,因此用户可以为 PDF 文件定义类似布局的列,如下所示:

在此处输入图像描述

这是我的代码:

areas = {}
areas[0] = (0, 0, 150, 792)
areas[1] = (150, 0, 350, 792)
areas[2] = (350, 0, 612, 792)

with pdfplumber.open(mypdf_file) as pdf:
     for i, area in enumerate(areas):
         area = areas[i]
         p0 = pdf.pages[0]
         p0 = p0.crop(area)
         words = p0.extract_words()

以下是提取的输出,words =其中包含:

[[{'bottom': Decimal('99.708'),
  'text': 'Page'
 },
 {'bottom': Decimal('99.708'),
  'text': '1,'
 },
 {'bottom': Decimal('99.708'),
  'text': 'col'
 },
 {'bottom': Decimal('99.708'),
  'text': '1.'
}]
[{'bottom': Decimal('128.988'),
  'text': 'Page'
 },
 {'bottom': Decimal('128.988'),
  'text': '1,'
 },
 {'bottom': Decimal('128.988'),
  'text': 'col'
 },
 {'bottom': Decimal('128.988'),
  'text': '2.'
}]
[{'bottom': Decimal('143.628'),
  'text': 'Page'
 },
 {'bottom': Decimal('143.628'),
  'text': '1,'
 },
 {'bottom': Decimal('143.628'),
  'text': 'col'
 },
 {'bottom': Decimal('143.628'),
  'text': '3'
}]

我试图找出一种方法来解析这些信息,所以它将代表我上面的图像。因为我只有 bbox 信息(bottom),而不是实际的换行符。因此,如果我解析上述数据:

for i, area in enumerate(areas):
   [....]
   cols[i + 1] = " ".join(map(itemgetter("text"), words))

我得到的词(组合成行)为:

{1: 'Page 1, col 1.', 2: 'Page 1, col 2.', 3: 'Page 1, col 3'}

预期产出

我试图像表格一样解析它,通过使用该bottom值来确定一个单词是否在同一“行”上。

但是,我不知道该怎么做?我们是否能够检查每一行/单词与下一列中的下一行/单词,看看它们是否在同一行?

输出类似

{
    "1": [{
        "row": "Page 1, col 1.",
        "row": "",
        "row": ""
    }],
    "2": [{
        "row": "",
        "row": "Page 1, col 2.",
        "row": ""
    }],
    "3": [{
        "row": "",
        "row": "",
        "row": "Page 1, col 3."
    }]
  }

标签: pythonpython-3.xpython-3.7

解决方案


推荐阅读