负载均衡情况下或项目无法加载字体情况下处理

场景:在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使用自定义字体即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oNuoyi

你的鼓励将是我创作的做大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值