Imagemagick可以';当从Javaservlet执行时,不能打开文件
我正在尝试使用imagemagick和Java将文件从png转换为pdf。当我执行imagemagick命令将多个png合并到一个pdf中时,我已经把所有的东西都放到了一个地方。命令本身看起来正常,在终端中执行时工作正常,但我的应用程序给我错误,显示imgck无法打开文件(即使它存在,并且我已将文件夹权限设置为777:Imagemagick可以';当从Javaservlet执行时,不能打开文件,java,terminal,imagemagick,exec,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/or
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。一些东西:
- 当生成除非常琐碎的进程以外的任何进程时,通常使用ProcessBuilder比使用Runtime.exec()更好—它提供了更好的控制
- 即使使用ProcessBuilder,编写一个满足您需要的shell脚本通常效果更好。然后生成一个进程来运行该脚本。与ProcessBuilder相比,在shell脚本中可以获得更多的控制
- 请记住,派生的进程不是shell。例如,它不能计算表达式或扩展shell变量。如果需要,则必须执行shell(如sh或bash)。更好的是,按照上述说明编写shell脚本
- 如果您只需要执行一些ImageMagick命令,那么使用ImageMagick的Java接口jmagick可能会更容易—请参阅
- 实际上,由于您正在将图像组装成PDF,因此iText库可能是这项工作的最佳工具,因为它是本机Java代码,不需要生成本机进程,因此更具可移植性
- 通过将所有参数添加到arrayList中,然后将其强制转换为字符串数组来解决此问题
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()]));
ArrayList cmd=new ArrayList();
cmd.add(imgkPath+“转换”);
对于(int i=0,l=pdfs.length;我现在无法真正更改该工具,因为我正在从php和c#重写脚本,而且它必须在所有地方使用相同的技术。而且因为它必须在不同的操作系统上工作,所以我不能使用shell脚本(一些用户也会开始抱怨可能的安全问题)。可能重复