我正在尝试使用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。
答案 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()]));