[問題]wkhtmltopdf轉換網頁中文亂碼問題解決方案

   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)

114945788.png

115026792.png

    能夠看出中文正常的。

   測試二(51cto博客網頁的charset=gb2312):

121406150.png

121344910.png

    能夠看出,網頁內容編碼格式爲:gb2312的中文無法顯示。

   測試三:

   查看網頁中使用到的字體:

115506377.png

   經過與本地計算機的字體對比,排除了這一可能。其實,轉換後的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是給瀏覽器看的,因此就這麼用了。

   141641703.png

   上述的測試仍是失敗的。!!!

   在官方的指南中說明能夠指定編碼格式:--encoding 編碼格式  ;通過測試是不行的,這樣的問題網上有好多人遇到,也有好多人沒有遇到,卻把網頁很正常的轉成功了,多數是編碼上使用UTF-8巧合而已。

   測試五:

   將抓取下來的網頁文件進行處理:

   1.文件編碼utf-8;charset=utf-8; 結果:中文正常

   2.文件編碼utf-8;charset=gb2312; 結果:中文正常

   3.文件編碼Ansi; charset=gb2312 ; 結果:中文亂碼


   143636840.png


    實驗作到這,能夠看出問題所在,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開發編碼問題一直依賴就像頭皮屑同樣困擾人們,團隊開發關於文件編碼格式作到統一,受益是無窮的!

相關文章
相關標籤/搜索