如何获取tabula-py提取的表格对应的PDF原始页码
实现方法
默认调用tabula.read_pdf(file, pages='all')返回的Pandas DataFrame列表不会携带来源页码元信息,你可以用以下两种方案实现页码映射:
方案一:逐页读取手动绑定映射(兼容性最好,推荐)
先统计PDF总页数,逐页调用表格提取接口,每提取到一个表格就记录对应的页码,最终得到的表格列表和你直接传pages='all'的返回结果完全一致:import tabula from PyPDF2 import PdfReader # 读取PDF获取总页数 pdf_reader = PdfReader(file) total_pages = len(pdf_reader.pages) tables = [] table_to_page = [] for page in range(1, total_pages + 1): # 提取单页内所有表格 current_page_tables = tabula.read_pdf(file, pages=page, multiple_tables=True) for table in current_page_tables: tables.append(table) table_to_page.append(page)最终
table_to_page[i]就是tables[i]对应的PDF页码,比如table_to_page[0] = 1就代表第一个提取到的表格来自PDF第1页,页码计数和PDF阅读器显示的页码一致,从1开始。方案二:通过JSON输出格式读取元信息
把输出格式设为json时,返回结果会自带页码字段,不需要额外引入PDF页数统计依赖,注意这个方法会用到tabula的内部表格转换方法,版本升级时可能有兼容性变动:import tabula raw_result = tabula.read_pdf(file, pages='all', output_format='json') tables = [] table_to_page = [] for page_info in raw_result: current_page = page_info['page'] for table_data in page_info['tables']: df = tabula.io._extract_table(table_data) tables.append(df) table_to_page.append(current_page)
避坑提示:不要依赖表格在列表中的顺序硬编码页码,部分页面可能存在多个表格、部分页面没有表格,硬编码会出现映射错位。
内容的提问来源于stack exchange,提问作者user8802333
相关产品推荐
相关产品推荐

