python - 如何使用 Python 提取具有多个表的 PDF
问题描述
我正在尝试从具有多个表的 PDF:s 中提取表。我曾尝试使用 Amazon Textract,但将表格数据作为输出以一个表格的形式在另一个表格下方,然后是一些空白,
示例输入 PDF 文件: 链接 1
所需的预期输出格式是列出 Excel 工作表中的所有表格。
并且还希望从 PDF 文件中提取一些特定的键值对。从附加的输入 PDF 文件中提取密钥示例 1和示例 2及其各自的值。
我一直在使用的代码:
import webbrowser, os
import json
import boto3
import io
from io import BytesIO
import sys
from pprint import pprint
def get_rows_columns_map(table_result, blocks_map):
rows = {}
for relationship in table_result['Relationships']:
if relationship['Type'] == 'CHILD':
for child_id in relationship['Ids']:
cell = blocks_map[child_id]
if cell['BlockType'] == 'CELL':
row_index = cell['RowIndex']
col_index = cell['ColumnIndex']
if row_index not in rows:
# create new row
rows[row_index] = {}
# get the text value
rows[row_index][col_index] = get_text(cell, blocks_map)
return rows
def get_text(result, blocks_map):
text = ''
if 'Relationships' in result:
for relationship in result['Relationships']:
if relationship['Type'] == 'CHILD':
for child_id in relationship['Ids']:
word = blocks_map[child_id]
if word['BlockType'] == 'WORD':
text += word['Text'] + ' '
if word['BlockType'] == 'SELECTION_ELEMENT':
if word['SelectionStatus'] =='SELECTED':
text += 'X '
return text
def get_table_csv_results(file_name):
with open(file_name, 'rb') as file:
img_test = file.read()
bytes_test = bytearray(img_test)
print('Image loaded', file_name)
# process using image bytes
# get the results
client = boto3.client('textract')
response = client.analyze_document(Document={'Bytes': bytes_test}, FeatureTypes=['TABLES'])
# Get the text blocks
blocks=response['Blocks']
pprint(blocks)
blocks_map = {}
table_blocks = []
for block in blocks:
blocks_map[block['Id']] = block
if block['BlockType'] == "TABLE":
table_blocks.append(block)
if len(table_blocks) <= 0:
return "<b> NO Table FOUND </b>"
csv = ''
for index, table in enumerate(table_blocks):
csv += generate_table_csv(table, blocks_map, index +1)
csv += '\n\n'
return csv
def generate_table_csv(table_result, blocks_map, table_index):
rows = get_rows_columns_map(table_result, blocks_map)
table_id = 'Table_' + str(table_index)
# get cells.
csv = 'Table: {0}\n\n'.format(table_id)
for row_index, cols in rows.items():
for col_index, text in cols.items():
csv += '{}'.format(text) + ","
csv += '\n'
csv += '\n\n\n'
return csv
def main(file_name):
table_csv = get_table_csv_results(file_name)
output_file = 'output.csv'
# replace content
with open(output_file, "wt") as fout:
fout.write(table_csv)
# show the results
print('CSV OUTPUT FILE: ', output_file)
if __name__ == "__main__":
file_name = sys.argv[1]
main(file_name)
如何以正确的格式获取输出,以便可以使用提取的数据进行进一步的映射。
请建议。
解决方案
推荐阅读
- python - 从 pandas DataFrame 中通过多个部分字符串匹配选择列
- php - 如何更改 getter 属性参数并显示不同的结果?
- sql - 为 SQL 中的重复记录分配相同的键以进行标识
- javascript - 检查特定宽度的屏幕尺寸变化
- javascript - 使用 fetch() 时 JS 脚本无法在 HTML 中运行
- c# - 无法从 Xamarin c# 中的 Firebase 检索记录
- java - 如何 Intellij maven 项目 jacoco 覆盖报告专家到 xml,jacoco exec
- eclipse - java.lang.NoClassDefFoundError: org/eclipse/swt/accessibility/AccessibleObject 在 e4 应用程序启动时
- python - 当它们的长度都相同时,为什么 len 函数在某些迭代中返回 2?
- firefox - 处理权限时出错。2:读取附加清单时 Firefox 中的值“背景”