从Java Servlet执行时,Imagemagick无法打开文件

时间:2013-01-10 02:30:29

标签: java terminal imagemagick exec

我正在尝试使用imagemagick和Java将文件从png转换为pdf。当我执行imagemagick命令实际将多个png合并为一个pdf时,我已经把所有东西都放到了一个地方。命令本身看起来正常,并且它在终端中执行时工作正常,但我的应用程序给我错误显示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 servlet控制器执行整个代码。有什么想法可以导致这个?我正在使用最新的imgck,jdk和osx 10.7。

2 个答案:

答案 0 :(得分:1)

一些事情:

  • 当产生任何但非常简单的过程时,使用ProcessBuilder通常比Runtime.exec()更好 - 它可以让你更好地控制

  • 即使使用ProcessBuilder,编写满足您需要的shell脚本通常也会更好。然后生成一个进程来运行脚本。在shell脚本中,您可以获得比在ProcessBuilder中更多的控制

  • 请记住,生成的进程不是shell。例如,它不能评估表达式或扩展shell变量。如果你需要,那么你必须执行一个shell(比如sh或bash)。更好的是,编写如上所述的shell脚本

  • 如果您只需要执行一些ImageMagick命令,那么jmagick(一个ImageMagick的Java接口)可能会更容易 - 请参阅http://www.jmagick.org/

  • 实际上,由于您正在将图像组合成PDF,因此iText库 - http://itextpdf.com可能是该作业的最佳工具,因为它是本机Java代码,不需要生成本机过程,因此将更加便携。

答案 1 :(得分: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()]));