1. 程式人生 > >通過iText將html轉換成pdf中文亂碼問題

通過iText將html轉換成pdf中文亂碼問題

這個問題今天除錯了5、6小時,真是極度鬱悶,不過最終通過除錯iText原始碼以及查資料還是搞定。首先參考我搜到到的一點關鍵資訊:

 這是由編碼問題引起的。XML標準規定,XML分析器必須支援“UTF-8”和“UTF-16”編碼,而且必須能夠自動區分這兩種編碼的檔案,對於其他編碼(包括常用的中文編碼“GB2312”或“BIG5”)並不要求支援。如果XML檔案中包含編碼宣告,分析器則按照宣告的編碼進行處理,否則就按照識別結果進行處理(識別的結果總是“UTF-8”和“UTF-16”中的一種)。因此,如果XML檔案的編碼在這兩種之外,你必須在XML檔案前加上編碼宣告,如:<?xml version="1.0" encoding="gb2312"?>就表示XML檔案的編碼是“gb2312”。   

    現有的XML分析器大多不支援中文編碼“GB2312”或“BIG5”,因此無法讀取包含中文的XML檔案。你可以使用支援中文編碼的分析器,如MSXML,IBMJAVA4C,IBMJAVA4J等進行XML分析。你也可以用內碼轉換工具,將編碼轉換為“UTF-8”或“UTF-16”後進行解析,然後將解析結果轉換回原來的編碼。

1、關於字型的支援

自己寫一個類,覆蓋iText自帶的htmparser,供自己呼叫,裡面加入了對預設中文字型的支援

import java.io.IOException;
import java.io.InputStream;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.lowagie.text.DocListener;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.html.HtmlParser;
import com.lowagie.text.html.SAXmyHtmlHandler;
import com.lowagie.text.pdf.BaseFont;

public class ITextSurportHtmlParser extends HtmlParser {
    public ITextSurportHtmlParser(){
        super();
    }
   
    public void goGB(DocListener document, InputStream is) {
        try {
            BaseFont bfComic = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

            parser.parse(new InputSource(is), new SAXmyHtmlHandler(document, bfComic));
        }
        catch(Exception e) {
            e.printStackTrace(System.out);
        }
 
    }
}

2、參考程式碼

String htmText = cfo.getOutputText();      
                htmText = new String(htmText.getBytes("gb2312"), "ISO8859_1");
                StringBufferInputStream sbis = new StringBufferInputStream(htmText);
                Document doc = new Document(PageSize.A4, 80, 50, 30, 65);              
                PdfWriter.getInstance(doc, res.getOutputStream()); 
                ITextSurportHtmlParser p = new ITextSurportHtmlParser();               
                p.goGB(doc, sbis);
                return null;           

關鍵是將html檔案先轉換成unicode,然後交給sax解析即可