在 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 所需的全部内容吗?
最佳答案
为了回答我自己的问题 - 这是部分答案 - 我认为问题在于将字体从我的 mac 转换为 linux box。我不清楚这是为什么,但我在 linux box 上尝试了相同的代码以及我从网上下载的其他随机字体并且它工作正常,只是这种字体让我很难受。 不需要在盒子上实际安装字体。如果像我一样将字体文件交给 java 程序,这就是它所需要的。
真正让我烦恼的是,我希望 Java 是自包含的,并且在主机 x 上运行并提供所有资源的 java 程序应该在主机 y 上以相同的方式运行,当将相同的资源交给它时。我想对 linux box 有一个隐藏的依赖关系,我不清楚。
谁能提供更好的答案?
关于java - 在 Linux 上找不到字体名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550312/