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

如何打印含列表的字典元素?PDF提取字典数据打印不全求助

解决PDF文本提取与字典元素打印问题

一、提取结果为空的可能原因与修复方案

从你的描述来看,你应该是多次调用pdf.extract()(对应不同坐标区域)来提取SRN、PMI等字段,但只有第一个区域返回了有效文本,其他两个是空值。这里有几个可能的问题和解决办法:

1. 坐标区域不准确

你使用的in_bbox("%s,%s,%s,%s")依赖精确的坐标范围,如果坐标选得不对(比如只框到了空白区域,或者文本不在这个范围内),提取到的LTTextLineHorizontal对象的text就会是空字符串。

  • 建议先打印每个区域匹配到的LTTextLineHorizontal对象的详细信息,确认是否真的包含文本:
    cells = pdf.extract([('cells', 'LTTextLineHorizontal:in_bbox("%s,%s,%s,%s")' % (x,y,x1,y1))])
    # 打印匹配到的所有对象的属性
    for cell in cells['cells']:
        print(f"文本内容: {cell.text}, 坐标: {cell.bbox}")
    
    这样能直观看到每个对象的实际文本和位置,判断是否是坐标选得有问题。

2. 文本对象类型不匹配

PDF里的文本可能不是LTTextLineHorizontal类型,比如可能是LTTextBoxHorizontal或者其他类型。你可以放宽选择器,先匹配所有文本对象,再筛选:

# 先提取所有文本对象,再根据坐标过滤
all_text = pdf.pages[0].extract_text_objects()
target_cells = [obj for obj in all_text if obj.bbox[0] >= x and obj.bbox[1] >= y and obj.bbox[2] <= x1 and obj.bbox[3] <= y1]
# 打印这些对象的类型和文本
for obj in target_cells:
    print(f"对象类型: {type(obj).__name__}, 文本: {obj.text}")

这样能找到正确的文本对象类型,再调整你的extract选择器。

3. 处理代码的优化

你的返回代码是[cell.text.encode('utf-8').strip() for cell in cells['cells']],如果cells['cells']里有多个文本行,会返回一个列表。如果只需要单个文本,可以取第一个元素(如果确定只有一个):

result = cells['cells'][0].text.encode('utf-8').strip() if cells['cells'] else b''
return result

避免返回列表形式,方便后续打印。

二、如何打印包含列表的字典内所有元素

对于类似{'cells': [<LTTextLineHorizontal>, <LTTextLineHorizontal>]}这样的字典,要遍历并打印所有元素,可以这样做:

方法1:遍历字典的键值对,再遍历列表元素

def print_dict_with_list(d):
    for key, value in d.items():
        print(f"键: {key}")
        if isinstance(value, list):
            print("列表元素:")
            for idx, item in enumerate(value):
                # 如果是LTTextLineHorizontal对象,打印其text和bbox属性
                if hasattr(item, 'text') and hasattr(item, 'bbox'):
                    print(f"  元素{idx}: 文本='{item.text}', 坐标={item.bbox}")
                else:
                    print(f"  元素{idx}: {item}")
        else:
            print(f"值: {value}")

# 调用示例
cells = pdf.extract([('cells', 'LTTextLineHorizontal:in_bbox("%s,%s,%s,%s")' % (x,y,x1,y1))])
print_dict_with_list(cells)

方法2:直接打印对象的repr(适合调试)

如果你只是想快速查看所有内容,可以直接打印字典的字符串表示,或者使用pprint模块格式化输出:

import pprint
pprint.pprint(cells)

这样会以更清晰的结构显示字典和列表里的所有元素细节。

三、额外建议

  • 确认你使用的是pdfplumber库(从LTTextLineHorizontal和extract方法来看应该是),确保版本是最新的,避免旧版本的bug。
  • 如果是多页PDF,要确认你操作的是正确的页面(比如pdf.pages[0]是第一页)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:25:24