2009-10-11 124 views
2

在Java中,我的代碼在OSX上運行良好,但在Linux中運行得並不順利。此代碼加載一個字體文件並使用Font.createFont()。 下面的代碼:在Linux上找不到字體名稱

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上。 被我提取上使用的是Mac實際的TTF文件:

fondu /Library/Fonts/AmericanTypewriter.dfont 

,並搶得產生的AmericanTypewriter.ttf文件,並將其添加到Java資源路徑。因爲沒有假設字體預先安裝在主機上(我以編程方式添加它),但我可能錯過了一些東西......你能幫忙嗎?

日誌看起來是這樣的:

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中的所有需求?

回答

1

若要回答我自己的問題 - 這是一個部分的答案 - 我認爲問題是從我的Mac字體轉換到Linux的盒子。我不清楚這是爲什麼,但我嘗試了與我從網上下載的其他隨機字體一樣的Linux框上的相同代碼,它工作正常,只是這種字體給了我很大的困難。 沒有必要在盒子上實際安裝字體。如果字體文件像我一樣交給java程序,那就是它所需要的。

真正困擾我的是,我期望Java是自包含的,並且一個運行在主機x上的java程序在提交給它的所有資源時應該以相同的方式在主機y上運行。我想有一個隱藏的依賴關係,對我來說是不清楚的Linux機器。

任何人都可以提供更好的答案嗎?

0

americanTypewriterInputStream添加到日誌消息中。也許它是null

如果情況並非如此,那麼該文件可能已損壞。嘗試用其他工具打開它(字體安裝程序/查看器,如kfontview)。

0

我們在談論哪種版本的Linux?

在Linux中添加TTF字體的想法相當新近。

例如,在Ubuntu中,安裝操作系統後,安裝了TTF字體,執行

如果你搜索一些關於「可以做的事AFTER安裝Ubuntu」

我不知道這是否會與Java的工作,如果「美國打字機」將是一個你可能會發現有用的意見通過安裝後步驟提供的TTF字體。

編輯:它可能不是特別相關,但this page討論如何字體但從Emacs的點缺失被「回收」通過全新安裝。

+0

我在服務器 $貓/運行CentOS的等/ redhat的釋放 CentOS版本5.3(決賽) – Ran 2009-10-11 10:18:38

+0

好吧,至少CentOS是一個北美分銷,我想到了歐洲一個可能會忽略它。 – pavium 2009-10-11 10:22:27

0

取決於你把該文件,則需要通過執行

sudo fc-cache -f -v 

重建字體緩存以有Ubuntu的看到字體是肯定的,你可能想要把它變成/usr/share/fonts/truetype/然後重建字體緩存。如果我沒有記錯,你也可以將一些字體放入~/.fonts/

+0

嘗試過......將文件安裝到/ usr/share/fonts/truetype /並運行sudo fc-cache -f -v/usr/share/fonts/truetype /。 沒有骰子:( – Ran 2009-10-11 11:05:01

+0

你有沒有可能會顯示字體列表的任何應用程序?這種方式你可以看到它是否被linux識別,而且,你可能想'cat/var/log/fontconfig。 log' – Atmocreations 2009-10-11 11:37:49

0

我們的系統管理員已經更新Java來 Java版本 「1.6.0_39」 OpenJDK的 運行時環境(IcedTea6 11年1月13日)(RHEL-1.13.11.1.el6_8-x86_64的) OpenJDK的64位服務器VM(建23.25- b01,混合模式)

on Linux版本2.6.32-573.7.1.el6.x86_64([email protected])(gcc版本4.4.7 20120313(Red帽子4.4.7-16)(GCC))#1 SMP Thu Sep 10 13:42:16 EDT 2015

我繞過類似的問題,安裝了這些與yum

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