Imagemagick可以';当从Javaservlet执行时,不能打开文件

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

我正在尝试使用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。

一些东西:

  • 当生成除非常琐碎的进程以外的任何进程时,通常使用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脚本(一些用户也会开始抱怨可能的安全问题)。可能重复