从Java应用程序启动进程

时间:2012-06-12 16:15:43

标签: java playframework wkhtmltopdf

我或多或少知道如何做到这一点,但我认为由于经验不足,我被这个命令的复杂性所灼伤。

我正在尝试将一些原始html输入wkhtmltopdf。我可以从命令行执行此操作:

echo "<p>Hello</p>" | wkhtmltopdf - ~/somePdf.pdf

工作正常,但我如何从Java应用程序执行此操作?这是我尝试过的几件事:

String[] cmd = { "echo", html.body(), "|", "wkhtmltopdf", "-", "/home/sam/yourPdf.pdf" };
Runtime.getRuntime().exec(cmd);

OR

Runtime.getRuntime().exec("echo " + html.body() + " | wkhtmltopdf - /home/sam/yourPdf.pdf");

其中任何一个都不会在我的主文件夹中生成文件。

我已经读过wkhtmltopdf将输出到STDERR,但我不确定如何从Eclipse查看它。我被告知它应该在我的控制台视图中可用,但我没有看到任何内容。

感谢任何帮助,谢谢!

修改

接受的答案适用于wkhtmltopdf,但适用于使用Play的其他人!发现此帖子的框架there is a Play! module,它基于scala模板生成PDF。它运作得很好,但是don't forget to set media="print" in your stylesheet:)

2 个答案:

答案 0 :(得分:3)

您无法直接执行此操作,因为您正在运行两个命令并且您创建了一个管道。 Runtime.exec()ProcessBuilder.command()方法都不是为此而制作的。从Java获得类似于此的东西的最简单方法是将所有内容放入shell脚本并使用Runtime.exec()调用该脚本。

编辑: 您也可以跳过shell脚本并调用

Runtime.getRuntime().exec( new String[] { "bash", "-c", "\"echo \"<p>Hello</p>\ | wkhtmltopdf - ~/somePdf.pdf\""} );

除了你编写shell脚本之外,你可能需要稍微调整引号以使其正确。

答案 1 :(得分:1)

您可以尝试这样的方法将错误流输出到控制台:

try{
    Runtime runTime= Runtime.getRuntime();
    Process process= runTime.exec("echo " + html.body() + " | wkhtmltopdf - /home/sam/yourPdf.pdf");

    BufferedReader reader   = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    String line = null;
    while ( (line = reader.readLine()) != null){
        System.err.println(line);
    }
}catch(Exception exe){
    exe.printStackTrace();
}

请注意,这特定于获取打印到错误流的内容。我希望这有助于你开始