You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用pdfplumber正确提取无分隔线的PDF表格列?

解决pdfplumber无分隔线表格列拆分错误的问题

你的问题出在text垂直策略下,pdfplumber会把文本块之间的所有间隙都当作列分隔符,导致长文本被误拆成多列。以下是两种可行的调整方案:

方案一:手动指定列边界(最可靠)

由于表格列划分清晰,先定位每列的x坐标边界,再强制按这些边界拆分列:

  1. 先运行这段代码获取页面文本的位置信息,确定列边界:
pdf_file = pdfplumber.open(path_in)
page = pdf_file.pages[0]
# 打印所有文本块的x坐标,找到列之间的分界点
for text_block in page.extract_words():
    print(f"文本: {text_block['text']}, 起始x: {text_block['x0']}, 结束x: {text_block['x1']}")
  1. 根据输出的坐标,设置explicit_vertical_lines参数。比如发现日期列的起始x是200,就把边界设为[0, 200, page.width](对应两列):
pdf_file = pdfplumber.open(path_in)
for page in pdf_file.pages:
    tables = page.extract_tables({
        "vertical_strategy": "explicit",
        "horizontal_strategy": "text",
        "explicit_vertical_lines": [0, 200, page.width],  # 替换为实际的列边界x坐标
    })
    for table in tables:
        print("table = ", table)

方案二:调整文本间隙阈值

如果不想手动找坐标,可以增大text_tolerance参数,只有当文本间隙超过设定值时才会拆分列:

pdf_file = pdfplumber.open(path_in)
for page in pdf_file.pages:
    tables = page.extract_tables({
        "vertical_strategy": "text",
        "horizontal_strategy": "text",
        "text_tolerance": 10,  # 可根据实际间隙大小调整,默认值较小
    })
    for table in tables:
        print("table = ", table)

注意

优先选择方案一,因为text策略的稳定性依赖于文本间隙的一致性,手动指定列边界能避免因文本排版细微差异导致的拆分错误。如果表格每页列位置不一致,可以结合页面分析逻辑动态获取边界。

内容的提问来源于stack exchange,提问作者MisterJAcobz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:16:11