1

imagemagick と Java を使用して、ファイルを png から pdf に変換しようとしています。複数のpngを実際に1つのpdfにマージするためにimagemagickコマンドを実行しているときに、すべてがうまく機能しています。コマンド自体は適切に見え、ターミナルで実行すると正常に動作しますが、アプリケーションで imgck がファイルを開けないことを示すエラーが表示されます (ファイルが存在し、フォルダーへのアクセス許可を 777 に設定しているにもかかわらず)。

line: convert: unable to open image `"/Users/mk/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/sch-java/print-1357784001005.png"': No such file or directory @ error/blob.c/OpenBlob/2642.

これは私のコマンドです:

/opt/local/bin/convert "/Users/mk/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/sch-java/print-1357784001005.png" "/Users/mk/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/sch-java/print-1357784001219.png" "/Users/mk/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/sch-java/complete-exportedPanel2013-01-1003:13:17.212.pdf"

そして私のJavaコード:

String filesString = "";

for (String s : pdfs){
    filesString += "\""+ s + "\" ";
}

Process imgkProcess = null;

BufferedReader br = null;
File f1 = new File(pdfs[0]);

//returns true
System.out.println("OE: "+f1.exists());

String cmd = imgkPath+"convert "+ filesString+ " \""+outputPath+outName+"\"";
try {
    imgkProcess = Runtime.getRuntime().exec(cmd);
    InputStream stderr = imgkProcess.getErrorStream();
    InputStreamReader isr = new InputStreamReader(stderr);
    br = new BufferedReader(isr);
} catch (IOException e1) {
    msg = e1.getMessage(); 
}

imgkProcess.waitFor();

while( (line=br.readLine() ) != null){
    System.out.println("line: "+line);
}

コード全体は、フォームからリクエストを取得した後、Java サーブレット コントローラーから実行されます。これを引き起こす可能性のあるアイデアはありますか? 最新の imgck、jdk、および osx 10.7 を使用しています。

4

2 に答える 2

1

いくつかのこと:

  • 本当に単純なプロセス以外のものを生成するときは、通常、Runtime.exec() よりも ProcessBuilder を使用する方が適切です。これにより、はるかに優れた制御が得られます。

  • ProcessBuilder を使用する場合でも、必要なことを実行するシェル スクリプトを作成した方がうまくいくことがよくあります。次に、スクリプトを実行するプロセスを生成します。ProcessBuilder よりもシェル スクリプトの方がより多くの制御が可能です。

  • 生成されたプロセスはシェルではないことに注意してください。たとえば、式を評価したり、シェル変数を展開したりすることはできません。それが必要な場合は、シェル (sh や bash など) を実行する必要があります。さらに良いことに、上記のようにシェルスクリプトを記述します

  • ImageMagick コマンドを実行するだけでよい場合は、ImageMagick への Java インターフェイスである jmagick を使用する方がおそらく簡単です。http://www.jmagick.org/ を参照してください。

  • 実際には、画像を PDF にアセンブルしているので、iText ライブラリー ( http://itextpdf.com ) は、ネイティブ Java コードであり、ネイティブ プロセスを生成する必要がなく、おそらくこの作業に最適なツールです。したがって、はるかに移植性があります。

于 2013-01-10T02:57:28.807 に答える
0

すべての引数をarrayListに追加し、それをString配列にキャストすることで解決しました。

ArrayList<String> cmd = new ArrayList<String>();
cmd.add(imgkPath+"convert");

for (int i=0, l=pdfs.length; i<l; i++){
    cmd.add(pdfs[i]);
}
cmd.add(outputPath+outName);

imgkProcess = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
于 2013-01-10T10:20:14.913 に答える