2013-05-10 347 views
5

我需要将fodt文件转换为pdf。试图使用各种转换器浪费了数天后,我意识到使用libreoffice可以做到这一点。java.io.IOException:无法运行程序“...”:java.io.IOException:error = 2,没有此类文件或目录

/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工作...

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 

我跟很多的HOWTO和不同的方法,但结果都是一样的。

命令

"/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt"); 

我尝试了所有在一个字符串和分裂成的String []过。在后一种情况下它抱怨的参数:

Unknown option: --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 

这里是最后的测试样品

 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!"); 
+1

当文件或目录您尝试移动OU做的东西并不存在此错误是典型的。你的命令很可能是正确的,但是,你的文件或路径没有到达另一端(例如路径)。 – 2013-05-10 12:51:56

回答

1

试试这个(保持简单)...

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!"); 
+0

这是第一次测试:*没有错误,没有输出,最重要的是......没有PDF * – Azathoth 2013-05-10 12:58:58

+0

它从命令行工作?我发现这个https://bugs.freedesktop.org/show_bug.cgi?id=44486 – xagyg 2013-05-10 13:02:50

+0

当你读取进程'InputStream'和进程'ErrorStream'时,你会得到同样的错误吗?请参阅'getInputStream'和'getErrorStream'。 – xagyg 2013-05-10 13:05:49

4

而不是

command.add("--convert-to pdf:'writer_pdf_Export' --outdir " + getDestinationDirectory(order) + " " + getInvoiceFilename() + ".fodt") 

尝试拆分每个ARGV成其自己致电加

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”周围没有撇号,因为这些是外壳元字符,并且当您构建数组传递到exec而没有中介外壳时不需要。

+0

也试过:*未知选项:--convert-to pdf:'writer_pdf_Export'* – Azathoth 2013-05-10 12:54:10

+1

@Azathoth,摆脱你的撇号。这些是libreoffice可执行文件不应该看到的shell元字符。 – 2013-05-10 13:01:04

+0

完成:*未知选项:--convert-to pdf:writer_pdf_Export * – Azathoth 2013-05-10 13:02:24

0

我试图在这个线程建议每个解决方案,这是行不通的。

在我的应用程序(java webapp在Linux中使用TOMCAT)它只能用来创建一个shell脚本并执行脚本。但是你必须在脚本中放置绝对路径,否则它不起作用($ HOME不起作用)。此外,你可以传递它的参数。

例子:

Runtime.getRuntime().exec("/home/user/myscript.sh param1"); 
相关问题