2

Javaプロセスを介してPdfToTextを実行しています。

File pdf = new File( "/path/to/test.pdf" );
File output = new File( "/path/to/output.txt" );

String[] cmd = { "pdftotext",
                 pdf.getPath(), 
                 output.getPath()
               };

ProcessBuilder pb = new ProcessBuilder( cmd );
Process pr = pb.start() ;
int exit = pr.waitFor();

これは問題なく実行されます。

ただし、ここで指定されているエンコードパラメータを追加すると、次のようになります。

String[] cmd = { "pdftotext", 
                 "-enc " + encoding, 
                 pdf.getPath(), 
                 output.getPath()
               };

次に、プロセスがハングします。つまり、実行しているテストは、ループでスタックしているかのように実行されます。

エンコーディングには間違いなく値が含まれており、生成されたコマンドをコピーしてコマンドターミナルに貼り付けると、pdftotextは問題なく実行されます。

誰かが私がこれでどこが間違っているのか指摘できますか?

4

2 に答える 2

2

Try this

String[] cmd = { "pdftotext", 
  "-enc", encoding, 
  pdf.getAbsolutePath(), 
  output.getAbsolutePath()
};

There shouldn't be spaces and paths are system dependent.

于 2012-08-18T16:47:04.643 に答える
2

これが私のために働いているコードです:

 public class ToDelete {
public static void main(String[] args) throws Exception {
    File file = new File("/Users/eugenrabii/Desktop/MyPDF.pdf");
    File output = new File("/Users/eugenrabii/Desktop/Output.txt");
    List<String> commands = new ArrayList<String>();

    commands.add("/opt/local/bin/pdftotext");
    commands.add("-enc");
    commands.add("UTF-8");
    commands.add(file.getPath());
    commands.add(output.getPath());

    ProcessBuilder processBuilder = new ProcessBuilder(commands);
    Process process = processBuilder.start();

    int result = process.waitFor();
    if(result!=0){
        printResult(process.getErrorStream());
    } else {
        printResult(process.getInputStream());
    }
}

private static void printResult(InputStream inputStream) throws IOException {
    byte [] byte_ = new byte[inputStream.available()];
    inputStream.read(byte_);
    System.out.println(new String(byte_));
}
}

入力でこれを試して、どのように動作するかを確認できますか?問題は、プロセスがstderrまたはstdoutに書き込み、そこから読み取っていないためにブロックされる可能性があることです。

于 2012-08-18T18:44:11.407 に答える