javascript - Creating a lambda function to generate PDF file thumbnails - Stack Overflow

I have been trying to create a AWS node lambda function to download a PDF file from S3, generate a thum

I have been trying to create a AWS node lambda function to download a PDF file from S3, generate a thumbnail for the first page of that file, and upload that thumbnail back to S3. Since I am no expert I tried inspiring myself from the Lambda example provide by AWS to resize images as well as a node.js found on SO of a PDF thumbnail generator in node.js but have not been able to make it work. The download from S3 works, the upload back to S3 works, but the thumbnail generation fails. See my code below:

// 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
				);
			}
		}
	);

I have been trying to create a AWS node lambda function to download a PDF file from S3, generate a thumbnail for the first page of that file, and upload that thumbnail back to S3. Since I am no expert I tried inspiring myself from the Lambda example provide by AWS to resize images as well as a node.js found on SO of a PDF thumbnail generator in node.js but have not been able to make it work. The download from S3 works, the upload back to S3 works, but the thumbnail generation fails. See my code below:

// 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
				);
			}
		}
	);

Any help would be greatly appreciated!

Share Improve this question edited Jul 5, 2017 at 3:06 Jedi 3,3583 gold badges32 silver badges50 bronze badges asked Sep 27, 2015 at 19:07 Emmanuel RandonEmmanuel Randon 1012 silver badges6 bronze badges 1
  • Did you ever get this figured out? Looking to do the same thing. Cheers – S.A Commented May 25, 2016 at 19:11
Add a ment  | 

1 Answer 1

Reset to default 5

Here is the code that ended up working. Code below with the following 4 libs in node modules:

  • 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
                );
        }
    }
    );
};

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744708686a4589208.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信