2013-03-12 66 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>