我遇到了一个问题,我们有一个应用程序需要在Windows中安装特定的字体,在某些情况下,客户会遗漏它们。
所以决定将它们与应用程序捆绑在一起并安装(如果它们丢失)。 到目前为止,我正在测试runnable jar,其中包含所有必需字体(* .ttf)作为资源并尝试从代码中安装它们
例如,我在检查是否缺少所需的字体:
GraphicsEnvironment gr = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] allSystemFonts = gr.getAvailableFontFamilyNames();
if (!Arrays.asList(allSystemFonts).contains("YourMissingFontName"))
{
System.out.println("Fonts are missing, installing...");
installMissingFonts(getLocalFonts());
}
在函数“getLocalFonts”中我将嵌入式jar资源中的字体作为文件数组
File localFontFolder = new File(
this.getClass().getClassLoader().getResource("Fonts/")
.getFile());
return localFontFolder.listFiles();
使用“installMissingFonts”函数中的“registerFont”在系统中注册它们
for (File file : allFonts) {
try{
Font fontFile = Font.createFont(Font.TRUETYPE_FONT, file);
gr.registerFont(fontFile);
System.out.println("Font [" + fontFile.getFontName() +"] was registred successfully");
}
catch(Exception e)
{
System.out.println("Failed register font from ["+file+"]: "+e);
}
}
在运行时间内完美运行,如果我在注册完成后再打电话检查,它就不会告诉我字体缺少我需要的东西
但是,它不会将它们安装到C:\ Windows \ Fonts文件夹中,并且午餐时间之后将丢弃这些注册的字体。因此,每次运行jar时,它都会安装这些字体,但只能在自己的虚拟空间内实现应用程序。 在Win7上以管理员身份运行它没有帮助,它仍然只在一段时间内正常运行
问题: 如果我需要将字体作为资源嵌入* .ttf文件,如何从Java代码中将缺少的字体安装到系统(C:\ Windows \ Fonts)?
提前谢谢!
答案 0 :(得分:0)
如果您只是将Windows Installer(MSI)与您的应用捆绑在一起,那么不要依赖Java代码来实现这一点。
您可以使用WIX tool set执行此操作。使用WIX创建一个最小的无UI安装程序(MSI文件),只需使用RegisterFonts指令安装字体。或者也是安装该应用程序的完整安装程序。
如果您的Java应用程序具有任何类型的安装程序脚本,则可以让它调用您的MSI文件(Runtime.exec)。否则,将MSI捆绑为资源,就像捆绑字体一样。在您的应用程序第一次运行或检测到字体丢失时,让它执行MSI文件。
理想情况下,您有WIX构建一个完整的安装程序,它可以同时安装字体和Java代码,然后分发MSI(或setup.exe)以便它们启动。