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",
我尝试过的:
- 使用该指南中的 package.zip 添加 lambda 层,然后
在没有 poppler_path
的情况下调用 convert_from_bytes()
- 使用该指南中的 package.zip 添加 lambda 层,然后使用 poppler_path = '/opt/lib/'
调用 convert_from_bytes()
- 将 /lib 和 /bin 目录直接添加到我的 lambda 中并使用 poppler_path = '/var/task/lib/'
调用 convert_from_bytes()
使用该指南中的 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.
按照此处的指南: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",
我尝试过的:
- 使用该指南中的 package.zip 添加 lambda 层,然后 在没有 poppler_path 的情况下调用
- 使用该指南中的 package.zip 添加 lambda 层,然后使用 poppler_path = '/opt/lib/' 调用
- 将 /lib 和 /bin 目录直接添加到我的 lambda 中并使用 poppler_path = '/var/task/lib/' 调用
使用该指南中的 package.zip 添加 lambda 层,并添加映射到 /opt/ 的环境变量 PATH 4a.做同样的事情并将其映射到 /opt/lib/
4b。做同样的事情并将其映射到 /opt/bin/
convert_from_bytes()
convert_from_bytes()
convert_from_bytes()
我对上述其中一项的 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 .
然后当 运行使用方法 convert_from_path()
时,将 poppler_path
设置为您的二进制文件扩展。
就是这样
Note: I create a layer to contain only popplet-utils binaries to use in the function.