itext font UnsupportedCharsetException

时间:2013-03-22 14:03:33

标签: java character-encoding fonts itext

我正在尝试使用iText(版本5.4.0)在java Web应用程序中创建pdf文档,我遇到了字体问题。

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)

书中没有任何内容或搜索Google提及此问题。

有关我可能错过的任何建议吗?

2 个答案:

答案 0 :(得分:3)

正如您可能从两个Michaels的答案中理解的那样,您做出了错误的假设,即标准的Type 1字体Times Roman和IDENTITY_H是兼容的。如果要使用IDENTITY_H,则必须更改字体;如果要使用标准的Type 1字体,则必须更改编码(在这种情况下使用BaseFont.EMBEDDED没有意义,因为标准永远不会嵌入类型1字体)。如果我在书中没有提到这一点,我很抱歉。我觉得这有点小事。可以从我写的关于复合字体的内容中扣除它。

答案 1 :(得分:1)

我不认为有任何一种编码适用于所有语言,使用字体嵌入。例如,你假设选择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);
}

(由于我使用的是旧版本的iText - 2.1,因此异常类可能会有所不同。)

与很多iText的东西一样,这个文档记录很少,并且使得这些简单的东西不必要地变得困难。