2016-08-29 210 views
1

私は、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... 
     } 
    }); 
}); 
+0

あなたの 'lambda'コードを追加できますか? – johni

+0

@johni多くのコードがありますが、私は関連する部分をコピーしました。あなたが何か他のものが必要な場合は教えてください。お返事ありがとうございます。 –

答えて

0

そのほぼ確実にバグ、またはGhostscriptの以前のバージョンと、おそらく制限。

多くのPDFプロデューサは、仕様に準拠していないPDFファイルを作成しますが、Adobe Acrobatでは不平を言うことなく開きます。 Ghostscriptはこれをやろうと努力していますが、明らかにAcrobatが許可するものはわからないので、私たちはこの不思議なターゲットを絶えず追いかけています。 (FWIWは正当な仕様外のPDFファイルです)。

古いバージョンでは置き換える以外に何もできません。

はい、Ghostscriptをソースからビルドできますが、nodejsモジュールについてはわかりませんが、なぜそれが関係するのかはわかりません。

PDFファイルをレンダリングする他の多くのアプリケーションがありますが、私が知っている別のものはMuPDFです。もちろん、ImageMagickを使わなくてもGhostscriptを直接使うことができます。もちろん、別のアプリケーションをロードできれば、単にGhostscriptのインストールを置き換えることができます。

+0

ありがとうございます。残念ながら私はGSのインストールを置き換えることはできません。これは特にAWSのことです。コードを実行し、プリインストールされたパッケージのみを使用することができます。 npmモジュールを含む、アプリケーションと共に展開する必要があるすべてのもの。私はおそらく、EC2のインスタンスを作成し、私が必要とするバージョンをインストールすることができますが、それはちょうど私が推測するpdfファイルを変換するためにそれを使用するには過剰です。ソースコードとノードモジュールからビルドすることは、コンパイルされたライブラリを自分のコードで展開して、インストールされたライブラリの代わりに使用できるため、関連性があります。 –

+1

GhostscriptがAGPLライセンスを取得していることに注意してください。 Ghostscriptをアプリケーションに組み込む場合は、ライセンスに従っていることを確認する必要があります。 – KenS

+0

ありがとうございました。私のラムダ機能にGSの特定のバージョンを含める必要がある場合、商用ライセンスを取得することは問題ではありません。 –

2

Ghostscript for Lambdaのコンパイル済みバージョンは、次のリポジトリにあります。 AWS Lambdaのソースコードとしてアップロードするzipファイルにファイルを追加する必要があります。

https://github.com/sina-masnadi/lambda-ghostscript

これは、Ghostscriptの機能を呼び出すためのNPMパッケージです:

https://github.com/sina-masnadi/node-gs

プロジェクトにコンパイルしたGhostscriptファイルをコピーし、NPMパッケージを追加した後、あなたはにexecutablePath('path to ghostscript')機能を使用することができます前に追加したコンパイル済みGhostscriptファイルをパッケージに指定します。

+1

こんにちはシーナ、あなたの答えに感謝します。これは実際には非常に便利ですが、以前私の問題を解決するためにいくつかの回避策を講じました。私はそれを試して、それがどのように動作するかを伝えます。しかし、@KenSは、ターゲットラムダ機能のソースコードがオープンソースでない場合、この種の配布は無料のGhostscriptライセンスに準拠していない可能性があることに注意しています。http://artifex.com/licensing/ –

+0

@ A.Z。ライセンスについてのご意見ありがとうございます!ライセンスを必要としないライブラリを知っていますか? –