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