使用AWS s3和Lambda将pdf页面转换为图像

时间:2018-07-31 19:59:55

标签: node.js pdf amazon-s3 aws-lambda imagemagick

  

我正在使用节点8.1,   我想使用S3和lambda将PDF转换为图像,但是CloudWatch反复给出以下错误:   “无法导入模块'索引':错误”   下面的文件在主项目文件夹中名为index.js:

const util = require('util');
const AWS = require('aws-sdk');
const gm = require('gm').subClass({ imageMagick: true });
const s3 = new AWS.S3();

exports.handler = (event, context) => {
  const srcBucket = event.Records[0].s3.bucket.name;
  const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

  const dstBucket = srcBucket;
  const dstKey = srcKey.replace('.pdf', '.png');

  s3.getObject({Bucket: srcBucket, Key: srcKey}, (err, response) => {
    if (err) {
      context.done('S3 get object error:', err);
      context.fail(err);
    }

    // conversion start
    gm(response.Body)
      .setFormat("png")
      .resize(200) // you can configure
      .quality(100) // you can configure
      .stream((err, stdout, stderr) => {
        if(err) {
          console.log("gm conversion process error: ");
          console.log(err,stdout,stderr);
          context.fail(err);
        }
        const chunks = [];
        stdout.on('data', (chunk) => {
          chunks.push(chunk);
        });
        stdout.on('end', () => {
          console.log('gm process finished');
          const buffer = Buffer.concat(chunks);

          // Upload start
          const params = {
            Bucket: dstBucket,
            Key: dstKey,
            ContentType: 'image/png',
            Body: buffer
          };
          s3.putObject(params, (err, data) => {
            if (err) {
              console.log("S3 upload error: " + err);
              context.fail(err);
            }
            console.log('S3 upload finished!');
            console.log('Bucket: ' + dstBucket);
            console.log('key: ' + dstKey);
            context.succeed({
              "error":false
            });
          });
        });

        stderr.on('data', (data) => {
          console.log('stderr data: ' +  data);
        });
      });
  });
};
  

我对aws-lambda以及文件转换的了解不多,这是我唯一遇到的问题,找不到解决问题的方法。

我认为index.handler传递函数的方式可能会出现问题,但我不知道次要错误位于何处。

2 个答案:

答案 0 :(得分:0)

问题听起来好像您没有正确配置.yml文件。

https://docs.aws.amazon.com/lambda/latest/dg/serverless-deploy-wt.html#serv-deploy(用于cli部署)

https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/(您需要编写的配置文件,以便aws知道要导入的内容)

答案 1 :(得分:0)

您是否尝试过在本地运行该代码?听起来像是语法错误。

无论如何,我只是创建了此功能,并且可以在此处的fit hub上使用:

https://github.com/rcastoro/PDFImagine

您可以从下面的视频中看到,它将PDF放入s3存储桶中,并使用aws事件通知lambda函数将新的PDF转换为图像。

https://youtu.be/yU-jA2_5Tvs