我或多或少知道如何做到这一点,但我认为由于经验不足,我被这个命令的复杂性所灼伤。
我正在尝试将一些原始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:)
答案 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();
}
请注意,这特定于获取打印到错误流的内容。我希望这有助于你开始