如何用Python提取PDF纯文本(排除图片、表格)?
解决方案:PDF纯文本提取(排除表格、图片区域)
核心思路
利用pdfplumber的表格/图片检测能力,获取它们的坐标范围,在提取文本时直接排除这些区域,只保留纯文本内容。
修改后的代码实现
import pdfplumber import re def extract_first_lines_for_HTML(pdf_path, left=0, top=50, right=0, bottom=50): extracted_data = [] non_extracted_data = [] with pdfplumber.open(pdf_path) as pdf: for page_number in range(len(pdf.pages)): page = pdf.pages[page_number] # 裁剪页面,排除页眉页脚 crop_box = (left, top, page.width - right, page.height - bottom) page_crop = page.within_bbox(crop_box) # 收集需要排除的区域:表格 + 图片 exclude_bboxes = [] # 检测并添加表格区域 table_objects = page_crop.find_tables() exclude_bboxes.extend([table.bbox for table in table_objects]) # 检测并添加图片区域 images = page_crop.images exclude_bboxes.extend([img["bbox"] for img in images]) # 提取排除指定区域后的纯文本 page_text = page_crop.extract_text( x_tolerance=1.5, y_tolerance=3.5, exclude_bboxes=exclude_bboxes ) # 文本清洗与处理 if page_text: page_text = re.sub(r"(\∗)[\n\r]+(.*?)(\() (\))", r"\2\3*\4", page_text) lines = page_text.split('\n') extracted_data.extend(lines) else: non_extracted_data.append(page_number + 1) # 记录无有效文本的页码 return extracted_data, non_extracted_data
关键说明
- 表格排除:通过
page_crop.find_tables()获取表格的坐标边界(bbox),这些边界会被传入extract_text的exclude_bboxes参数,跳过表格内的文本提取。如果你的PDF有复杂嵌套表格,可以调整find_tables()的strategy参数(可选"lines"或"text")优化检测精度。 - 图片排除:
page_crop.images会返回页面内所有图片的元数据,其中bbox是图片的坐标范围,同样加入排除列表,避免提取图片周边的冗余标注(原生PDF中图片本身无文本,此操作主要排除图片占位区域的无效内容)。 - 容错处理:添加
if page_text判断,避免页面无文本时触发split报错,同时记录无有效文本的页码方便排查。
调试建议
可以在代码中加入print(f"Page {page_number+1} excluded areas: {exclude_bboxes}"),查看排除的区域坐标是否符合预期,以此调整页眉页脚的裁剪参数或表格检测策略。
内容的提问来源于stack exchange,提问作者Strategic Gamer
相关产品推荐
相关产品推荐

