1

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

4

2 回答 2

1

一些东西:

  • 当产生除了真正琐碎的进程之外的任何东西时,通常使用 ProcessBuilder 比使用 Runtime.exec() 更好 - 它可以让您更好地控制

  • 即使使用 ProcessBuilder,编写一个满足您需要的 shell 脚本通常效果更好。然后产生一个进程来运行脚本。与在 ProcessBuilder 中相比,您在 shell 脚本中获得了更多的控制权

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

  • 如果您需要做的只是执行一些 ImageMagick 命令,那么 jmagick(ImageMagick 的 Java 接口)可能会更容易 - 请参阅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 回答