批量爬取多页PDF表格导出Excel时camelot、tabula失效解决方案咨询
PDF表格批量提取失败解决方案
首先先排查目标PDF的类型,再对应选择适配方案:
情况1:目标为扫描件/图像型PDF
camelot、tabula仅支持原生可编辑文本PDF,无法识别图像中的表格内容,需先做OCR预处理:
- 可使用
pytesseract+pdf2image先将PDF每页转为文本,再用正则或表格结构匹配规则提取表格 - 也可直接使用
layoutparser文档解析库,调用预训练的表格检测模型直接提取图像PDF中的表格内容
情况2:目标为原生可编辑PDF但结构复杂
优先使用pdfplumber库,它对复杂布局、无明确边界线的表格适配性远高于camelot、tabula,可直接参考如下批量提取代码:
import pdfplumber import pandas as pd import os # 配置路径 BASE_PATH = os.path.dirname(os.path.abspath(__file__)) PDF_FOLDER = os.path.join(BASE_PATH, "替换为你的PDF文件夹路径") OUTPUT_PATH = os.path.join(BASE_PATH, "表格提取结果.xlsx") all_extracted_tables = [] # 遍历所有PDF for file_name in os.listdir(PDF_FOLDER): if not file_name.lower().endswith(".pdf"): continue pdf_full_path = os.path.join(PDF_FOLDER, file_name) with pdfplumber.open(pdf_full_path) as pdf: # 遍历PDF每一页 for page_idx, page in enumerate(pdf.pages, start=1): # 可根据实际表格格式调整提取参数 tables = page.extract_tables(table_settings={ "vertical_strategy": "text", # 按文本位置判断垂直分割线 "horizontal_strategy": "text", # 按文本位置判断水平分割线 "intersection_x_tolerance": 5, # x坐标容差 "intersection_y_tolerance": 5 # y坐标容差 }) # 处理提取到的每个表格 for table_idx, table in enumerate(tables, start=1): # 首行作为表头,其余为内容 df = pd.DataFrame(table[1:], columns=table[0]) # 标记来源信息方便核对 df["来源文件"] = file_name df["页码"] = page_idx df["表格序号"] = table_idx all_extracted_tables.append(df) # 导出为Excel if all_extracted_tables: merged_df = pd.concat(all_extracted_tables, ignore_index=True) merged_df.to_excel(OUTPUT_PATH, index=False)
如果提取结果仍有错位,可调用page.debug_tablefinder()输出当前页面的表格检测结果,调整table_settings中的容差、最小单元格尺寸等参数适配你的PDF格式。
其他特殊场景适配
- 若PDF为加密文件,先通过
pikepdf库解密后再提取:pikepdf.open(加密文件路径, password="你的PDF密码").save(解密后保存路径) - 若表格存在大量合并单元格、嵌套结构,可先提取PDF全页文本后按表格的行特征手动切割,再拼接为DataFrame导出。
内容的提问来源于stack exchange,提问作者seanb-latex
相关产品推荐
相关产品推荐

