【问题标题】:PDFInfoNotInstalledError AWS Lambda can't find Poppler path with pdf2imagePDFInfoNotInstalledError AWS Lambda 找不到带有 pdf2image 的 Poppler 路径
【发布时间】:2020-06-20 08:56:26
【问题描述】:

按照此处的指南: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...

【问题讨论】:

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


    【解决方案1】:

    了解问题

    好吧,我在前两天一直在研究这个问题,甚至深入到 pdf2image 包以了解错误发生的原因。

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

    它运行像pdfinfo /path/to/pdf/file这样的Linux命令 并且似乎压缩时的二进制文件位于chmod -R 750(在我的情况下),这会阻止子进程库运行导致错误“权限被拒绝”的命令,然后返回 pdf2image 包以告诉您您面临的相同错误。

    如何解决:

    确保在压缩二进制文件之前,运行 chmod -R 777 . 将文件修改到 777 上

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

    就是这样

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

    【讨论】:

    • 您指定的poppler_path 是什么?你是从sam local start-api 测试的吗?
    • 1-poppler_path 是 python 包正常运行所需的 linux 二进制文件,我在放置二进制文件的任何地方都指定了它。 2-不,我通过 aws 控制台直接在 lambda 中测试它。
    • 那个层在哪里?
    猜你喜欢
    • 2019-04-28
    • 2020-03-09
    • 1970-01-01
    • 2022-09-28
    • 2017-11-16
    • 2015-12-04
    • 2018-12-24
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多