遇到 com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.

在利用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表单写入中文时,如果用默认的表单可能会出现中文不显示的问题,建议将默认生成的删掉,自己手动添加上去,并把字体设置为“宋体”。

 

你可能感兴趣的:(java)