如何打印含列表的字典元素?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
相关产品推荐
相关产品推荐

