转载:http://blog.csdn.net/xorong/archive/2007/04/21/1574100.aspx
这是由编码问题引起的。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解析即可
注:适用于 iText_2.1.7 及以下版本,iText 5.0不适用