在Java中渲染字体:java.awt.Font的行为不正确

问题描述:

到目前为止我所遇到的是我能想到Oracle的Java字体渲染库中的“bug”。在某些字体(如PDF文件中嵌入的字体)中,使用了一些不规则的字符代码,并且它们具有与它们相关联的字形。在Java中渲染字体:java.awt.Font的行为不正确

在这种情况下(属于制表符,回车符和换行符的字符代码9,10和13)尝试使用java.awt.Font.createGlyphVector方法获得字形矢量时,不会返回正确的字形,但它适用于其他所有内容。

我跟踪这个问题在Java CMAP的实现,有一个类似的代码:

  char getGlyph(int charCode) { 
      if (charCode < 256) { 
       if (charCode < 0x0010) { 
        switch (charCode) { 
        case 0x0009: 
        case 0x000a: 
        case 0x000d: return CharToGlyphMapper.INVISIBLE_GLYPH_ID; 
        } 
       } 
       return (char)(0xff & cmap[charCode]); 
      } else { 
       return 0; 
      } 
     } 

所以,我的问题是:

  • 实际上是这一个错误?
  • 有谁知道如何解决这个问题?
  • 有没有办法从真正的字体中提取CMAP数据,以便我可以将字符(代码点)映射到字形代码?

我相信你现在已经发现了这个问题,但对于那些未来偶然发现的人,我会推荐sfntly library。这是一个由谷歌免费的Java库,允许您编辑基于sfnt的字体,非常容易使用。如果您以另一种方式解决了您的问题,请通过更新指导我们。谢谢。