命令从exec()失败但在终端上工作

时间:2015-04-10 08:04:44

标签: java linux runtime.exec pdftotext

我正在尝试使用Java将pdf转换为txt。我试过Apache PDFBox但是,由于一些奇怪的原因,它没有转换整个文档。出于这个原因,我决定通过执行Runtime.getRuntime()。exec()调用来使用pdftotext。问题是,虽然在我的终端上pdftotext运行完美,但exec()调用给出了错误代码1(有时甚至是99)。 这是电话:

pdftotext "/home/www-data/CANEFS_TEST/Hello/ciao.pdf" "/tmp/ciao.pdf.txt"

这是代码

private static File callPDF2Text(File input,File output){
    assert input.exists();
    assert Utils.getExtension(input).equalsIgnoreCase("pdf");
    assert Utils.getExtension(output).equalsIgnoreCase("txt") : output.getAbsoluteFile().toString();

    Process p=null;

    try {
        System.out.println(String.format(
                PDF2TXT_COMMAND,
                input.getAbsolutePath(),
                output.getAbsolutePath()));
        p=Runtime.getRuntime().exec(String.format(
                PDF2TXT_COMMAND,
                input.getAbsolutePath(),
                output.getAbsolutePath()));
        p.waitFor();
        if (p.exitValue()!=0){
            throw new RuntimeException("exit value for pdftotext is "+p.exitValue());
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    return output;
}

这是PDF2TXT_COMMAND字符串定义:

public static final String PDFTXT_COMMAND="pdftotext \"%s\" \"%s\"";

我知道通常这些错误是由权限设置引起的。所以,这是Hello文件夹中ls -l命令的输出:

ls -l /home/www-data/CANEFS_TEST/Hello/
total 136
-rwxrwxr-- 1 www-data www-data 136041 mar 27 16:31 ciao.pdf

另请注意,创建流程的用户是koldar,它位于www-data组中。 感谢您的时间和耐心!

1 个答案:

答案 0 :(得分:5)

不要使用"在你的格式字符串...这些字符是由shell专门解析的,你不会使用shell来启动命令......

我建议您使用exec(String [])而不是exec(String),这样您就可以分开您的命令的每个参数:

String []command = new String[3];
command[0] = "pdftotext";
command[1] = input.getAbsolutePath();
command[2] = output.getAbsolutePath();
Runtime.getRuntime().exec(command);

那应该有用。如果它没有,那可能是dir访问权限的问题。