Java引用外部字体(路径引用)的一些坑
一 原因
后端负责字体...哎,我们公司的前端真的任性啊...
然后,一路踩了jvm关于字体的坑,重点是,java的报错很随意,甚至不报错,建议直接看最后面.
二 代码
正常要windows装一次字体,linux装一次字体,这样的话系统就能直接拿到了。
但是这样一点都不兼容,加个字体,还要装个两次,反程序员啊。(后面你会发现更加反程序员)
那么,只能把字体放到哦静态文件里面,然后引用外部字体了。
private static Font definedFont;
private static final String basePath = System.getProperty("user.dir") + File.separator + "web" + File.separator + "src" + File.separator + "main" + File.separator + "resources"
+ File.separator + "static" + File.separator + "backToSchool";
/**
* 引用外部字体
*/
public static void setFont() {
String fontUrl = basePath + File.separator + "fonts" + File.separator + "SourceHanSans-Bold.ttf";
logger.info(".setFont.fontUrl={}", fontUrl);
try {
Font font = Font.createFont(Font.TRUETYPE_FONT, new File(fontUrl));
//设置字体大小,float型
setDefinedFont(font.deriveFont(FONT_SIZE));
} catch (Exception e) {
logger.error(".setFont.e={}", e.getMessage(), e);
throw new ActivityBusinessException(BtsErrorCode.SET_FONT_ERROR);
}
}
public static Font getDefinedFont() {
return definedFont;
} public static void setDefinedFont(Font font) {
definedFont = font;
}
三 坑
其实代码很简单,难点在于字体文件。
坑一
一开始,需求给的otf字体我在开发机和测试机(windows/linux)都安装了,然后一跑,正常,美滋滋。
但是这样一点都不程序员,我还要在正式环境装一次字体,特傻。
于是,只能引用外部字体。
坑二
前头说了,是otf文件,用正确的代码跑一下,很好一个报错都没有!(此处应有掌声!)
但是,就是不显示字体,甚至不用默认字体,什么都没有输出,我心想,java竟然没有报错????
好吧百度,1个小时之后。
嗯,我只能说这个引用外部的otf在百度上,根本没有任何解决方法。
甚至问这个问题的人,答案也是叫我们在操作系统安装,本地引用。
然后,谷歌,stackflow。
大神直接fxxk了一下java的awt,大意就是java说支持引用otf,但是,不支持外部引用otf,最后说了一句awt写的就是一坨翔。
小数几个直接爆粗口的答案啊,感觉这哥们也和我那样浪费一大堆时间,在这傻逼问题上。
于是,只能叫需求给ttf格式的字体。
坑三
很好使用ttf外部引用,谢天谢地,终于报错了。
FONT NAME ERROR xxxxxx
什么?字体名字不正确的?
大哥,我是根据路径引用的哦,不是根据字体名字去系统那里取的哦?
是的,这个就是我说的java的报错很随意。
那么只能排除了,用个系统的内部字体试一下,正常无报错。
我那个纠结啊,也就是说外部引用,路径引用代码没错,而且看了源码,外部引用也就是路径引用。
也就是说需求给的ttf有问题,反映一下问题,需求说你想要怎样的ttf呢?
鬼子知道啊?我也想知道啊!
于是,我只能装个设计字体的软件来找一下,两个ttf文件的不同!
坑四
设计字体的软件怎么操作,我不想说,太反程序员了,我担心说出来,会害了你们。
说个大致思路。
用windows打开后,会发现正常的有个数字签名。
也就是用设计字体的文件加个数字签名就好了!
其实我是倒因为果,再改之前我都不知道有数字签名这玩意
直接把一个正常的ttf的非必要属性,直接覆盖了不正常的ttf的非必要属性。然后,改字体名称什么的,你会发现上图,基本没几个属性一样....(够反程序员了吧?)
至此,功能完全已经实现。
坑五
你们真以为这样就结束了?
我实现了这个功能之后,还要写点字进去,然后居中动态靠右。
但是,这个网页在手机上的,也就是说要搞手机适配!
然后,和前后端的老大说了下,这个需求要实现后端机型适配,获取长宽来写字。
最终,两方大佬逼迫前端学习技术去了,也就是说我搞了这么久,一点用都没有....
四 结论
字体还是给前端做吧...
Java引用外部字体(路径引用)的一些坑的更多相关文章
- 在WPF(core版本)中引用外部字体不可用问题说明
这几天使用WPF写软件,想引用外部字体,于是下载了字体文件: 然后在App.xaml中添加了如下代码: <FontFamily x:Key="Digital-7 Mono"& ...
- CSS在线字体库,外部字体的引用方法@font-face
@font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许 ...
- CSS在线字体库,外部字体的引用方法
目录: 1:CSS家族五大字体 2:360和谷歌外部字体引用方法 3:谷歌外部字体引用方法详解 4:@font-face用法详解 一: {font-family:serif,sans-serif,fa ...
- Android 引用外部字体
在Android中,加载外部字体是非常容易的! 步骤如下: 1. 创建新的Android工程: 2. 在工程下的assets文件夹下新建名字为fonts的文件夹(名字可以任意选取),把所有的外部字体文 ...
- JAVA使用外部字体将文字生成图片,并使用FontMetrics居中文字
需求: 1.用户输入文字,根据外部字体,将文字生成图片 2.输出的文字需要居中在图片中显示 遇到的问题: 1.如何导入外部字体?使用Java的Font类,所有的字体都是系统安装过的 2.每次用户输入的 ...
- 微信小程序引用外部js,引用外部样式,引用公共页面模板
https://blog.csdn.net/smartsmile2012/article/details/83414642 ================小程序引用外部js============= ...
- CSS 引用外部字体
@font-face { font-family: W5; src: url('../font/W5.TTF'); } .wallect .wal_body .textBox{ font-family ...
- Java——自定义外部字体文件
package chapter1; import javax.swing.*;import java.awt.*;import java.io.IOException;import java.io.I ...
- JS 计算时间差,(引入外部字体文件)
JavaScript Date() 对象: new Date() :时间对象,会把当前时间作为其初始值: setFullYear() :用于设置月份,可有三个参数,setFullYear(year,m ...
随机推荐
- telnet IP:ERROR
实验环境:CentOS6.8 主机:172.16.xxx.xxx:80 客户端:172.16.xxx.xxx [root@www ~18:32:27]#telnet 172.16.xxx.xxx 80 ...
- JS判断提交表单不能为空 等的验证
转自:https://blog.csdn.net/qiu512300471/article/details/23259811 <script type="text/javascript ...
- linux日常管理-top动态查看负载
动态查看负载命令,具体哪个程序,哪个进程造成的系统负载. top 回车查看 3秒更新一次 第一行和uptime和w第一行显示的一样. CPU使用率,us sy 内存相关,Mem 一共多少,使用了多少, ...
- shell入门-grep过滤-1
正则表达式,就是一个字符串.有一定的规律.我们用指定的字符串匹配一个指定的行.指定的字符串就是正则表达式. 正则表达式有这几个工具:grep egrep sed awk 命令:gerep 说明:过滤出 ...
- HTTP返回码中301与302的区别
一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved). 302 ...
- VMware里Ubuntu-16.04-desktop的VMware Tools安装图文详解
不多说,直接上干货! 总的来说,根据分为三个步骤. 步骤一: 点击 :虚拟机—–>安装VM tools 然后发现桌面会跳出如下问题: 客户机操作系统已将 CD-ROM 门锁定,并且可能正在使用 ...
- hibernate中的session的获取方法以及区别
获取sesstionFactory的方法: // sessionFactory factory = new AnnotationConfiguration.configure("hibern ...
- Spinner 通过XML形式绑定数据时 无法从String.xml中读取数组
在android应用程序中,通过XML形式给Spinner绑定数据,如果把数组放在系统的string.xml文件里,那么就有可能在运行时无法找到,导致程序异常结束,解决方法是自建一个XML文件来存放数 ...
- Flask15 远程开发环境搭建、安装虚拟机、导入镜像文件、创建开发环境、pycharm和远程开发环境协同工作
1 安装VM虚拟机 待更新... 2 导入镜像文件 待更新... 3 启动虚拟机 4 远程连接虚拟机 4.1 安装xShell软件 待更新... 4.2 创建一个新的连接 4.2.1 在虚拟机中获取虚 ...
- centos6.x禁用ipv6的方法
注意可能有两个网卡的情况,修改当前网卡才有效. cd /etc/sysconfig/network-scripts/ ls ifcfg-Auto_eth0 ifcfg-eth0 现在ipv6没流行,几 ...