windows下有的时候自定义的字体,jvm无法找到 ,但是我是安装到了windows上了,输出的jar报也是添加到系统依赖了,为啥还是报错,有人说修改jasper的默认配置文件,然后重新打包,这样会导致一些错误,而且很是麻烦,我们可以自己在java代码中手动注册字体,具体步骤如下
1、一个完整的字体包(你自己的)
2、双击安装
他会在windows的 C:\Windows\Fonts 生成该字体,代表已经在windows安装上了
3、ireport中使用该字体
工具->选项->font->install font 选择那你的font所在位置 ->然后点击下一步,后面不用管,默认就可以了
4、导出jar包
上面安装了之后再ireport的字体下拉框中并没有该字体(xdsyy),我们需要进行一下操作才行!
然后就可以导出jar包到指定的位置,比如我的导出到桌面就是这样的
5、在ireport的环境中导入jar包支持,就可以得到相应字体了
这个时下拉框中就有 xdsyy 我们自定义的字体了
6、在java项目中报错
Font 'xx字体' is not available to the JVM. See the Javadoc for more details.
好像是说jvm认不到该字体,在windows环境下已经安装了该字体支持,不应该认不到才对,但是好像这个字体是我们自定义的
ireport是有个jar包默认是有字体,那些字体已经注册到jvm,我们自定义的却没有注册,所以有两种方式注册,其中网上盛行的一种是修改配置文件 xxxx.properties 然后是忽略错误,这种方式不太可靠
然后后来查资料可以通过java代码来注册:
在调用打印操作的时候先注册,注册代码如下:
BufferedInputStream inputStream = FileUtil.getInputStream(new File("C:\\Users\\Lenovo\\Desktop\\电子签名\\xdsyy.ttf"));
Font font = null;
try {font = Font.createFont(Font.TRUETYPE_FONT, inputStream);
} catch (FontFormatException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}
font = font.deriveFont(Font.PLAIN, 20);
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
但是放在本地磁盘上并不是一个好的方法,不可能让每个客户端都去安装一个ttf文件显然是不现实的,我们可以把它放到网络地址通过流的方式读取、
具体的操作如下,这是读取流的方式,后续操作参考上面的代码!
String ttfUrl="http://www.xxx.com/font/xdsyy.ttf"
InputStream inputStream = new URL(ttfUrl).openStream();
然后就不会报上面所说的错误了!
补充:由于你的环境是部署到liunx里面的,有可能是按照上面的操作依然报如图所示的问题,这个时候你需要在你后端的报表微服务里面继续调用上面的方法、