我正在尝试使用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提及此问题。
有关我可能错过的任何建议吗?
答案 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的东西一样,这个文档记录很少,并且使得这些简单的东西不必要地变得困难。