Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版

windows下有的时候自定义的字体,jvm无法找到 ,但是我是安装到了windows上了,输出的jar报也是添加到系统依赖了,为啥还是报错,有人说修改jasper的默认配置文件,然后重新打包,这样会导致一些错误,而且很是麻烦,我们可以自己在java代码中手动注册字体,具体步骤如下

1、一个完整的字体包(你自己的)

2、双击安装

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第1张图片

他会在windows的 C:\Windows\Fonts 生成该字体,代表已经在windows安装上了

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第2张图片

3、ireport中使用该字体 

工具->选项->font->install font  选择那你的font所在位置 ->然后点击下一步,后面不用管,默认就可以了

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第3张图片

4、导出jar包

上面安装了之后再ireport的字体下拉框中并没有该字体(xdsyy),我们需要进行一下操作才行!

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第4张图片

然后就可以导出jar包到指定的位置,比如我的导出到桌面就是这样的

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第5张图片

5、在ireport的环境中导入jar包支持,就可以得到相应字体了

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第6张图片

这个时下拉框中就有 xdsyy 我们自定义的字体了

Font “xx字体” is not available to the JVM. See the Javadoc for more details. 终极版_第7张图片

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里面的,有可能是按照上面的操作依然报如图所示的问题,这个时候你需要在你后端的报表微服务里面继续调用上面的方法、

你可能感兴趣的:(java,ireport,报表)