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

在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/jre
  • PATH: /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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:20:28