在AWS NodeJS Lambda函数中包含来自poppler的pdftotext

我正在使用节点模块pdf-to-text为我的Nodejs lambda函数,但我得到一个“ spawn pdftotext ENOENT ”错误。 我尝试启动AWS EC2实例并使用此脚本编译poppler。 我设法得到S3上的一个tar.gz文件,其中包含一个popplar文件,里面有一个bin和lib文件夹。 但是,当我参考poppler文件放在一个bin文件夹中,像这样: process.env['PATH'] = process.env['PATH'] + ':' + path.join(process.env['LAMBDA_TASK_ROOT'], '/bin/poppler');

这没有用。 我有一个spawn ENOTDIR错误。 然后我解压缩它,并尝试引用文件内的bin文件夹:'bin / bin',但是我得到了一个spawn EACCES错误。

我试着直接引用“bin / pdftotext”,并再次得到了spawn ENOTDIR错误。

有没有人有任何运气把这个库的lambda函数?

TL; DR,我想在我的lambda函数中运行命令spawn('pdftotext')

取得了一些进展,我在poppler文件夹上做了一个chmod,现在我得到这个错误:

 Error: pdf-text-extract command failed: pdftotext: error while loading shared libraries: libpoppler.so.56: cannot open shared object file: No such file or directory 

awsLambda用户代码只能访问两个目录。

  1. 在/ var /任务
  2. / tmp目录

所有的lambda函数都将源代码保存在/ var / task上

在你的代码中,使用这个path的任何一个而不是当前目录path“/ bin / poppler” 。 喜欢这个

 process.env['PATH'] = process.env['PATH'] + ':' + path.join(process.env['LAMBDA_TASK_ROOT'], '/bin/poppler'); 

运行ldd pdftotext查看静态链接库的列表,您需要将它们包含在LAMBDA_TASK_ROOT/lib目录下的lambda部署包中。

例如,我运行它时看到这个:

  linux-vdso.so.1 => (0x00007ffc2e998000) libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007f6a7d732000) libopenjpeg.so.2 => /usr/lib64/libopenjpeg.so.2 (0x00007f6a7d512000) libfontconfig.so.1 => /home/ec2-user/tmp/usr/lib/libfontconfig.so.1 (0x00007f6a7d2d0000) libxml2.so.2 => /home/ec2-user/tmp/usr/lib/libxml2.so.2 (0x00007f6a7cf6c000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f6a7cd67000) libfreetype.so.6 => /home/ec2-user/tmp/usr/lib/libfreetype.so.6 (0x00007f6a7cab4000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6a7c898000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f6a7c592000) libm.so.6 => /lib64/libm.so.6 (0x00007f6a7c290000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6a7c07a000) libc.so.6 => /lib64/libc.so.6 (0x00007f6a7bcb5000) libz.so.1 => /lib64/libz.so.1 (0x00007f6a7ba9f000) /lib64/ld-linux-x86-64.so.2 (0x00005559f0a32000) 

任何未包含在基本lambda AMI中的内容都可能需要复制到LAMBDA_TASK_ROOT/lib目录中,以便运行pdftotext (在我的情况下,所有内容都指向/home/ec2-user/tmp/* )。 你的错误特别提到libpoppler.so.56所以你需要find你的构build,并在该目录中包含该文件。

文档中提到了一个LD_LIBRARY_PATH环境variables,您可以调整这个variables,以便将这些文件放在不同的位置,但是当我尝试在lambdaexpression式中设置它时,它没有任何作用,所以我会把文件放在已经在路上。