我正在制作各种安装程序,基本上需要将计算机上已安装字体的字体复制到外部目录。这是我想要的一个例子:
Font f = new Font("Arial Black", Font.PLAIN, 20);
FontWriter.write(f, new File("C:\temp\ariblk.ttf"));
字体被加载到Java程序中,然后作为“ariblk.ttf”写入磁盘,并可以在另一个程序中使用。 注意:我需要这样做,因为这个其他程序无法从系统安装的字体,期间加载。请不要尝试建议解决方法或询问原因。
那么,我怎样才能做到这一点?有什么想法吗?
Java中是否有内置功能或者我可以从某个地方下载?我希望自己不需要自己编写代码,因为我必须阅读ttf文件的结构。
答案 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天内记住此帐户的登录信息。这样一个设计糟糕的系统......羞耻。