Font “xx字體” is not available to the JVM. See the Javadoc for more details. 終極版

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裏面的,有可能是按照上面的操作依然報如圖所示的問題,這個時候你需要在你後端的報表微服務裏面繼續調用上面的方法、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章