7

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

これはコマンドラインから完全に機能します。ProcessBuilderただし、次を使用して 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

私はいくつかの異なるアプローチを試みましたが、成功しませんでした。これは最後のテストのサンプルです

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

3 に答える 3

6

コンストラクターでは、外部プログラムの各引数を (配列またはs の形式で)分離ProcessBuilderする必要があります。最初に受け取った例外メッセージは、ListString

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引数を 1 つに連結したため、非常に長くて独特な名前 " " のプログラムが見つからないと不平を言っています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」の前後にアポストロフィがないことに注意してください。これらはシェルのメタ文字でありexec、中間シェルなしで渡す配列を構築する場合には必要ないためです。

于 2013-05-10T12:49:44.920 に答える
1

このスレッドで提案されているすべての解決策を試しましたが、うまくいきません。

私のアプリ (Linux で TOMCAT を使用する Java webapp) では、シェル スクリプトを作成してスクリプトを実行する場合にのみ機能します。ただし、スクリプトに絶対パスを入れる必要があります。そうしないと機能しません ($HOME は機能しません)。さらに、引数を渡すことができます。

例:

Runtime.getRuntime().exec("/home/user/myscript.sh param1");
于 2014-02-12T18:24:58.473 に答える
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!");
于 2013-05-10T12:53:08.797 に答える