wktmltopdf工具是使用Webkit引擎來將HTML網頁轉換爲PDF文件,關於wkhtmltopdf工具的相關信息能夠參見:css
http://code.google.com/p/wkhtmltopdf/html
http://www.oschina.net/p/wkhtmltopdf/java
我在使用的過程當中遇到有的網頁是中文是亂碼,有的網頁中文是正常顯示的,經過搜索引擎尋找答案的時候,發現還有人遇到中午呢是空白的,沒有顯示。web
在該開源項目的問題解答中有做者給出的一些回覆:瀏覽器
http://code.google.com/p/wkhtmltopdf/issues/detail?id=436&q=gb2312服務器
http://code.google.com/p/wkhtmltopdf/issues/detail?id=782&q=gb2312ide
這些問題主要是基於Linux環境下中文字體沒有安裝所形成的,而我遇到的問題是中文能夠顯示,倒是亂碼,因而關於這個問題我作了幾個方面的測試:工具
1.中文字體問題測試
2.網頁編碼字體
<meta http-equiv="content-type" content="text/html;charset=utf-8">
3.文件編碼
測試一:(百度首頁網頁的charset=utf-8)
能夠看出中文正常的。
測試二(51cto博客網頁的charset=gb2312):
能夠看出,網頁內容編碼格式爲:gb2312的中文無法顯示。
測試三:
查看網頁中使用到的字體:
經過與本地計算機的字體對比,排除了這一可能。其實,轉換後的PDF文件中文可以顯示,雖然是亂碼,也可以排除字體出的問題。
測試四:
因爲考慮到wkhtmltopdf使用到webkit引擎,第二中測試遇到網頁內容編碼格式爲:gb2312的形成中文沒法顯示,因而使用程序將網頁抓取下進行轉化。
@Test public void test2() throws IOException { URL url = new URL("http://aiilive.blog.51cto.com/1925756/1332579"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedInputStream bi = new BufferedInputStream( conn.getInputStream()); BufferedOutputStream bo = new BufferedOutputStream( new FileOutputStream(new File("D:\\1332579.html"))); byte[] bts = new byte[1024]; int len = bi.read(bts); while (len != -1) { bo.write(bts, 0, len); len = bi.read(bts); } bi.close(); bo.close(); System.out.println("create ok"); } }
經過本地轉化,並使網頁內容中的:charset=utf-8,而後進行轉換,這麼作的緣由是既然使用了webkit引擎正好charset=utf-8是給瀏覽器看的,因此就這麼用了。
上述的測試仍是失敗的。!!!
在官方的指南中說明能夠指定編碼格式:--encoding 編碼格式 ;通過測試是不行的,這樣的問題網上有好多人遇到,也有好多人沒有遇到,卻把網頁很正常的轉成功了,多數是編碼上使用UTF-8巧合而已。
測試五:
將抓取下來的網頁文件進行處理:
1.文件編碼utf-8;charset=utf-8; 結果:中文正常
2.文件編碼utf-8;charset=gb2312; 結果:中文正常
3.文件編碼Ansi; charset=gb2312 ; 結果:中文亂碼
實驗作到這,能夠看出問題所在,wkhtmltopdf轉換html文件的時候,這個html文件來源多是一個url,也可能就是本地的一個文本文件,從測試一中百度首頁中文正常顯示和測試二51cto博客中文不可以正常顯示,再從測試五中看出,wkhtmltopdf轉換工做的時候,--encoding參數實際上指的是文件存儲的編碼格式。
因此經過URL從服務器端請求而來的網頁編碼文件格式不能肯定時後,會使用文件內容編碼格式輸出,因此得出chartset=utf8和charset=gb2312經過url請求,中文前者能夠顯示,後者不能。
PS:Jsp頁面編碼解釋:
1.pageEncoding="UTF-8" 是指JSP頁面保存時使用的編碼方式,也就是JSP文件保存在硬盤上所使用的編碼方式
2.charset="UTF-8" 是指JSP頁面輸入輸出使用的編碼方式,不少服務器在沒有找到pageEncoding時,有charset代替pageEncoding。
我在測試咱們自家的網站的時候就沒有遇到wkhtmltopdf中文亂碼問題,咱們的JSP頁面格式和內容輸出編碼格式是統一的,而且都是UTF-8。
PPS:Web開發編碼問題一直依賴就像頭皮屑同樣困擾人們,團隊開發關於文件編碼格式作到統一,受益是無窮的!