私は、pdf形式の図面をアップロードできるアプリケーションを開発中です。アップロードされたファイルはS3に保存されます。アップロード後、ファイルを画像に変換する必要があります。この目的のために、私はラムダ実行環境でS3から/ tmpフォルダにファイルをダウンロードするlambda関数を作成し、次にimagemagickから 'convert'コマンドを呼び出します。AWSラムダ関数 - PDFを画像に変換する
convert sourceFile.pdf targetFile.png
ラムダランタイム環境はnodejs 4.3です。メモリは128MB、タイムアウトは30秒に設定されています。
さて問題は、他の人が次のエラーで失敗している間にいくつかのファイルが正常に変換されていることである。
{ [Error: Command failed: /bin/sh -c convert /tmp/sourceFile.pdf /tmp/targetFile.png convert:
%s' (%d) "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile=/tmp/magick-QRH6nVLV--0000001" "-f/tmp/magick-B610L5uo" "-f/tmp/magick-tIe1MjeR" @ error/utility.c/SystemCommand/1890. convert: Postscript delegate failed
/tmp/sourceFile.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/678. convert: no images defined `/tmp/targetFile.png' @ error/convert.c/ConvertImageCommand/3046. ] killed: false, code: 1, signal: null, cmd: '/bin/sh -c convert /tmp/sourceFile.pdf /tmp/targetFile.png' }
最初にこの問題が発生した理由を私は理解していなかった、そして私は私のローカル上問題のあるファイルを変換しようとしました同じコマンドを持つUbuntuマシン。これは、端末から出力されます。
**** Warning: considering '0000000000 XXXXX n' as a free entry. **** This file had errors that were repaired or ignored. **** The file was produced by: **** >>>> Mac OS X 10.10.5 Quartz PDFContext <<<< **** Please notify the author of the software that produced this **** file that it does not conform to Adobe's published PDF **** specification.
ので、メッセージは非常に明確だったが、ファイルがとにかくPNG形式に変換されます。 convert source.pdf target.pdf
を実行しようとするとそのファイルconvert target.pdf image.png
の後にファイルが修復され、エラーなしに変換されます。これはラムダでは機能しません。
同じ環境が1つの環境では動作しますが、別の環境では動作しないため、Ghostscriptのバージョンが問題です。 AMIのインストール済みバージョンは8.70です。私のローカルマシンでは、Ghostsriptのバージョンは9.18です。
私の質問は以下のとおりです。
- はghostscriptの問題のバージョンですか?これは古いゴシックスクリプトの バージョンのバグですか?そうでない場合は、私のローカル環境の のように、ghostscript(imagemagickを使用しないで を使用)に修復またはエラーを無視する方法を教えてください。
- 古いバージョンが問題の場合は、ソースからゴーストスクリプト を作成し、nodejsモジュールを作成して、そのバージョンの ghostscriptをインストールすることはできますか?
- imagemagickとghostscriptを使用せずにpdfを画像に変換する簡単な方法はありますか?ラムダコードの
UPDATE 関連部分:
var exec = require('child_process').exec;
var AWS = require('aws-sdk');
var fs = require('fs');
...
var localSourceFile = '/tmp/sourceFile.pdf';
var localTargetFile = '/tmp/targetFile.png';
var writeStream = fs.createWriteStream(localSourceFile);
writeStream.write(body);
writeStream.end();
writeStream.on('error', function (err) {
console.log("Error writing data from s3 to tmp folder.");
context.fail(err);
});
writeStream.on('finish', function() {
var cmd = 'convert ' + localSourceFile + ' ' + localTargetFile;
exec(cmd, function (err, stdout, stderr) {
if (err) {
console.log("Error executing convert command.");
context.fail(err);
}
if (stderr) {
console.log("Command executed successfully but returned error.");
context.fail(stderr);
}else{
//file converted successfully - do something...
}
});
});
あなたの 'lambda'コードを追加できますか? – johni
@johni多くのコードがありますが、私は関連する部分をコピーしました。あなたが何か他のものが必要な場合は教えてください。お返事ありがとうございます。 –