场景:在springboot中使用ftl功能完成html转化为图片来实现各种页面动态分享图,但是ftl模板的字体设置不生效,会从项目字体模板中用默认的字体,当小程序或者app的ui有自己设计的字体需求时,则需要加载自己的字体或者特定字体;
在单体项目中可以给字体文件放到服务器中读取,或者docker部署时给字体文件打到镜像中,在负载均衡中,需要各个服务能访问到字体文件中,就比较复杂 ,需要有经验的运维处理
那代码中能处理这个吗,经过各种努力尝试及百度,发现一种方式,原理和docker打镜像一样,给字体文件打到项目可访问的文件中就可以使用自定义的字体了
static {
StringBuilder builder = new StringBuilder();
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("mkdir /usr/share/fonts").waitFor();
runtime.exec("unzip /home/xxx/xxx/xxx.jar").waitFor();
runtime.exec("cp /home/xxx/BOOT-INF/classes/fonts/PingFang-SC-Medium.ttf /usr/share/fonts/").waitFor();
runtime.exec("cp /home/xxx/BOOT-INF/classes/fonts/simsun.ttc /usr/share/fonts/").waitFor();
runtime.exec("mkfontscale /usr/share/fonts").waitFor();
runtime.exec("mkfontdir /usr/share/fonts").waitFor();
runtime.exec("fc-cache -fv /usr/share/fonts").waitFor();
} catch (Exception e) {
log.warn("生成分享图安装字体失败:{}", e.getMessage());
}
}
1、StringBuilder builder = new StringBuilder();:创建一个 StringBuilder 对象,用于构建日志信息。
2、Runtime runtime = Runtime.getRuntime();:获取 Runtime 对象,用于执行系统命令。
3、runtime.exec("mkdir /usr/share/fonts").waitFor();:执行系统命令,创建 /usr/share/fonts 目录。如果该目录已存在,则忽略该命令。waitFor() 方法会使当前线程等待该命令执行完成。
4、runtime.exec("unzip /home/xxx/xxx/xxx.jar").waitFor();:执行系统命令,解压指定路径下的 JAR 文件。waitFor() 方法会使当前线程等待该命令执行完成。
5、runtime.exec("cp /home/xxx/BOOT-INF/classes/fonts/PingFang-SC-Medium.ttf /usr/share/fonts/").waitFor();:执行系统命令,复制指定路径下的 PingFang-SC-Medium.ttf 字体文件到 /usr/share/fonts/ 目录下。waitFor() 方法会使当前线程等待该命令执行完成。
6、runtime.exec("cp /home/xxx/BOOT-INF/classes/fonts/simsun.ttc /usr/share/fonts/").waitFor();:执行系统命令,复制指定路径下的 simsun.ttc 字体文件到 /usr/share/fonts/ 目录下。waitFor() 方法会使当前线程等待该命令执行完成。
7、runtime.exec("mkfontscale /usr/share/fonts").waitFor();:执行系统命令,为 /usr/share/fonts/ 目录下的字体文件创建字体索引文件。waitFor() 方法会使当前线程等待该命令执行完成。
8、runtime.exec("mkfontdir /usr/share/fonts").waitFor();:执行系统命令,为 /usr/share/fonts/ 目录下的字体文件创建字体目录文件。waitFor() 方法会使当前线程等待该命令执行完成。
9、runtime.exec("fc-cache -fv /usr/share/fonts").waitFor();:执行系统命令,刷新系统字体缓存。waitFor() 方法会使当前线程等待该命令执行完成。
10、catch (Exception e) { log.warn("生成分享图安装字体失败:{}", e.getMessage()); }:捕获可能抛出的异常,并记录日志。如果任何一个命令执行失败,会记录警告日志,并继续执行后续的命令。
在ftl中font-family使用自定义字体即可