在Linux上找不到字体名称

时间:2009-10-11 09:55:52

标签: java fonts true-type-fonts

在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,因为没有假设字体预先安装在主机上(我是以编程方式添加它),但我可能错过了一些东西......你能帮忙吗? / p>

日志如下所示:

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所需的全部内容?

5 个答案:

答案 0 :(得分:1)

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

真正让我感到困扰的是,我希望Java是自包含的,并且在主机x上运行的java程序,当相同的资源交给它时,传递给它的所有资源应该在主机y上以相同的方式运行。我想对linux盒子有一个隐藏的依赖,这对我来说并不清楚。

有人能提供更好的答案吗?

答案 1 :(得分:0)

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

如果不是这样,那么该文件可能已损坏。尝试使用其他工具(像kfontview这样的字体安装程序/查看器)打开它。

答案 2 :(得分:0)

我们在谈论哪个版本的Linux?

将Linux包含TTF字体的想法是最新的。

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

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

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

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

答案 3 :(得分:0)

根据放置文件的位置,您需要通过执行

来重建字体缓存
sudo fc-cache -f -v

要让ubuntu确定看到该字体,您可能希望将其放入/usr/share/fonts/truetype/然后重建字体缓存。如果我没记错的话,你也可以将一些字体放入~/.fonts/

答案 4 :(得分:0)

我们的系统管理员已将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 Thu Sep 10 13:42:16 EDT 2015

通过使用yum

安装这些问题我遇到了类似的问题
var folder = "F:\\MyApp\\WebApp\\MyGoogleStorage";

string[] scopes = new string[] {
            Google.Apis.Proximitybeacon.v1beta1.ProximitybeaconService.Scope.UserlocationBeaconRegistry
        };

        ClientSecrets secrets = new ClientSecrets()
        {
            ClientId = CLIENT_ID,
            ClientSecret = CLIENT_SECRET
        };

UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        secrets,
                        scopes,
                        "user",
                        CancellationToken.None,
                        new FileDataStore(folder)).Result;