在利用iText.jar和iTextAsian.jar生成pdf文件时有时遇到了
Exception in thread "main" com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source)
at timer.TestPdf.getPdf(TestPdf.java:34)
at timer.TestPdf.main(TestPdf.java:21)
这个错误。
经过查看iText-2.1.5.jar中的源码发现了在CJKFont.class中有这样两行代码
InputStream inputstream = getResourceStream("com/lowagie/text/pdf/fonts/cjkfonts.properties");
cjkFonts.load(inputstream);
inputstream.close();
inputstream = getResourceStream("com/lowagie/text/pdf/fonts/cjkencodings.properties");
cjkEncodings.load(inputstream);
inputstream.close();
这是通过iTextAsian.jar中的配置文件来取字符编码的,由于iText.jar版本的不同,目录文件做了改动,例如在iText-5.0.6.jar中变成了下面这样
InputStream is = getResourceStream("com/itextpdf/text/pdf/fonts/cjkfonts.properties");
cjkFonts.load(is);
is.close();
is = getResourceStream("com/itextpdf/text/pdf/fonts/cjkencodings.properties");
cjkEncodings.load(is);
is.close();
所以我们只需要调整iTextAsian.jar的目录结构即可。也可以像我这样为了适应2个版本的iText.jar,我建了2个目录如下。
特别提醒:在向pdf表单写入中文时,如果用默认的表单可能会出现中文不显示的问题,建议将默认生成的删掉,自己手动添加上去,并把字体设置为“宋体”。