我一直在尝试创建一个 AWS 节点 lambda 函数来从 S3 下载 PDF 文件,为该文件的第一页生成缩略图,然后将该缩略图上传回 S3。由于我不是专家,我尝试从 AWS 提供的 Lambda 示例中启发自己调整图像大小,以及在 node.js 中的 PDF 缩略图生成器的 SO 上找到的 node.js,但未能使其工作。 从 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
);
}
}
);
如有任何帮助,我们将不胜感激!
最佳答案
这是最终运行的代码。下面的代码在节点模块中包含以下 4 个库:
- 异步
- 总经理
- 制作温度
- 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
);
}
}
);
};
关于javascript - 创建 lambda 函数以生成 PDF 文件缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811765/