用Java(.ttf文件)将字体写入磁盘

时间:2015-09-24 09:23:38

标签: java file file-io fonts true-type-fonts

我正在制作各种安装程序,基本上需要将计算机上已安装字体的字体复制到外部目录。这是我想要的一个例子:

Font f = new Font("Arial Black", Font.PLAIN, 20);
FontWriter.write(f, new File("C:\temp\ariblk.ttf"));

字体被加载到Java程序中,然后作为“ariblk.ttf”写入磁盘,并可以在另一个程序中使用。 注意:我需要这样做,因为这个其他程序无法从系统安装的字体,期间加载。请不要尝试建议解决方法或询问原因。

那么,我怎样才能做到这一点?有什么想法吗?

Java中是否有内置功能或者我可以从某个地方下载?我希望自己不需要自己编写代码,因为我必须阅读ttf文件的结构。

1 个答案:

答案 0 :(得分:0)

想出办法自己做。它不漂亮!

try {
    Font font = new Font("Arial Black", Font.PLAIN, 20);
    File physicalFont = null;
    Method method = font.getClass().getDeclaredMethod("getFont2D");
    method.setAccessible(true);
    String str = method.invoke(font).toString();
    if (str.contains(" fileName=")) {
        str = str.substring(str.indexOf(" fileName=")+10).replace("\r\n", "\n")+"\n";
        str = str.substring(0, str.indexOf("\n"));
        physicalFont = new File(str);
    }
    if (physicalFont==null || !physicalFont.isFile()) {
        System.out.println("not found");
    } else {
        System.out.println("font file: "+ physicalFont.getAbsolutePath());
    }
} catch (Throwable t) {
    t.printStackTrace();
}

基本上,反射用于破解Font类,以便可以访问有关该文件的信息。关于这一点的愚蠢之处在于,这些信息可以在Java 1.6中轻松实现,但是当它们停止使用FontManager时,由于某种原因,它们在Java 1.7中无法访问。非常烦人。

我无法找到另一种方法来做到这一点。我希望黑客未来不会破产!只要目标Java平台是1.7就可以了吗?

编辑:"您可以在2天内接受自己的答案。" StackOverflow真的吗?你仍然这样做?拥有等待期,时间来实现它并让新用户随时接受他们自己的答案,这是非常愚蠢的。我甚至不知道我是否会在2天内记住此帐户的登录信息。这样一个设计糟糕的系统......羞耻。