4

我正在尝试在 Java Web 应用程序中使用 iText(版本 5.4.0)创建 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)

书中或谷歌搜索都没有提到这个问题。

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

4

2 回答 2

3

正如您可能从两个 Michaels 的答案中了解到的那样,您错误地假设标准 Type 1 字体 Times Roman 和IDENTITY_H兼容。如果要使用,则必须更改字体,如果IDENTITY_H要使用标准 Type 1 字体,则必须更改编码(在这种情况下,使用BaseFont.EMBEDDED没有意义,因为从不嵌入标准 Type 1 字体)。如果我没有在我的书中提到这一点,我很抱歉。我认为这有点微不足道。可以从我写的关于复合字体的文章中推断出来。

于 2013-03-26T15:17:41.273 回答
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 的东西一样,这没有很好的文档记录,并且使简单的东西变得不必要地困难。

于 2013-11-28T04:59:39.383 回答