在AWS Lambda中使用tabula读取PDF表格时遇JavaNotFoundError问题
在AWS Lambda中使用tabula触发JavaNotFoundError的解决方案
问题背景
在AWS Lambda中使用tabula读取PDF表格时触发JavaNotFoundError,提示找不到java命令。已通过Ubuntu 20.04 EC2打包tabula作为Lambda层,但问题仍未解决。
报错信息
{ "errorMessage": "`java` command is not found from this Python process.Please ensure Java is installed and PATH is set for `java`", "errorType": "JavaNotFoundError", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 39, in lambda_handler df = tabula.read_pdf(BytesIO(fs), pages=\"all\", area = [box], ", " File \"/opt/python/lib/python3.8/site-packages/tabula/io.py\", line 420, in read_pdf output = _run(java_options, tabula_options, path, encoding) ", " File \"/opt/python/lib/python3.8/site-packages/tabula/io.py\", line 98, in _run raise JavaNotFoundError(JAVA_NOT_FOUND_ERROR) " ] }
涉事代码
import boto3 from tabula import read_pdf # 修正原代码的导入语法错误 from io import BytesIO def lambda_handler(event, context): client = boto3.client('s3') s3 = boto3.resource('s3') # 获取最新文件名 response = client.list_objects_v2(Bucket='S3bucket') all_objects = response['Contents'] latest = max(all_objects, key=lambda x: x['LastModified']) latest_key = latest['Key'] # 获取文件内容 obj = s3.Object('S3bucket', latest_key) fs = obj.get()['Body'].read() # 读取PDF表格 box = [3.99, .22, 8.3, 7.86] fc = 72 for i in range(0, len(box)): box[i] *= fc df = tabula.read_pdf(BytesIO(fs), pages="all", area = [box], output_format = "dataframe", lattice=True)
解决步骤
tabula依赖Java环境运行,Lambda默认环境未预装Java,仅打包tabula层无法解决问题,需同时打包Java运行时并配置环境变量:
1. 在EC2上打包包含Java的Lambda层
- 登录Ubuntu 20.04 EC2实例,安装Lambda兼容的OpenJDK 8:
sudo apt update && sudo apt install openjdk-8-jdk -y - 创建层目录结构:
mkdir -p java-tabula-layer/java/lib cp -r /usr/lib/jvm/java-8-openjdk-amd64/* java-tabula-layer/java/lib/ - 将tabula依赖加入同一层(或单独作为Python层):
mkdir -p java-tabula-layer/python/lib/python3.8/site-packages pip3 install tabula-py -t java-tabula-layer/python/lib/python3.8/site-packages/ - 打包层文件:
cd java-tabula-layer zip -r java-tabula-layer.zip .
2. 配置Lambda环境变量
在Lambda控制台的函数配置中添加以下环境变量:
JAVA_HOME:/opt/java/lib/jrePATH:/opt/java/lib/jre/bin:/usr/local/bin:/usr/bin/:/bin
3. 代码中显式指定Java路径(可选)
若环境变量配置后仍报错,可在代码开头指定Java路径:
import tabula tabula.JAVA_PATH = "/opt/java/lib/jre/bin/java"
额外注意事项
- 确保Java版本与Lambda的Python运行时兼容(推荐Python 3.8+搭配OpenJDK 8)
- 打包层时剔除冗余文件,控制层大小在Lambda未压缩250MB的限制范围内
内容的提问来源于stack exchange,提问作者ttam10
相关产品推荐
相关产品推荐

