【问题标题】:How to install Poppler to be used on AWS Lambda如何安装 Poppler 以在 AWS Lambda 上使用
【发布时间】:2018-11-20 23:58:45
【问题描述】:

我必须在 AWS 中的 Python Lambda 函数上运行 pdf2image,但它需要在机器上安装 poppler 和 poppler-utils。

我尝试在许多不同的地方搜索如何做到这一点,但找不到任何使用 lambda 函数做到这一点的人。

你们中有人知道如何生成 poppler 二进制文件,将其放在我的 Lambda 包中并告诉 Lambda 使用它吗?

谢谢大家。

【问题讨论】:

    标签: python aws-lambda poppler


    【解决方案1】:

    AWS lambda 在包含软件和库的执行环境下运行,如果没有您需要的任何东西,您需要安装它以创建执行环境。查看以下链接了解更多信息, 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 选择二进制文件?
    • 你不必告诉 lambda,只要确保你在代码中导入了库,然后创建对象并使用它们
    【解决方案2】:

    我的方法是使用 AWS Linux 2 映像作为基础,以确保与 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 作为层上传。

    【讨论】:

    • 不幸的是,接受的答案使用的是 2017 年的 0.59 版,并且不适用于更新的版本。如果将以下行添加到复制语句中,则此答案有效:RUN cp -d /usr/lib64/libbz* package/lib
    • 对于某些 PDF,某些文本不会在其他 PDF 查看器中显示,可能是字体问题。它适用于 github.com/jeylabs/aws-lambda-poppler-layer 虽然
    【解决方案3】:

    使用 Docker 在 Lambda 上为 Poppler 直接构建说明

    为了将 Poppler 放在 Lambda 上,我们将构建一个包含 poppler 的压缩文件夹并将其添加为层。在运行 Amazon Linux 2 的 EC2 实例上执行这些步骤(t2micro 很多)。

    1. 设置机器

    在 EC2 机器上安装 docker。指令here

    mkdir -p poppler_binaries
    
    1. 创建 Dockerfile

    使用此link 或从下方复制/粘贴。

    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/.
    
    1. 构建 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 ..
    
    1. 制作并添加您的 Lambda 层

    下载您的 zip 文件或将其上传到 S3。前往 Lambda 控制台页面以创建一个层,然后将其添加到您的函数中。图层信息here

    1. 向 Lambda 添加环境变量

    here 所述,为了避免向 zip 中添加不必要的文件夹结构。我们将添加一个环境变量来指向我们的依赖项

    PYTHONPATH: /opt/
    

    还有维奥拉!您现在有了一个使用 Poppler 的有效 Lambda 函数!

    注意:感谢这两篇文章帮助我将其拼凑在一起

    警告:不要尝试将 pdf2image 添加到同一层。我不知道为什么,但是当它们在同一层时,pdf2image 找不到 poppler。

    【讨论】:

    • 嗨@Alex Albracht,感谢您的回复...我会尝试运行它,以便我可以接受这个作为答案。真的很详细!谢谢!
    • @DaviRod 那太棒了!已尽我所能进行校对和测试,如果您遇到任何问题或错误,请告诉我
    【解决方案4】:

    嗨@Alex Albracht 感谢您编译的简单说明!他们帮了很多忙。但我真的很难让 lambda 函数找到 poppler 路径。所以,我会试着把它加起来,努力说清楚。

    二进制文件应该放在一个 zip 文件夹中,其结构如下: poppler.zip -> bin/poppler 其中 poppler 文件夹包含二进制文件。然后可以将此 zip 文件夹作为层上传到 AWS lambda。

    要使 pdf2image 工作,它需要 poppler 路径。这应该以“/opt/bin/poppler”的格式包含在 lambda 函数中。

    例如, poppler_path = "/opt/bin/poppler" pages = convert_from_path(PDF_file, 500, poppler_path=poppler_path)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2011-08-31
      • 2019-11-09
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多