Rud*_*ger 10 pdf imagemagick amazon-web-services node.js aws-lambda
在过去的18个月中,我已经在S3对象上运行了一个AWS Lambda函数,它在大约一个月前进行了一次较小的更新后就死了。我已还原它,但它仍然坏了。我一直在研究使用ImageMagick进行pdf的最基本的转换,但是没有运气,所以我认为AWS已更新了一些内容并导致pdf模块被删除或停止工作。
我只完成了我在Node.js 8.10的核心代码中基本完成的基本功能:
gm(response.Body).setFormat("png").stream((err, stdout,stderr) => {
if (err) {
console.log('broken');
}
const chunks = [];
stdout.on('data', (chunk) => {
chunks.push(chunk);
});
stdout.on('end', () => {
console.log('gm done!');
});
stderr.on('data', (data) => {
console.log('std error data ' + data);
})
});
Run Code Online (Sandbox Code Playgroud)
错误响应:
std错误dataconvert:无法加载模块`/usr/lib64/ImageMagick-6.7.8/modules-Q16/coders/pdf.la':找不到文件
我还尝试过迁移到Node.js 10.x,并使用可通过aws无服务器应用程序存储库获得的ImageMagick层。尝试在同一代码上生成此错误
std错误数据转换:FailedToExecuteCommand''gs'-sstdout =%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2'-sDEVICE = pngalpha'-dTextAlphaBits = 4 -dGraphicsAl 4'-r72x72''-sOutputFile = / tmp / magick-22TOeBgB4WrfoN%d''-f / tmp / magick-22KvuEBeuJuyq3''-f / tmp / magick-22dj24vSktMXsj''(1)@错误/pdf.c/InvokePDFDelegate / 292
在这两种情况下,该功能都可以在图像文件上运行时正常运行。
基于此,我认为aws 8.10 ImageMagick和10的图层都缺少pdf模块,但是我不确定如何添加它或为什么首先删除了它。修复正在运行的此功能的最佳方法是什么?
编辑
因此,我已经下载了https://github.com/serverlesspub/imagemagick-aws-lambda-2并手动构建了该库,将其上传到Lambda并使其成功地作为图层工作,但是它不包含其中的GhostScript是一个可选库。我尝试将其添加到要Makefile_ImageMagick生成的文件中,并且在结果中对Ghostscript进行了一些引用,但是运行它并不能解决PDF问题(图像仍然有效)。将GhostScript可选库添加到Make文件的最佳方法是什么?
While the other answers helped there was still a lot of work to get to a workable solution so below is how I managed to fix this, specifically for NodeJS.
Download: https://github.com/sina-masnadi/lambda-ghostscript
zip up the bin directory and upload it as a layer into Lambda.
Add https://github.com/sina-masnadi/node-gs to your NodeJS modules. You can either upload them as part of your project or the way I did it as a layer (along with all your other required ones).
Add https://github.com/serverlesspub/imagemagick-aws-lambda-2 as a layer. Best way to do this is to create a new function in Lambda, Select Browse serverless app repository, search for "ImageMagick" and select "image-magick-lambda-layer" (You can also build it and upload it as a layer too).
Add the three layers to your function, I've done it in this order
Add the appPath to the require statement for ImageMagick and GhostScript:
var gm = require("gm").subClass({imageMagick: true, appPath: '/opt/bin/'});
var gs = require('gs');
Run Code Online (Sandbox Code Playgroud)
我的在异步瀑布中,所以在我之前的处理功能之前,我添加了此功能以将其转换为png(如果还没有图像):
function convertIfPdf(response, next) {
if (fileType == "pdf") {
fs.writeFile("/tmp/temp.pdf", response.Body, function(err) {
if (!err) {
gs().batch().nopause().executablePath('/opt/bin/./gs').device('png16m').input("/tmp/temp.pdf").output('/tmp/temp.png').exec(function (err, stdout, stderr){
if (!err && !stderr) {
var data = fs.readFileSync('/tmp/temp.png');
next(null, data);
} else {
console.log(err);
console.log(stderr);
}
});
}
});
} else {
next(null, response.Body);
}
}
Run Code Online (Sandbox Code Playgroud)
从那时起,您就可以像以前一样在ImageMagick中执行相同的格式了。可能有更好的方法来进行pdf转换,但是除非使用文件,否则我在GS库中遇到问题。如果有更好的方法,请告诉我。
如果在加载库时遇到问题,请确保路径正确,这取决于您将其压缩的方式。
| 归档时间: |
|
| 查看次数: |
1815 次 |
| 最近记录: |