2013-03-12 79 views
2

我正在使用wkhtmltopdf转换器将html文件转换为pdf。它工作正常,但输出不适合pdf中的页面。使用--zoom 2可以修复命令行中的问题,但是在我的代码中使用相同的内容不会做任何事情。下面是我的代码。无法获取wkhtmltopdf属性以在java代码中使用

String wkhtmltopdf = "C:/Program Files (x86)/wkhtmltopdf/wkhtmltopdf.exe "; 
String switches = " --zoom 2 "; 

ProcessBuilder pb = new ProcessBuilder(wkhtmltopdf, switches, f.getAbsolutePath(), pdfFileName); 

Process process = pb.start(); 

在命令行中,这工作得很好。

C:\Program Files (x86)\wkhtmltopdf>wkhtmltopdf.exe --zoom 2 C:\Users\D 
esktop\eclipse-jee-indigo-SR2-win32-x86_64\eclipse\temphtml1.htm C:\Users\Desktop\temp\test.pdf 
Loading pages (1/6) 
Counting pages (2/6) 
Resolving links (4/6) 
Loading headers and footers (5/6) 
Printing pages (6/6) 
Done 

有人能让我知道我在做什么错吗?

+0

当我有类似的问题,通过更换

ProcessBuilder pb = new ProcessBuilder(wkhtmltopdf, switches, f.getAbsolutePath(), pdfFileName); 

“禁用智能收缩”为我做了诀窍。您可能必须将所有'margin- *'设置为'0'。 – 2013-03-12 15:41:13

+0

我得到未知的长参数 - zoom 1.5 --margin-right 0 --margin-top 0 --margin-bottom 0 --margin-left 0.为什么它在命令行中不在我的代码中工作? – user1372871 2013-03-12 16:04:18

+0

禁用智能收缩不工作,缩放。但不是在我的代码。我猜测它与参数如何传递给processbuilder有关。有什么想法吗? – user1372871 2013-03-12 16:34:09

回答

2

使用运行时代替processBuilder修复它。我仍然不知道为什么“--zoom 2”不是processBuilder中的参数。但是,以下是工作代码。

运行时rt = Runtime.getRuntime(); 进程p = rt.exec(“C:/ Program Files(x86)/wkhtmltopdf/wkhtmltopdf.exe --zoom 2”+ temphtmlfile.getAbsolutePath()+“”+ filePdf.getAbsolutePath());

3

ProcessBuilder on OSX所述,您需要将每个参数组作为单独的字符串传递。因此,不是传递“--zoom 2”,而是传递[“--zoom”,“2”]。我只是想到了这一点。

+0

感谢您分享的技巧,顺便说一句,更好的是,传递参数作为数组或像一个长字符串接受答案? – 2015-10-19 10:13:19

+0

我的看法是,写出一个字符串是sl because的,因为它是多么不可变和容易出错(和难以辨认)。 – Nielsvh 2015-10-20 18:39:53

+0

这对我来说也很完美。好的提示! – 2015-11-12 21:21:48

0

我有与参数--cookie <name> <value>相同的问题,我想通过使用ProcessBuilder我必须传递3个分隔的字符串值--cookie, <name>, <value>

你将不得不通过

ProcessBuilder pb = new ProcessBuilder(wkhtmltopdf, "--zoom", "2", f.getAbsolutePath(), pdfFileName); 

注意的ProcessBuilder有更方便的构造,可以采取一个List<String>