2013-03-22 134 views
1

我想在java web应用程序中使用iText(版本5.4.0)创建pdf文档,并且遇到了字体问题。itext字体UnsupportedCharsetException

Web应用程序是多语言的,因此用户可以用各种语言(例如英语,法语,立陶宛语,中文,日语,阿拉伯语等)将信息保存到系统中。

当我尝试配置pdf输出一些日文文本样本时,它没有显示出来,所以我开始在官方的“iText in Action”书中遵循这些例子。我所遇到的问题是,当我尝试并配置BaseFont.IDENTITY_H编码的字体我得到以下错误:在书中

java.nio.charset.UnsupportedCharsetException: Identity-H 
    at java.nio.charset.Charset.forName(Charset.java:505) 
    at com.itextpdf.text.pdf.PdfEncodings.convertToBytes(PdfEncodings.java:186) 
    at com.itextpdf.text.pdf.Type1Font.<init>(Type1Font.java:276) 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:692) 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:615) 
    at com.itextpdf.text.pdf.BaseFont.createFont(BaseFont.java:450) 

Nothing或谷歌搜索中提到这个问题。

对我可能错过了什么有任何建议?

+0

你使用* .afm fornts或* .ttf吗? – mkl 2013-03-24 22:24:43

+0

到目前为止,我刚刚指定了时间roman: BaseFont baseFont = BaseFont.createFont(BaseFont.TIMES_ROMAN,“UTF-8”,/*BaseFont.IDENTITY_H,*/ BaseFont.EMBEDDED); – 2013-03-25 09:43:21

+0

是不是罗马标准的14种字体之一?身份编码仅对嵌入字体有意义。 – mkl 2013-03-25 15:19:20

回答

3

正如你可能从两个Michaels的答案中理解的那样,你错误地认为标准Type 1字体Times Roman和IDENTITY_H是兼容的。如果您想使用IDENTITY_H,则必须更改字体,或者如果要使用标准Type 1字体(在这种情况下使用BaseFont.EMBEDDED没有意义,因为标准Type 1字体从未嵌入),请更改编码。如果我没有在我的书中提到这件事,我很抱歉。我认为这是微不足道的。可以从我写的关于复合字体的东西中扣除它。

+0

In最后我改变它只是使用Arial Unicode字体(arialuni.ttf),其中包括对外来字符的支持 – 2014-09-26 07:20:10

0

我不认为有任何编码适用于所有语言,使用字体嵌入。例如,假设选择UTF-8编码,将字体嵌入设置为true将嵌入字体,但不会。

我发现自己不得不这样做,因为我不知道该文本的语言提前:

try { 
    // Try to embed the font. 
    // This doesn't work for type 1 fonts. 
    return FontFactory.getFont(fontFace, BaseFont.IDENTITY_H, 
     true, fontSize, fontStyle, textColor); 
} catch (ExceptionConverter e) { 
    return FontFactory.getFont(fontFace, "UTF-8", true, 
     fontSize, fontStyle, textColor); 
} 

(Exception类可能是不同的,因为我使用的是旧版本的iText - 2.1。)

就像很多iText的东西一样,这个文档记录很糟糕,并且使得这个简单的东西变得不必要的困难。