使用pdfplumber提取超300页PDF仅获每页首行数据的问题求助
问题排查与解决方案
可能原因分析
- PDF表格的水平分隔线不连续,
horizontal_strategy="lines"仅能识别完整实线,导致后续行被忽略 - 裁剪区域
box范围设置不准确,仅覆盖了第一行数据区域 - 表格提取的默认参数未适配该PDF的布局细节
调整后的脚本
修改表格识别策略,同时优化裁剪区域和过滤逻辑:
import pandas as pd import pdfplumber pdf_file = "C:/Users/xxx/Downloads/aeronaves_inscritas.pdf" # 微调裁剪区域,确保覆盖所有数据行(可根据实际页面调整数值) box = (0, 120, 840, 560) all_tables = [] with pdfplumber.open(pdf_file) as pdf: for page in pdf.pages: cropped_page = page.crop(bbox=box) # 改用"text"策略识别行,适配不连续的分隔线 table = cropped_page.extract_table(table_settings={ "vertical_strategy": "lines", "horizontal_strategy": "text", # 调整文本垂直偏差阈值,适配行间距 "text_y_tolerance": 5 }) # 精准过滤空行(排除无有效内容的行) filtered_table = [ row for row in table if row and any(cell.strip() for cell in row if cell is not None) ] all_tables.extend(filtered_table) df = pd.DataFrame(all_tables) # 可选:手动设置表头(根据表格实际列名调整) # df.columns = ["注册号", "机型", "运营方", ...] print(df.head()) df.to_csv('extracted_tables.csv', index=False)
关键调整说明
- 替换
horizontal_strategy为"text":该策略通过文本块的垂直位置识别行,适配分隔线不完整的PDF表格 - 优化空行过滤逻辑:避免误删有效数据行,同时彻底排除无内容的空行
- 微调裁剪区域:确保完整覆盖每页的所有数据行(可通过
cropped_page.to_image()查看裁剪范围是否正确)
额外排查步骤
- 打印单页裁剪后的图片(
cropped_page.to_image().save("test_crop.png")),确认裁剪范围是否包含所有行 - 调整
text_y_tolerance数值:数值越大,允许文本块的垂直偏差越大,可适配行间距较大的表格
内容的提问来源于stack exchange,提问作者Mark k
相关产品推荐
相关产品推荐

