You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tabula读取PDF时遭遇UnicodeDecodeError的求助

解决Tabula-Py读取PDF时的UnicodeDecodeError问题

你遇到的错误本质是解码Java子进程的标准输出时失败,而非直接解析PDF内容的编码问题。即使指定了encoding参数,Tabula-Py的Java后端可能未正确遵循该编码输出,导致Python端解码出错。以下是几个可行的解决方案:

方案1:先将结果导出为文件,再读取

绕过子进程输出的解码问题,先让Tabula把提取的表格保存为CSV文件,再用Pandas指定编码读取:

import pandas as pd
import tabula

path = 'RENAME-2022.pdf'
# 将表格导出为CSV文件
tabula.read_pdf(
    input_path=path,
    output_format="csv",
    pages='28-78',
    output_path='extracted_table.csv',
    encoding='latin-1'
)

# 用正确编码读取CSV
df = pd.read_csv('extracted_table.csv', encoding='latin-1')

方案2:强制Java进程使用指定编码输出

通过java_options设置Java的文件编码,确保子进程输出与Python端解码的编码一致:

import tabula

path = 'RENAME-2022.pdf'
df = tabula.read_pdf(
    input_path=path,
    output_format="dataframe",
    pages='28-78',
    java_options=["-Dfile.encoding=ISO-8859-1"],  # 强制Java使用Latin-1编码输出
    encoding='latin-1'
)

如果上述编码仍有问题,可尝试替换为"-Dfile.encoding=CP1252"或"-Dfile.encoding=UTF-8"。

方案3:指定表格解析模式

根据PDF表格的结构,添加lattice或stream参数帮助Tabula更准确解析表格,减少异常输出导致的编码错误:

  • 如果表格有清晰的网格线,使用lattice=True:
df = tabula.read_pdf(
    input_path=path,
    output_format="dataframe",
    pages='28-78',
    lattice=True,
    encoding='latin-1'
)
  • 如果表格是纯文本流式布局,使用stream=True:
df = tabula.read_pdf(
    input_path=path,
    output_format="dataframe",
    pages='28-78',
    stream=True,
    encoding='latin-1'
)

方案4:升级Tabula-Py到最新版本

该解码问题可能是旧版本的已知bug,升级到最新版可修复:

pip install --upgrade tabula-py

注意事项

你尝试直接传入PDF二进制内容的方式不可行,因为tabula.read_pdf的input_path参数仅接受文件路径字符串或URL,不支持字节数据。

内容的提问来源于stack exchange,提问作者francescobfc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:33