Javascript 创建lambda函数以生成PDF文件缩略图

Javascript 创建lambda函数以生成PDF文件缩略图,javascript,amazon-web-services,pdf,amazon-s3,aws-lambda,Javascript,Amazon Web Services,Pdf,Amazon S3,Aws Lambda,我一直在尝试创建一个AWS节点lambda函数,从S3下载一个PDF文件,为该文件的第一页生成一个缩略图,然后将该缩略图上传回S3。由于我不是专家,我试图从AWS提供的Lambda示例中启发自己调整图像大小,以及node.js中的PDF缩略图生成器,但未能使其正常工作。 从S3下载正常,上传回S3正常,但缩略图生成失败。 请参见下面的我的代码: //从S3下载pdf,创建缩略图,然后上传到缓存。 异步瀑布([ 功能下载(下一步){ //将pdf从S3下载到缓冲区中。 s3.getObject(

我一直在尝试创建一个AWS节点lambda函数,从S3下载一个PDF文件,为该文件的第一页生成一个缩略图,然后将该缩略图上传回S3。由于我不是专家,我试图从AWS提供的Lambda示例中启发自己调整图像大小,以及node.js中的PDF缩略图生成器,但未能使其正常工作。 从S3下载正常,上传回S3正常,但缩略图生成失败。 请参见下面的我的代码:

//从S3下载pdf,创建缩略图,然后上传到缓存。
异步瀑布([
功能下载(下一步){
//将pdf从S3下载到缓冲区中。
s3.getObject({
桶:桶,
关键字:pdfkey
},
其次);
},
函数缩略图(响应,下一步){
gm(response.Body[0]).size(函数(err,size){
//在内存中转换图像缓冲区。
this.resize(requestedwidth,requestedheight).toBuffer(format.toUpperCase(),函数(err,buffer){
如果(错误){
console.log('生成缩略图失败');
下一个(错误);
}否则{
接下来(null,response.ContentType,buffer);
}
});
});
},
函数上载(contentType、data、next){
//流化缩略图
s3.1对象({
桶:桶,
键:指钉键,
ACL:“公共读取”,
正文:数据,
ContentType:ContentType
},
其次);
}
],函数(err){
如果(错误){
context.fail(新错误(
'无法为'+BUCKET+'/'+pdfkey'创建缩略图+
'并上传到'+BUCKET+'/'+thumbnailkey'+
'由于错误:'+错误
));
}否则{
成功(
'已成功调整'+BUCKET+'/'+pdfkey'的大小+
'并上载到“+BUCKET+”/“+thumbnailkey”
);
}
}

);以下是最终有效的代码。使用节点模块中的以下4个LIB编写以下代码:

  • 异步的
  • 通用汽车
  • mktemp
  • pdf图像
:


你搞清楚了吗?希望做同样的事情。干杯
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
                );
        }
    }
    );
};