求助:使用PyMUpdf提取PDF文本时排除表格及内部内容
用PyMuPDF提取不含表格、图片内容的PDF文本
要过滤掉表格和图片区域的文本,可以通过识别图片边界框和识别表格区域两步来排除对应内容,以下是具体实现方案:
核心思路
- 提取页面上所有图片的边界框,排除落在这些区域内的文本块
- 通过页面的绘图路径识别表格外框(或通过文本块的规整排列判断),排除表格区域内的文本块
代码实现
import fitz # PyMuPDF def extract_clean_text(pdf_path): doc = fitz.open(pdf_path) final_text = "" for page in doc: # 收集所有图片的边界框 img_bboxes = [] for img_info in page.get_images(full=True): xref = img_info[0] # 获取图片在页面上的位置矩形 img_rect = page.get_image_rects(xref)[0] img_bboxes.append(img_rect) # 收集所有表格的边界框(通过识别大尺寸矩形边框) table_bboxes = [] page_drawings = page.get_drawings() for drawing in page_drawings: if drawing["type"] == "rect": rect = drawing["rect"] # 过滤出可能是表格外框的矩形(可根据实际PDF调整阈值) if rect.width > 100 and rect.height > 50: table_bboxes.append(rect) # 遍历所有文本块,过滤掉图片/表格区域内的内容 text_blocks = page.get_text("blocks") for block in text_blocks: block_rect = fitz.Rect(block[:4]) # 判断文本块是否与图片或表格区域重叠 overlap_img = any(block_rect.intersects(bbox) for bbox in img_bboxes) overlap_table = any(block_rect.intersects(bbox) for bbox in table_bboxes) if not overlap_img and not overlap_table: final_text += block[4] + "\n" doc.close() return final_text # 使用示例 if __name__ == "__main__": pdf_file = "target.pdf" clean_content = extract_clean_text(pdf_file) print(clean_content)
优化说明
- 表格识别的尺寸阈值(
100和50)可以根据你的PDF文档调整,若表格外框较小,可适当降低数值 - 对于无外框的表格,可通过分析文本块的排列规律判断:比如同一行文本块的Y坐标接近、X轴间距均匀,且连续多行符合该特征,即可判定为表格区域,进一步过滤
- 若文本块部分重叠表格/图片,可调整判断逻辑(比如文本块70%以上区域在目标区域内才排除),通过
block_rect.intersect(bbox).area / block_rect.area > 0.7这类条件实现
内容的提问来源于stack exchange,提问作者Vinay Kumar
相关产品推荐
相关产品推荐

