PDFInfoNotInstalledError AWS Lambda 无法使用 pdf2image 找到 Poppler 路径

PDFInfoNotInstalledError AWS Lambda can't find Poppler path with pdf2image

按照此处的指南: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
  2. 的情况下调用 convert_from_bytes()
  3. 使用该指南中的 package.zip 添加 lambda 层,然后使用 poppler_path = '/opt/lib/'
  4. 调用 convert_from_bytes()
  5. 将 /lib 和 /bin 目录直接添加到我的 lambda 中并使用 poppler_path = '/var/task/lib/'
  6. 调用 convert_from_bytes()
  7. 使用该指南中的 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...

Understand The Problem

好吧,我在前 2 天一直在处理这个问题,div 甚至深入到 pdf2image 包以了解为什么会发生错误。

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

它是 运行 一个像 pdfinfo /path/to/pdf/file 这样的 Linux 命令 并且看起来压缩时的二进制文件在 chmod -R 750 上(在我的例子中),这阻止了子进程库 运行 导致错误“权限被拒绝”的命令,然后 returns pdf2image包告诉你你面临同样的错误。

How to Solve:

确保在压缩二进制文件之前,文件由 运行ning chmod -R 777 .

对 777 进行了修改

然后当 运行使用方法 convert_from_path() 时,将 poppler_path 设置为您的二进制文件扩展。

就是这样

Note: I create a layer to contain only popplet-utils binaries to use in the function.