创建一个 lambda 函数来生成 PDF 文件缩略图。

5

我一直在尝试创建一个AWS节点lambda函数,从S3下载PDF文件,为该文件的第一页生成缩略图,并将该缩略图上传回S3。由于我不是专家,我尝试从AWS提供的Lambda示例以及在SO上找到的一个node.js中的PDF缩略图生成器来启发自己,但是我没有能够使它工作。

从S3下载工作正常,上传回S3也正常,但是生成缩略图失败。

请见下面的代码:

// Download the pdf from S3, create thumbnail, and upload to cache.
 async.waterfall([
  function download(next) {
   // Download the pdf from S3 into a buffer.
   s3.getObject({
     Bucket: BUCKET,
     Key: pdfkey
    },
    next);
   },
  function thumbnail(response, next) {
   gm(response.Body[0]).size(function(err, size) {
    // Transform the image buffer in memory.
    this.resize(requestedwidth, requestedheight).toBuffer(format.toUpperCase(), function(err, buffer) {
     if (err) {
      console.log('failed generating thumbnail');
      next(err);
     } else {
      next(null, response.ContentType, buffer);
     }
    });
   });
  },
  function upload(contentType, data, next) {
   // Stream the thumbnail
   s3.putObject({
     Bucket: BUCKET,
     Key: thumbnailkey,
     ACL:"public-read",
     Body: data,
     ContentType: contentType
    },
    next);
   }
  ], function (err) {
   if (err) {
    context.fail(new Error(
     'Unable to create thumbnail for ' + BUCKET + '/' + pdfkey +
     ' and upload to ' + BUCKET + '/' + thumbnailkey +
     ' due to an error: ' + err
    ));
   } else {
    context.succeed(
     'Successfully resized ' + BUCKET + '/' + pdfkey +
     ' and uploaded to ' + BUCKET + '/' + thumbnailkey
    );
   }
  }
 );

任何帮助都将不胜感激!

你最终解决了这个问题吗?我也想做相同的事情。祝好 - S.A
1个回答

5

这是最终可行的代码,以下是需要在 node modules 中安装的 4 个库:

  • async
  • gm
  • mktemp
  • pdf-image
var async = require('async');
var AWS = require('aws-sdk');
var gm = require('gm').subClass({ imageMagick: true }); // Enable ImageMagick integration. 
var util = require('util');
var fs = require('fs');
var mktemp = require("mktemp");

var BUCKET  = "XXXXXXXXXX";

var s3 = new AWS.S3();
exports.handler = function(event, context) {

var pdfkey = decodeURIComponent(event.pdfkey.replace(/\+/g, " ")); 
var thumbnailkey = decodeURIComponent(event.thumbnailkey.replace(/\+/g, " ")); 
var requestedwidth = event.width;
var requestedheight = event.height;
var shape = event.shape;
var format = event.format;

// Infer the pdf type.
var typeMatch = pdfkey.match(/\.([^.]*)$/);
if (!typeMatch) {
    context.fail(new Error('unable to infer pdf type for key ' + pdfkey));
    return;
}
var fileType = typeMatch[1];
if (fileType != "pdf") {
    context.fail(new Error('skipping non-pdf ' + pdfkey));
    return;
}

// Download the pdf from S3, create thumbnail, and upload to cache.
async.waterfall([
    function download(next) {
        // Download the pdf from S3 into a buffer.
        s3.getObject({
            Bucket: BUCKET,
            Key: pdfkey
        },
        next);
    },
    function thumbnail(response, next) {
        console.log('generating thumbnail');
        var temp_file, image;

        temp_file = mktemp.createFileSync("/tmp/XXXXXXXXXX.pdf");
        fs.writeFileSync(temp_file, response.Body);
        image = gm(temp_file + "[0]").flatten().colorspace("CMYK");

        image.size(function(err, size) {
            if ((requestedwidth > 0) && (requestedheight > 0))
            {

                if (shape == "pad")
                {
                    // Transform the image buffer in memory.
                    this.resize(requestedwidth, requestedheight).gravity('Center').background('transparent').extent(requestedwidth, requestedheight)
                    .toBuffer(format.toUpperCase(), function(err, buffer) {
                        if (err) {
                            next(err);
                        } else {
                            next(null, response.ContentType, buffer);
                        }
                    });
                }
                else
                {
                    // Transform the image buffer in memory.
                    this.resize(requestedwidth, requestedheight)
                    .toBuffer(format.toUpperCase(), function(err, buffer) {
                        if (err) {
                            next(err);
                        } else {
                            next(null, response.ContentType, buffer);
                        }
                    });
                }
            }
            else
            {
                if (requestedwidth > 0)
                {
                    // Transform the image buffer in memory.
                    this.resize(requestedwidth)
                    .toBuffer(format.toUpperCase(), function(err, buffer) {
                        if (err) {
                            next(err);
                        } else {
                            next(null, response.ContentType, buffer);
                        }
                    });

                }
                else
                {
                    // Transform the image buffer in memory.
                    this.resize(null, requestedheight)
                    .toBuffer(format.toUpperCase(), function(err, buffer) {
                        if (err) {
                            next(err);
                        } else {
                            next(null, response.ContentType, buffer);
                        }
                    });
                }
            }
        });
    },
    function upload(contentType, data, next) {
        // Stream the thumbnail
        console.log('uploading thumbnail');
        s3.putObject({
            Bucket: BUCKET,
            Key: thumbnailkey,
            ACL:"public-read",
            Body: data,
            ContentType: "image/" + format
        },
        next);
    }
    ], function (err) {
        if (err) {
            context.fail(new Error(
                'Unable to create thumbnail for ' + BUCKET + '/' + pdfkey +
                ' and upload to ' + BUCKET + '/' + thumbnailkey +
                ' due to an error: ' + err
                ));
        } else {
            context.succeed(
                'Successfully resized ' + BUCKET + '/' + pdfkey +
                ' and uploaded to ' + BUCKET + '/' + thumbnailkey
                );
        }
    }
    );
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接