如何安装 Poppler 以在 AWS Lambda 上使用
How to install Poppler to be used on AWS Lambda
我必须 运行 pdf2image 我在 AWS 中的 Python Lambda 函数,但它需要在机器上安装 poppler 和 poppler-utils .
我试图在许多不同的地方搜索如何做到这一点,但找不到任何人或任何人使用 lambda 函数做到这一点。
你们中有人知道如何生成 poppler 二进制文件,将它放在我的 Lambda 包中并告诉 Lambda 使用它吗?
谢谢大家
AWS lambda 在包括软件和库的执行环境下运行,如果您需要的东西不存在,您需要安装它来创建执行 environment.Check 下面的 link 了解更多信息,
https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
对于 poppler,请按照以下步骤创建您自己的二进制文件
https://github.com/skylander86/lambda-text-extractor/blob/master/BuildingBinaries.md
Lambda 上使用 Docker
的 Poppler 的直接构建说明
为了将 Poppler 放在 Lambda 上,我们将构建一个包含 poppler 的压缩文件夹并将其添加为层。在 EC2 实例 运行 Amazon Linux 2 上执行这些步骤(t2micro 足够)。
- 设置机器
在 EC2 机器上安装 docker。说明here
mkdir -p poppler_binaries
- 创建一个Docker文件
使用下面的 link 或 copy/paste。
FROM ubuntu:18.04
# Installing dependencies
RUN apt update
RUN apt-get update
RUN apt-get install -y locate \
libopenjp2-7 \
poppler-utils
RUN rm -rf /poppler_binaries; mkdir /poppler_binaries;
RUN updatedb
RUN cp $(locate libpoppler.so) /poppler_binaries/.
RUN cp $(which pdftoppm) /poppler_binaries/.
RUN cp $(which pdfinfo) /poppler_binaries/.
RUN cp $(which pdftocairo) /poppler_binaries/.
RUN cp $(locate libjpeg.so.8 ) /poppler_binaries/.
RUN cp $(locate libopenjp2.so.7 ) /poppler_binaries/.
RUN cp $(locate libpng16.so.16 ) /poppler_binaries/.
RUN cp $(locate libz.so.1 ) /poppler_binaries/.
- 构建 Docker 映像并创建 zip 文件
运行 下面的命令将在您的主目录中生成一个 zip 文件。
docker build -t poppler-build .
# Run the container
docker run -d --name poppler-build-cont poppler-build sleep 20
#docker exec poppler-build-cont
sudo docker cp poppler-build-cont:/poppler_binaries .
# Cleaning up
docker kill poppler-build-cont
docker rm poppler-build-cont
docker image rm poppler-build
cd poppler_binaries
zip -r9 ..poppler.zip .
cd ..
- 制作并添加您的 Lambda 层
下载您的 zip 文件或将其上传到 S3。前往 Lambda 控制台页面创建一个层,然后将其添加到您的函数中。有关图层的信息 here.
- 向 Lambda 添加环境变量
为了避免向 zip 添加不必要的文件夹结构,如 here 所述。我们将添加一个环境变量来指向我们的依赖项
PYTHONPATH: /opt/
还有中提琴!您现在拥有一个可与 Poppler 一起使用的 Lambda 函数!
注意:感谢这两篇帮助我拼凑起来的文章
警告:不要尝试将 pdf2image 添加到同一图层。我不确定为什么但是当它们在同一层时,pdf2image 找不到 poppler。
您好@Alex Albracht,感谢编译的简单说明!他们帮了很多忙。但我真的很难让 lambda 函数找到 poppler 路径。因此,我将尝试将其添加到一起以使其清楚。
二进制文件应放在结构如下的 zip 文件夹中:
poppler.zip -> bin/poppler
其中 poppler 文件夹包含二进制文件。然后可以将此 zip 文件夹作为 AWS lambda 中的一个层上传。
要使 pdf2image 正常工作,它需要 poppler 路径。这应该包含在 lambda 函数中,格式为 - "/opt/bin/poppler".
例如,
poppler_path = "/opt/bin/poppler"
页数 = convert_from_path(PDF_file, 500, poppler_path=poppler_path)
我的方法是使用 AWS Linux2 映像作为基础,以确保与 Lambda 环境的最大兼容性,在容器构建中编译 openjpeg 和 poppler,并构建一个包含所需二进制文件和库的 zip然后可以用作图层。
这使您能够在它自己的 lambda 中编写代码,该 lambda 将 poppler 依赖项作为一个层引入,从而简化构建和部署。
层的内容将被解包到 /opt/
。这意味着内容将自动可用,因为默认情况下在 lambda 环境中
$PATH
是 /usr/local/bin:/usr/bin/:/bin:/opt/bin
$LD_LIBRARY_PATH
是 /lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib
Dockerfile
:
# https://www.petewilcock.com/using-poppler-pdftotext-and-other-custom-binaries-on-aws-lambda/
ARG POPPLER_VERSION="21.10.0"
ARG POPPLER_DATA_VERSION="0.4.11"
ARG OPENJPEG_VERSION="2.4.0"
FROM amazonlinux:2
ARG POPPLER_VERSION
ARG POPPLER_DATA_VERSION
ARG OPENJPEG_VERSION
WORKDIR /root
RUN yum update -y
RUN yum install -y \
cmake \
cmake3 \
fontconfig-devel \
gcc \
gcc-c++ \
gzip \
libjpeg-devel \
libpng-devel \
libtiff-devel \
make \
tar \
xz \
zip
RUN curl -o poppler.tar.xz https://poppler.freedesktop.org/poppler-${POPPLER_VERSION}.tar.xz
RUN tar xf poppler.tar.xz
RUN curl -o poppler-data.tar.gz https://poppler.freedesktop.org/poppler-data-${POPPLER_DATA_VERSION}.tar.gz
RUN tar xf poppler-data.tar.gz
RUN curl -o openjpeg.tar.gz https://codeload.github.com/uclouvain/openjpeg/tar.gz/refs/tags/v${OPENJPEG_VERSION}
RUN tar xf openjpeg.tar.gz
WORKDIR poppler-data-${POPPLER_DATA_VERSION}
RUN make install
WORKDIR /root
RUN mkdir openjpeg-${OPENJPEG_VERSION}/build
WORKDIR openjpeg-${OPENJPEG_VERSION}/build
RUN cmake .. -DCMAKE_BUILD_TYPE=Release
RUN make
RUN make install
WORKDIR /root
RUN mkdir poppler-${POPPLER_VERSION}/build
WORKDIR poppler-${POPPLER_VERSION}/build
RUN cmake3 .. -DCMAKE_BUILD_TYPE=release -DBUILD_GTK_TESTS=OFF -DBUILD_QT5_TESTS=OFF -DBUILD_QT6_TESTS=OFF \
-DBUILD_CPP_TESTS=OFF -DBUILD_MANUAL_TESTS=OFF -DENABLE_BOOST=OFF -DENABLE_CPP=OFF -DENABLE_GLIB=OFF \
-DENABLE_GOBJECT_INTROSPECTION=OFF -DENABLE_GTK_DOC=OFF -DENABLE_QT5=OFF -DENABLE_QT6=OFF \
-DENABLE_LIBOPENJPEG=openjpeg2 -DENABLE_CMS=none -DBUILD_SHARED_LIBS=OFF
RUN make
RUN make install
WORKDIR /root
RUN mkdir -p package/{lib,bin,share}
RUN cp -d /usr/lib64/libexpat* package/lib
RUN cp -d /usr/lib64/libfontconfig* package/lib
RUN cp -d /usr/lib64/libfreetype* package/lib
RUN cp -d /usr/lib64/libjbig* package/lib
RUN cp -d /usr/lib64/libjpeg* package/lib
RUN cp -d /usr/lib64/libpng* package/lib
RUN cp -d /usr/lib64/libtiff* package/lib
RUN cp -d /usr/lib64/libuuid* package/lib
RUN cp -d /usr/lib64/libz* package/lib
RUN cp -rd /usr/local/lib/* package/lib
RUN cp -rd /usr/local/lib64/* package/lib
RUN cp -d /usr/local/bin/* package/bin
RUN cp -rd /usr/local/share/poppler package/share
WORKDIR package
RUN zip -r9 ../package.zip *
然后 运行...
docker build -t poppler .
docker run --name poppler -d -t poppler cat
docker cp poppler:/root/package.zip .
然后使用控制台或 aws cli 将 package.zip
作为图层上传。
我使用了 pre-built AWS Lambda 层 https://github.com/jeylabs/aws-lambda-poppler-layer/releases,它成功了!
如果你只是想运行这个功能,你可以使用这个解决方案,但是如果你想指定版本并有更多的控制权,我会推荐使用容器镜像解决方案。
我必须 运行 pdf2image 我在 AWS 中的 Python Lambda 函数,但它需要在机器上安装 poppler 和 poppler-utils .
我试图在许多不同的地方搜索如何做到这一点,但找不到任何人或任何人使用 lambda 函数做到这一点。
你们中有人知道如何生成 poppler 二进制文件,将它放在我的 Lambda 包中并告诉 Lambda 使用它吗?
谢谢大家
AWS lambda 在包括软件和库的执行环境下运行,如果您需要的东西不存在,您需要安装它来创建执行 environment.Check 下面的 link 了解更多信息, https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
对于 poppler,请按照以下步骤创建您自己的二进制文件 https://github.com/skylander86/lambda-text-extractor/blob/master/BuildingBinaries.md
Lambda 上使用 Docker
的 Poppler 的直接构建说明为了将 Poppler 放在 Lambda 上,我们将构建一个包含 poppler 的压缩文件夹并将其添加为层。在 EC2 实例 运行 Amazon Linux 2 上执行这些步骤(t2micro 足够)。
- 设置机器
在 EC2 机器上安装 docker。说明here
mkdir -p poppler_binaries
- 创建一个Docker文件
使用下面的 link 或 copy/paste。
FROM ubuntu:18.04
# Installing dependencies
RUN apt update
RUN apt-get update
RUN apt-get install -y locate \
libopenjp2-7 \
poppler-utils
RUN rm -rf /poppler_binaries; mkdir /poppler_binaries;
RUN updatedb
RUN cp $(locate libpoppler.so) /poppler_binaries/.
RUN cp $(which pdftoppm) /poppler_binaries/.
RUN cp $(which pdfinfo) /poppler_binaries/.
RUN cp $(which pdftocairo) /poppler_binaries/.
RUN cp $(locate libjpeg.so.8 ) /poppler_binaries/.
RUN cp $(locate libopenjp2.so.7 ) /poppler_binaries/.
RUN cp $(locate libpng16.so.16 ) /poppler_binaries/.
RUN cp $(locate libz.so.1 ) /poppler_binaries/.
- 构建 Docker 映像并创建 zip 文件
运行 下面的命令将在您的主目录中生成一个 zip 文件。
docker build -t poppler-build .
# Run the container
docker run -d --name poppler-build-cont poppler-build sleep 20
#docker exec poppler-build-cont
sudo docker cp poppler-build-cont:/poppler_binaries .
# Cleaning up
docker kill poppler-build-cont
docker rm poppler-build-cont
docker image rm poppler-build
cd poppler_binaries
zip -r9 ..poppler.zip .
cd ..
- 制作并添加您的 Lambda 层
下载您的 zip 文件或将其上传到 S3。前往 Lambda 控制台页面创建一个层,然后将其添加到您的函数中。有关图层的信息 here.
- 向 Lambda 添加环境变量
为了避免向 zip 添加不必要的文件夹结构,如 here 所述。我们将添加一个环境变量来指向我们的依赖项
PYTHONPATH: /opt/
还有中提琴!您现在拥有一个可与 Poppler 一起使用的 Lambda 函数!
注意:感谢这两篇帮助我拼凑起来的文章
警告:不要尝试将 pdf2image 添加到同一图层。我不确定为什么但是当它们在同一层时,pdf2image 找不到 poppler。
您好@Alex Albracht,感谢编译的简单说明!他们帮了很多忙。但我真的很难让 lambda 函数找到 poppler 路径。因此,我将尝试将其添加到一起以使其清楚。
二进制文件应放在结构如下的 zip 文件夹中: poppler.zip -> bin/poppler 其中 poppler 文件夹包含二进制文件。然后可以将此 zip 文件夹作为 AWS lambda 中的一个层上传。
要使 pdf2image 正常工作,它需要 poppler 路径。这应该包含在 lambda 函数中,格式为 - "/opt/bin/poppler".
例如, poppler_path = "/opt/bin/poppler" 页数 = convert_from_path(PDF_file, 500, poppler_path=poppler_path)
我的方法是使用 AWS Linux2 映像作为基础,以确保与 Lambda 环境的最大兼容性,在容器构建中编译 openjpeg 和 poppler,并构建一个包含所需二进制文件和库的 zip然后可以用作图层。
这使您能够在它自己的 lambda 中编写代码,该 lambda 将 poppler 依赖项作为一个层引入,从而简化构建和部署。
层的内容将被解包到 /opt/
。这意味着内容将自动可用,因为默认情况下在 lambda 环境中
$PATH
是/usr/local/bin:/usr/bin/:/bin:/opt/bin
$LD_LIBRARY_PATH
是/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib
Dockerfile
:
# https://www.petewilcock.com/using-poppler-pdftotext-and-other-custom-binaries-on-aws-lambda/
ARG POPPLER_VERSION="21.10.0"
ARG POPPLER_DATA_VERSION="0.4.11"
ARG OPENJPEG_VERSION="2.4.0"
FROM amazonlinux:2
ARG POPPLER_VERSION
ARG POPPLER_DATA_VERSION
ARG OPENJPEG_VERSION
WORKDIR /root
RUN yum update -y
RUN yum install -y \
cmake \
cmake3 \
fontconfig-devel \
gcc \
gcc-c++ \
gzip \
libjpeg-devel \
libpng-devel \
libtiff-devel \
make \
tar \
xz \
zip
RUN curl -o poppler.tar.xz https://poppler.freedesktop.org/poppler-${POPPLER_VERSION}.tar.xz
RUN tar xf poppler.tar.xz
RUN curl -o poppler-data.tar.gz https://poppler.freedesktop.org/poppler-data-${POPPLER_DATA_VERSION}.tar.gz
RUN tar xf poppler-data.tar.gz
RUN curl -o openjpeg.tar.gz https://codeload.github.com/uclouvain/openjpeg/tar.gz/refs/tags/v${OPENJPEG_VERSION}
RUN tar xf openjpeg.tar.gz
WORKDIR poppler-data-${POPPLER_DATA_VERSION}
RUN make install
WORKDIR /root
RUN mkdir openjpeg-${OPENJPEG_VERSION}/build
WORKDIR openjpeg-${OPENJPEG_VERSION}/build
RUN cmake .. -DCMAKE_BUILD_TYPE=Release
RUN make
RUN make install
WORKDIR /root
RUN mkdir poppler-${POPPLER_VERSION}/build
WORKDIR poppler-${POPPLER_VERSION}/build
RUN cmake3 .. -DCMAKE_BUILD_TYPE=release -DBUILD_GTK_TESTS=OFF -DBUILD_QT5_TESTS=OFF -DBUILD_QT6_TESTS=OFF \
-DBUILD_CPP_TESTS=OFF -DBUILD_MANUAL_TESTS=OFF -DENABLE_BOOST=OFF -DENABLE_CPP=OFF -DENABLE_GLIB=OFF \
-DENABLE_GOBJECT_INTROSPECTION=OFF -DENABLE_GTK_DOC=OFF -DENABLE_QT5=OFF -DENABLE_QT6=OFF \
-DENABLE_LIBOPENJPEG=openjpeg2 -DENABLE_CMS=none -DBUILD_SHARED_LIBS=OFF
RUN make
RUN make install
WORKDIR /root
RUN mkdir -p package/{lib,bin,share}
RUN cp -d /usr/lib64/libexpat* package/lib
RUN cp -d /usr/lib64/libfontconfig* package/lib
RUN cp -d /usr/lib64/libfreetype* package/lib
RUN cp -d /usr/lib64/libjbig* package/lib
RUN cp -d /usr/lib64/libjpeg* package/lib
RUN cp -d /usr/lib64/libpng* package/lib
RUN cp -d /usr/lib64/libtiff* package/lib
RUN cp -d /usr/lib64/libuuid* package/lib
RUN cp -d /usr/lib64/libz* package/lib
RUN cp -rd /usr/local/lib/* package/lib
RUN cp -rd /usr/local/lib64/* package/lib
RUN cp -d /usr/local/bin/* package/bin
RUN cp -rd /usr/local/share/poppler package/share
WORKDIR package
RUN zip -r9 ../package.zip *
然后 运行...
docker build -t poppler .
docker run --name poppler -d -t poppler cat
docker cp poppler:/root/package.zip .
然后使用控制台或 aws cli 将 package.zip
作为图层上传。
我使用了 pre-built AWS Lambda 层 https://github.com/jeylabs/aws-lambda-poppler-layer/releases,它成功了!
如果你只是想运行这个功能,你可以使用这个解决方案,但是如果你想指定版本并有更多的控制权,我会推荐使用容器镜像解决方案。