ImageMagick不再在AWS Lambda中转换pdf

Rud*_*ger 10 pdf imagemagick amazon-web-services node.js aws-lambda

在过去的18个月中,我已经在S3对象上运行了一个AWS Lambda函数,它在大约一个月前进行了一次较小的更新后就死了。我已还原它,但它仍然坏了。我一直在研究使用ImageMagick进行pdf的最基本的转换,但是没有运气,所以我认为AWS已更新了一些内容并导致pdf模块被删除或停止工作。

我只完成了我在Node.js 8.10的核心代码中基本完成的基本功能:

gm(response.Body).setFormat("png").stream((err, stdout,stderr) => {
  if (err) {
    console.log('broken');
  }
  const chunks = [];
  stdout.on('data', (chunk) => {
    chunks.push(chunk);
  });
  stdout.on('end', () => {
    console.log('gm done!');
  });
  stderr.on('data', (data) => {
    console.log('std error data ' + data);
  })
});
Run Code Online (Sandbox Code Playgroud)

错误响应:

std错误dataconvert:无法加载模块`/usr/lib64/ImageMagick-6.7.8/modules-Q16/coders/pdf.la':找不到文件

我还尝试过迁移到Node.js 10.x,并使用可通过aws无服务器应用程序存储库获得的ImageMagick层。尝试在同一代码上生成此错误

std错误数据转换:FailedToExecuteCommand''gs'-sstdout =%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2'-sDEVICE = pngalpha'-dTextAlphaBits = 4 -dGraphicsAl 4'-r72x72''-sOutputFile = / tmp / magick-22TOeBgB4WrfoN%d''-f / tmp / magick-22KvuEBeuJuyq3''-f / tmp / magick-22dj24vSktMXsj''(1)@错误/pdf.c/InvokePDFDelegate / 292

在这两种情况下,该功能都可以在图像文件上运行时正常运行。

基于此,我认为aws 8.10 ImageMagick和10的图层都缺少pdf模块,但是我不确定如何添加它或为什么首先删除了它。修复正在运行的此功能的最佳方法是什么?

编辑

因此,我已经下载了https://github.com/serverlesspub/imagemagick-aws-lambda-2并手动构建了该库,将其上传到Lambda并使其成功地作为图层工作,但是它不包含其中的GhostScript是一个可选库。我尝试将其添加到要Makefile_ImageMagick生成的文件中,并且在结果中对Ghostscript进行了一些引用,但是运行它并不能解决PDF问题(图像仍然有效)。将GhostScript可选库添加到Make文件的最佳方法是什么?

Rud*_*ger 9

While the other answers helped there was still a lot of work to get to a workable solution so below is how I managed to fix this, specifically for NodeJS.

Download: https://github.com/sina-masnadi/lambda-ghostscript

zip up the bin directory and upload it as a layer into Lambda.

Add https://github.com/sina-masnadi/node-gs to your NodeJS modules. You can either upload them as part of your project or the way I did it as a layer (along with all your other required ones).

Add https://github.com/serverlesspub/imagemagick-aws-lambda-2 as a layer. Best way to do this is to create a new function in Lambda, Select Browse serverless app repository, search for "ImageMagick" and select "image-magick-lambda-layer" (You can also build it and upload it as a layer too).

Add the three layers to your function, I've done it in this order

  1. GhostScript
  2. ImageMagick
  3. NodeJS modules

Add the appPath to the require statement for ImageMagick and GhostScript:

var gm = require("gm").subClass({imageMagick: true, appPath: '/opt/bin/'});
var gs = require('gs');
Run Code Online (Sandbox Code Playgroud)

我的在异步瀑布中,所以在我之前的处理功能之前,我添加了此功能以将其转换为png(如果还没有图像):

  function convertIfPdf(response, next) {
    if (fileType == "pdf") {
      fs.writeFile("/tmp/temp.pdf", response.Body, function(err) {
        if (!err) {
          gs().batch().nopause().executablePath('/opt/bin/./gs').device('png16m').input("/tmp/temp.pdf").output('/tmp/temp.png').exec(function (err, stdout, stderr){
            if (!err && !stderr) {
              var data = fs.readFileSync('/tmp/temp.png');
              next(null, data);
            } else {
              console.log(err);
              console.log(stderr);
            }
          });
        }
      });
    } else {
      next(null, response.Body);
    }
  }
Run Code Online (Sandbox Code Playgroud)

从那时起,您就可以像以前一样在ImageMagick中执行相同的格式了。可能有更好的方法来进行pdf转换,但是除非使用文件,否则我在GS库中遇到问题。如果有更好的方法,请告诉我。

如果在加载库时遇到问题,请确保路径正确,这取决于您将其压缩的方式。

  • @SachinChavan 这是完全相同的结果,只是这个答案有更清晰的步骤并使用层来实现良好的重用。它甚至在博客文章中说它做了同样的事情。 (2认同)
  • 你是对的,我正在尝试这个,但无法遵循层的东西,这真的很好。我已将这些二进制文件添加到 zip 中并上传,它工作正常。会尝试一下。谢谢这个,它真的很有用。 (2认同)