我需要从Java执行一个外部程序(使用libreoffice将fodt文件转换为pdf,碰巧),我知道该程序所需的精确命令行:
/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0/ /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt这在命令行中运行得很好。但是它在Java中使用ProcessBuilder不起作用。
java.io.IOException: Cannot run program "/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0 /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt": java.io.IOException: error=2, No such file or directory我尝试了一些不同的方法,但都没有成功。下面是最后一个测试的示例
List<String> command = new ArrayList<String>();
command.add("/usr/bin/libreoffice");
command.add("--headless");
command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt");
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Program terminated!");发布于 2013-05-10 12:53:08
试试这个(保持简单) ..。
Process p = Runtime.getRuntime().exec("/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt");完全..。
Process process = null;
try {
process = Runtime.getRuntime().exec("/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt");
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ex) {
Logger.getLogger(Documents.class.getName()).log(Level.SEVERE, null, ex);
}
br.close();
System.out.println("Program terminated!");发布于 2013-05-10 12:49:44
ProcessBuilder构造函数要求外部程序的每个参数都是独立的(以数组或List of Strings的形式)。你收到的第一条异常信息,
Cannot run program "/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0 /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt"不是抱怨它可以找到一个名为/usr/bin/libreoffice的程序吗?它抱怨说它找不到一个长而奇特的名为"/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir /home/develop/tomcat/mf/ROOT/private/docs/0 /home/develop/tomcat/mf/ROOT/private/docs/0/35_invoice.fodt“的程序,因为您将参数连接到一个String中。
而不是
command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt")例如,将每个参数拆分为自己对List.add的调用
command.add("--convert-to");
command.add("pdf:writer_pdf_Export");
command.add("--outdir");
command.add(getDestinationDirectory(order).toString());
command.add(getInvoiceFilename() + ".fodt");请注意,"writer_pdf_Export“周围没有撇号,因为它们是shell元字符,在构造数组以传递到exec时不需要中介shell。
发布于 2014-02-12 18:24:58
我已经尝试过这个线程中提出的每一个解决方案,但它都不起作用。
在我的应用程序(在linux中使用TOMCAT的java webapp )中,它只用于创建shell脚本并执行脚本。但是您必须将绝对路径放在脚本中,如果没有,它就不能工作($HOME不工作)。此外,你也可以通过它的论点。
示例:
Runtime.getRuntime().exec("/home/user/myscript.sh param1");https://stackoverflow.com/questions/16482601
复制相似问题