python - 从 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."
}]
}
解决方案
推荐阅读
- c++ - 从 1.42 升级到 1.61
- python - 从 async.subprocess.PIPE 读取
- java - 当我的会话创建策略设置为 STATELESS 时,为什么 Spring Security 的 SessionManagementFilter 会运行?
- google-chrome - 无法使用设计在 Rail 5.2 中注册
- cassandra - 在 nodetool 退役后 Cassandra 节点卡住了
- c++ - 对向量的回击
失败 - VS 2017 - javascript - Ajax 工作异常
- android - 从活动 B 导航到活动 A 时清除意图
- c - fgets 在 while 循环内进行登录验证
- elasticsearch - 这些日志的 grok 模式应该是什么?(文件节拍的摄取管道)