场景描述:
pdf文件如图所示:

提取结果如下图所示:

解决思路:
1. 获取四个固定字段关键词的位置
2. 根据关键词的位置确定该pdf文件中截取文本内容范围
如获取表格1内容:
那么截取文本范围为横坐标起始位置(x0, x1)固定为(0,400)、纵坐标起始位置(top, bottom)是变量,当前为(80,230)
3. 确定范围后截取该部分文本并根据字段划分成表格
第一步、输入关键词列表(如[‘’Income‘’, “Transfers”]),获取两个关键词的纵坐标
代码模块:
import pdfplumber
import pandas as pd
def extract_second_y_coordinates(pdf_path, keywords):
"""
提取PDF文件中指定关键词列表中的每个关键词第1或2或3次出现的纵坐标
规则:如果关键词只出现了1或者2次则返回第1次或第2次出现的纵坐标,如果出现了3次及以上则返回第3次出现的纵坐标
参数:
- pdf_path: PDF文件的路径
- keywords: 要提取纵坐标的关键词列表
返回:
- 一个列表,包含两个关键词第1或2或3次出现时的纵坐标
"""
coordinates = {keyword: None for keyword in keywords}
counts = {keyword: 0 for keyword in keywords}
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
words = page.extract_words()
for word in words:
if word['text'] in keywords:
counts[word['text']] += 1
if counts[word['text']] ==1:
coordinates[word['text']] = word['top']
if counts[word['text']] ==2:
coordinates[word['text']] = word['top']
if counts[word['text']] ==3:
coordinates[word['text']] = word['top']
return [coordinates[keyword] for keyword in keywords]调用模块:

二、提取坐标区域内的表格内容
代码模块:
关键方法(找GPT提问的结果、感谢晴天老师的帮助):

import pdfplumber
def extract_table_from_area(pdf_filepath, page_num, x0, top, x1, bottom):
# 打开PDF文件
with pdfplumber.open(pdf_filepath) as pdf:
# 选择指定页面
page = pdf.pages[page_num]
# 计算裁剪区域,传入横坐标起始位置(x0,x1),纵坐标起始位置(top,bottom)
bbox = (
x0,
top,
x1,
bottom
)
# 裁剪页面
cropped_page = page.crop(bbox)
# 定义表格设置
table_settings = {
"vertical_strategy": "text",
"horizontal_strategy": "text",
"intersection_x_tolerance": 15
}
# 从裁剪后的页面提取表格
tables = cropped_page.extract_tables(table_settings)
# 返回提取出的所有表格,每个表格都是一个二维列表
return tables调用模块:

三、在主流程中循环判断表格1和2,将提取出来的表格数据进行加工处理
提取出的表格列会拆分得比较细、需要加工处理(循环判断列数>3时,合并第1、2列)

