PDFInfoNotInstalledError AWS Lambda找不到带有pdf2image的Poppler路径

时间:2020-06-20 08:56:26

标签: python-3.x aws-lambda poppler

遵循此处的指南:https://www.petewilcock.com/using-poppler-pdftotext-and-other-custom-binaries-on-aws-lambda/,我能够使用EC2获得二进制文件。但是现在对于最后一步,我似乎找不到找到使pdf2image使用poppler路径的方法。出现错误:

  "errorMessage": "Unable to get page count. Is poppler installed and in PATH?",
  "errorType": "PDFInfoNotInstalledError",

我尝试过的事情:

  1. 使用该指南中的package.zip添加一个lambda层,然后 没有poppler_path调用convert_from_bytes()
  2. 从该指南的package.zip中添加一个lambda层,然后使用poppler_path ='/ opt / lib /'调用convert_from_bytes()
  3. 将/ lib和/ bin目录直接添加到我的lambda中,并使用poppler_path ='/ var / task / lib /'调用convert_from_bytes()
  4. 使用该指南中的package.zip添加一个lambda层,并添加映射到/ opt /的环境变量PATH 4a。做同样的事情并将其映射到/ opt / lib /

    4b。做同样的事情并将其映射到/ opt / bin /

我的上述之一的lambda:

import json
import base64
import os
from uuid import uuid4
from pdf2image import convert_from_bytes

POPPLER_PATH = '/opt/lib/'

def text_process_handler(event, context):
    document = bucketHelper.get_bucket_object('<Bucket>', '<document>.pdf')
    images = convert_from_bytes(document,dpi=150, poppler_path=POPPLER_PATH)

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "Successful request."
        }),       
    }

我的package.zip如下:

+--lib
|  +--libpoppler.so.70
|  +--libtiff.so.5
|  +--etc...
+--bin
|  +--pdftoppm
|  +--pdftotext
|  +--etc...

1 个答案:

答案 0 :(得分:1)

了解问题

好吧,我在前两天对此进行了研究,甚至深入研究pdf2image软件包以了解为什么会发生错误。

这是导致错误的原因: pdf2image python软件包使用子进程库来运行二进制文件(例如pdfinfo,pdftocairo,...等)

并运行pdfinfo /path/to/pdf/file之类的Linux命令 并且似乎压缩后的二进制文件位于chmod -R 750上(在我的情况下),这阻止子进程库运行导致错误“ permission否认”的命令,然后该错误返回pdf2image软件包以告诉您相同的错误脸。

解决方法:

通过运行chmod -R 777 .

确保在777上压缩文件mod的二进制文件之前。

然后在运行方法convert_from_path()时将poppler_path设置为您的二进制格式。

就是这样

注意:我创建了一个图层,仅包含要使用的popplet-utils二进制文件 在功能中。