2013-05-10 45 views
5

như vậy tôi cần phải chuyển đổi một tập tin fodt để pdf. Sau nhiều ngày lãng phí cố gắng sử dụng nhiều bộ chuyển đổi, tôi nhận ra rằng việc sử dụng libreoffice có thể làm được điều đó.java.io.IOException: Không thể chạy chương trình "...": java.io.IOException: lỗi = 2, Không có tập tin hoặc thư mục

/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 

Nhưng những gì hoạt động hoàn hảo từ dòng lệnh không làm việc trong 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 

Tôi đi theo nhiều howtos và cách tiếp cận khác nhau nhưng kết quả là luôn luôn giống nhau.

Lệnh:

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

tôi đã cố gắng tất cả trong một String và tách thành String [] quá. Trong trường hợp cuối cùng nó than phiền về các tham số:

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 

Dưới đây là một mẫu của các bài kiểm tra cuối cùng

 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

Lỗi này là điển hình khi tập tin hoặc thư mục bạn cố gắng để di chuyển ou làm điều gì đó không tồn tại. Lệnh của bạn, có thể là đúng, nhưng, tệp hoặc đường dẫn của bạn không đến phía bên kia (đường dẫn, ví dụ). –

Trả lời

1

Hãy thử điều này (giữ cho nó đơn giản) ...

Process p = Runtime.getRuntime().exec("/usr/bin/libreoffice --headless --convert-to pdf:'writer_pdf_Export' --outdir "+ getDestinationDirectory(order)+" "+getInvoiceFilename()+".fodt"); 

đầy đủ ...

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

Đây là một trong những thử nghiệm đầu tiên được thực hiện: * không có lỗi, không có outpu và hầu hết tất cả ... không có pdf * – Azathoth

+0

Nó hoạt động từ dòng lệnh? Tôi tìm thấy https://bugs.freedesktop.org/show_bug.cgi?id=44486 – xagyg

+0

Bạn có gặp lỗi tương tự khi bạn đọc cả quá trình 'InputStream' và quá trình' ErrorStream'? Xem 'getInputStream' và' getErrorStream'. – xagyg

4

Thay vì

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

thử tách mỗi argv vào nó gọi điện để thêm

command.add("--convert-to"); 
command.add("pdf:writer_pdf_Export"); 

command.add("--outdir"); 
command.add(getDestinationDirectory(order).toString()); 

command.add(getInvoiceFilename() + ".fodt"); 

Lưu ý rằng không có dấu nháy đơn nào xung quanh "writer_pdf_Export" vì đó là các ký tự meta shell và không bắt buộc khi bạn đang xây dựng một mảng để chuyển đến exec mà không có trình bao trung gian.

+0

cũng đã thử: * Tùy chọn không xác định: --convert-to pdf: 'writer_pdf_Export' * – Azathoth

+1

@Azathoth, loại bỏ các dấu nháy đơn của bạn. Đó là các ký tự meta shell không nên được thực thi bởi libreoffice. –

+0

thực hiện: * Tùy chọn không xác định: --convert-to pdf: writer_pdf_Export * – Azathoth

0

Tôi đã thử tất cả các giải pháp được đề xuất trong chủ đề này và nó không hoạt động.

Trong ứng dụng của tôi (java webapp sử dụng TOMCAT trong linux), nó chỉ hoạt động để tạo tập lệnh shell và thực thi tập lệnh. Nhưng bạn phải đặt đường dẫn tuyệt đối trong kịch bản, nếu không, nó không hoạt động ($ HOME không hoạt động). Bên cạnh đó, bạn có thể vượt qua nó đối số.

Ví dụ:

Runtime.getRuntime().exec("/home/user/myscript.sh param1"); 
Các vấn đề liên quan