当前位置: 首页 > 面试题库 >

从Java中的TTF文件加载一些TrueType字体会导致FontFormatException:找不到字体名称

柳星晖
2023-03-14
问题内容

我正在尝试从系统上的TTF文件创建java.awt.Font实例,但是只有某些字体能够正确加载。下面的代码是我在网上找到的一些测试代码。在我的系统上运行时,它能够成功加载285种字体(例如Arial.ttf),但无法加载83种字体(例如AmericanTypewriter.ttf)。

所有错误均为FontFormatException: Font name not found无内在原因的形式。

java.awt.Font和格式兼容性是否存在已知问题?经过大量Google搜索后,我什么也找不到。

public static void main(String[] args) {
        String rootPath = "/Library/Fonts";

        File root = new File(rootPath);
        if (root.canRead()) {
            String[] fontFiles = root.list();

            Font font = null;
            for (String fontFile : fontFiles) {
                try {
                    System.out.println(fontFile);
                    font = Font.createFont(Font.TRUETYPE_FONT, new File(root + "/" + fontFile));
                    System.out.println(font);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

我的环境是Java 7,OS X Mavericks(10.9.1)。

java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

在这里的任何帮助将不胜感激。


问题答案:

好的,因此经过一番挖掘之后,事实证明,此问题是由于java.awt实现中的错误(功能!)引起的。即,如果字体文件的名称表中不包含姓氏和全名记录,则加载物理TrueType字体将失败。

为了确定问题,我使用GrepCode从OpenJDK的AWT实现中的相关异常向后追溯。一旦发现了名称表问题,我就使用ttx,这是简洁的TrueType元数据编辑器,用于添加Java查找的名称条目。例如:

<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
  American Typewriter
</namerecord>
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
  American Typewriter
</namerecord>

由ttx生成的新TTF文件现在可以由Java打开。好极了!



 类似资料:
  • 问题内容: 有谁知道我如何在libGDX中使用TTF字体?我环顾四周,已经看到有关StbTrueTypeFont的信息,但似乎没有出现在最新版本中。 编辑:我发现StbTrueType字体的东西,jar文件位于扩展目录中。我已将其添加到我的项目中。现在,我只需要弄清楚如何使用它。有什么例子吗? 问题答案: 是的,您绝对需要按照编辑中的说明将jar 添加到项目中。很简单,这就是您将如何使用它的方法…

  • 我在我的资产文件夹中创建了一个名为fonts fyi的文件夹。附言。球员得分仅为0 Edit:sb.setColor和前面的所有内容都在它自己的呈现方法中,但我只是为了简单起见把它放在这里。这篇文章的目的是我不确定如何使用ttf字体类型并在最新版本的libgdx中显示它。

  • 问题内容: 这是我的Resources.class中的一种方法: 我的程序的结构是: 这是不起作用的代码片段: 当我打开PDF时,文本在那里,但是使用了一些字体(我猜是默认字体)。 注意1:我尝试将字体设置为仅短语(p)和仅段落(pa),但这丝毫没有改变输出。 注意2:Resource.loadFont(“ wingding”); try / catch方法没有“捕获”任何错误。 问题答案: 尝试

  • 这是我的密码: 并与, 仍然给出了这个问题: 错误。/src/客户端/资产/字体/黑色。TTF 1:0模块解析失败:意外字符”(1:0)您可能需要一个适当的加载程序来处理此文件类型,目前没有配置加载程序来处理此文件。请参见https://webpack.js.org/concepts#loaders(此二进制文件省略了源代码)@./src/Client/page/Home/Homepage.mod

  • 我有一块帆布。它要求用户从a-Z、a-Z或0-9中绘制一个字符。一旦用户绘制了一个角色(比如a),当前画布对象将保存在画布的arraylist中。另一个空白画布弹出,要求用户绘制B,以此类推。 这些程序运行良好。但是我想创建一个文件,并绘制所有可接受的字符。 我在最后显示的画布下方有一个按钮,单击该按钮时,将从画布的arraylist中提取所有字符,并创建一个文件从中删除。但是怎么做呢?

  • 问题内容: 在我的系统上,我需要注册两个外部字体.TTF文件: 在创建Font()对象之前,我使用以下命令进行记录: 然后创建对象(由于格式不同,我创建了多个Font()): 好的,系统正常工作。问题在于,运行后,.TTF文件会更改大小(分别为83 KB和80 KB),从而: 然后,当我第二次运行系统时,发生以下错误: 如果我将更改后的大小(83 KB和80 KB)的.TTF文件替换为原始文件(7