如何解决Tabula读取PDF时的JSONDecodeError及参数错误问题
解决Tabula读取PDF时的JSONDecodeError及参数错误问题
问题根源
JSONDecodeError是因为部分PDF包含unicode_escape无法解析的特殊控制字符(如不可见控制码、非标准编码字符)- 使用
rb模式触发参数错误,是因为tabula.read_pdf不支持直接传入二进制文件对象,参数类型/顺序不符合接口要求
解决方案
1. 多编码尝试+异常捕获
对每个文件依次尝试多种编码,捕获异常后自动切换编码,适配不同PDF的编码情况:
import tabula as tb import os pdf_dir = r"W:\test\Documentation\PDF\Folder" # 常见兼容编码列表 candidate_encodings = ['unicode_escape', 'utf-8', 'latin-1', 'cp1252'] for filename in os.listdir(pdf_dir): file_path = os.path.join(pdf_dir, filename) print(f"正在处理: {filename}") processed = False for enc in candidate_encodings: try: dfs = tb.read_pdf(file_path, pages='all', encoding=enc) print(f"编码{enc}处理成功,提取到表格:") print(dfs) processed = True break except Exception as e: print(f"编码{enc}失败: {str(e)}") if not processed: print(f"{filename}所有编码尝试均失败,已跳过")
2. 手动清理JSON控制字符
绕开Tabula内置的JSON解析,先获取原始JSON字符串,移除无效控制字符后再解析:
import tabula as tb import os import json import re def sanitize_json(raw_json): # 移除JSON中不允许的控制字符 return re.sub(r'[\x00-\x1F\x7F-\x9F]', '', raw_json) pdf_dir = r"W:\test\Documentation\PDF\Folder" for filename in os.listdir(pdf_dir): file_path = os.path.join(pdf_dir, filename) print(f"正在处理: {filename}") try: # 获取原始JSON输出 raw_json_str = tb.read_pdf(file_path, pages='all', output_format='json', encoding='unicode_escape') cleaned_json = sanitize_json(raw_json_str) # 解析为JSON并转换为DataFrame json_data = json.loads(cleaned_json) dfs = tb.io.json.json_to_dataframe(json_data) print(f"处理成功,提取到表格:") print(dfs) except Exception as e: print(f"处理失败: {str(e)}")
3. 更新依赖环境
旧版本Tabula-py可能存在编码兼容bug,更新到最新版本,同时确保Java环境为1.8及以上:
pip install --upgrade tabula-py
注意事项
- 用
os.path.join()拼接文件路径,避免手动写分隔符导致的跨系统问题 - 若部分PDF仍无法处理,可尝试用PDF编辑工具重新保存(如Adobe Acrobat),修复可能的文件格式问题
内容的提问来源于stack exchange,提问作者N.H.P
相关产品推荐
相关产品推荐

