【问题标题】:Font name not found on Linux在 Linux 上找不到字体名称
【发布时间】:2009-10-11 09:55:52
【问题描述】:

在 Java 中,我有在 OSX 上运行良好但在 linux 上运行良好的代码。此代码加载字体文件并使用 Font.createFont()。 代码如下:

log.debug("Loading ttf file AmericanTypewriter.ttf");
InputStream americanTypewriterInputStream = MyClass.class.getClassLoader().getResourceAsStream("AmericanTypewriter.ttf");
log.debug("File AmericanTypewriter.ttf loaded");
Font americanTypewriter = Font.createFont(Font.TRUETYPE_FONT, americanTypewriterInputStream);
log.debug("Font created");
americanTypewriter = americanTypewriter.deriveFont(16f); // Font size 16
log.debug("Font sized at 16");

如前所述,这在 OSX 上运行良好,但在 linux 上失败。 实际的 ttf 文件是我在 mac 上使用的:

fondu /Library/Fonts/AmericanTypewriter.dfont 

并获取生成的 AmericanTypewriter.ttf 文件并将其添加到 java 资源路径。

我希望这也能在 linux 上工作,因为没有假设该字体已预先安装在主机上(我正在以编程方式添加它),但我可能错过了一些东西......你能帮忙吗?

日志如下所示:

11:30:59,418 DEBUG MyClass:167 - Loading ttf file AmericanTypewriter.ttf
11:30:59,419 DEBUG MyClass:167 - File AmericanTypewriter.ttf loaded
java.awt.FontFormatException: Font name not found
  at sun.font.TrueTypeFont.init(TrueTypeFont.java:437)
  at sun.font.TrueTypeFont.<init>(TrueTypeFont.java:154)
  at sun.font.FontManager.createFont2D(FontManager.java:1476)
  at java.awt.Font.<init>(Font.java:454)
  at java.awt.Font.createFont(Font.java:761)
  ...

编辑: 这里一定有我遗漏的东西。通过告诉 Java “看,这是 ttf 文件,其中包含您需要的所有信息”,这是否意味着它是独立于平台的,安装什么字体以及安装在哪里并不重要? ttf 文件中是否没有 java 需要的所有内容?

【问题讨论】:

    标签: java fonts truetype


    【解决方案1】:

    为了回答我自己的问题 - 这是部分答案 - 我认为问题在于将字体从我的 mac 转换为 linux 机器。我不清楚为什么会这样,但是我在 linux 机器上尝试了相同的代码,以及我从网上下载的其他随机字体,它工作正常,只是这种字体让我很难过。 无需在盒子上实际安装字体。如果像我一样将字体文件交给 java 程序,这就是它所需要的。

    真正困扰我的是,我希望 Java 是自包含的,并且在主机 x 上运行的 Java 程序在将相同资源交给它时应该在主机 y 上以相同的方式运行。我想对 linux 盒子有一个隐藏的依赖关系,我不清楚。

    谁能提供更好的答案?

    【讨论】:

      【解决方案2】:

      americanTypewriterInputStream 添加到日志消息中。也许是null

      如果不是这种情况,则文件可能已损坏。尝试使用其他工具(如kfontview 之类的字体安装程序/查看器)打开它。

      【讨论】:

        【解决方案3】:

        我们讨论的是哪个版本的 Linux?

        在 Linux 中包含 TTF 字体的想法是最近才出现的。

        例如,在 Ubuntu 中,TTF 字体的安装是在安装操作系统之后完成的。

        如果您搜索有关“安装 Ubuntu 后要做的事情”的内容,您可能会找到有用的建议

        我不确定这是否适用于 Java,以及“American Typewriter”是否是安装后步骤提供的 TTF 字体之一。

        编辑:它可能不是特别相关,但this page 讨论了从 Emacs 的角度来看丢失的字体是如何通过全新安装“恢复”的。

        【讨论】:

        • 我在服务器上运行一个centos $ cat /etc/redhat-release CentOS release 5.3 (Final)
        • 好吧,至少 Centos 是北美发行版,我认为欧洲发行版可能会忽略它。
        【解决方案4】:

        根据您放置文件的位置,您需要通过执行来重建字体缓存

        sudo fc-cache -f -v
        

        为了让 ubuntu 确实看到字体,你可能想把它放到/usr/share/fonts/truetype/ 然后重建字体缓存。如果我没记错的话,你也可以将一些字体放入~/.fonts/

        【讨论】:

        • 试过这个...将文件安装到 /usr/share/fonts/truetype/ 并运行 sudo fc-cache -f -v /usr/share/fonts/truetype/。没有骰子:(
        • 您有任何可以显示字体列表的应用程序吗?这样你就可以看到它是否被 linux 识别了。另外,您可能想cat /var/log/fontconfig.log
        【解决方案5】:

        我们的系统管理员已将 java 更新为 java版本“1.6.0_39” OpenJDK 运行时环境 (IcedTea6 1.13.11) (rhel-1.13.11.1.el6_8-x86_64) OpenJDK 64 位服务器 VM(内部版本 23.25-b01,混合模式)

        开启 Linux 版本 2.6.32-573.7.1.el6.x86_64 (mockbuild@x86-031.build.eng.bos.redhat.com) (gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) ) #1 SMP 2015 年 9 月 10 日星期四 13:42:16 EDT

        我通过 yum 安装这些解决了类似的问题

        dejagnu.noarch                                         
        dejavu-sans-mono-fonts.noarch                          
        dejavu-serif-fonts.noarch                              
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-21
          • 2012-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-21
          • 1970-01-01
          相关资源
          最近更新 更多