在AIX的weblogic9.2上部署报表,导出时报找不到字体的错误,如下:
Font '宋体' is not available to the JVM. See the Javadoc for more details.
net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体' is not available to the JVM. See the Javadoc for more details.
at net.sf.jasperreports.engine.util.JRFontUtil.checkAwtFont(JRFontUtil.java:358)
at net.sf.jasperreports.engine.util.JRStyledText.getAwtAttributedString(JRStyledText.java:226)
at net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:362)
at net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:1129)
at net.sf.jasperreports.engine.fill.JRFillStaticText.prepare(JRFillStaticText.java:183)
at
......
网上有两种解决办法:一是给系统或者jdk安装字体库;二是jasperreport官网的help中给出的解决方案,将字体打jar包放到工程类路径下(http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=66132)
前者以前开发的时候有个同事试过,没问题。考虑以后部署、实施环境的不确定性,我觉得还是后者比较好,不过缺点是增加了程序大小,打war包后大概比原来多5M多。不过对于现代硬件多5M不是问题。
这里主要介绍后者的方法,步骤如下:
1、下载jasperreport(本人用的是3.7.4版本)工程,将demo\fonts\net\sf\jasperreports\fonts\dejavu下的demo字体清除
2、将windows系统下的字体文件SIMSUN.TTC文件(XP在%SYSTEM%\WINDOWS\Fonts下)copy到demo\fonts\net\sf\jasperreports\fonts\dejavu下,并将名称后缀改为ttf。这个要记着改,ttf是AIX下的字体格式,否则不会识别。
3、修改demo\fonts\net\sf\jasperreports\fonts下的fonts.xml,将原来字体配置指定到上步骤copy到dejavu目录下的字体文件,如我的改名后叫songti.ttf,所以改后fonts.xml为以下内容(供参考)
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="宋体">
<normal>net/sf/jasperreports/fonts/dejavu/songti.ttf</normal>
<bold>net/sf/jasperreports/fonts/dejavu/songti.ttf</bold>
<italic>net/sf/jasperreports/fonts/dejavu/songti.ttf</italic>
<boldItalic>net/sf/jasperreports/fonts/dejavu/songti.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'宋体', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'宋体', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
4、将demo\fonts下的内容打成jar包,并放到程序的类路径下。
5、在Web根目录下增加配置文件jasperreports.properties,内容如下
net.sf.jasperreports.awt.ignore.missing.font=true
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
通过以上5个步骤即可解决文章开头的问题。这样在以后实施时,即便系统未安装字体,我们的程序也可以正常运行了。
前者我没再去试,这里列出配置方法(引用自http://www.loveunix.net/thread-100861-1-1.html)
环境aix5.3+jdk1.4+weblogic
jdk目录:/usr/jdk1.4
1、找到window的字体文件simsun.ttc
2、把simsun.ttc拷贝到jre的字体目录${JAVA_HOME}/jre/lib/fonts目录
顺便把文件名也改了,为songti.ttf。
这个名字应该是无所谓的,但是下面的步骤都是从网上看的,使用的都是songti.ttf这个字体文件名。
3.修改JRE的字体配置
3.1 修改fonts.scale文件[${JAVA_HOME}/jre/lib/fonts/fonts.scale]
把一行的数字加1
在文件尾添加
songti.ttf -zhongyi-song-medium-r-normal--0-0-0-0-m-0-gbk-0
3.2 修改fonts.dir文件[${JAVA_HOME}/jre/lib/fonts/fonts.dir]
把一行的数字加4
在文件尾添加
songti.ttf -zhongyi-song-medium-r-normal--0-0-0-0-m-0-gbk-0
3.3 修改font.properties文件[${JAVA_HOME}/jre/lib/font.properties.zh]
将font.properties.zh文件的内容拷贝到font.properties
将下面文件的后缀改为toproperties:
font.properties.zh
font.properties.zh_GB18030
font.properties.zh_TW
font.properties.zh_TW_UTF8
font.properties.zh_UTF8
修改font.properties把下面一行(大概是第21行):
serif.1=-Monotype-TimesNewRomanWT-medium-r-normal--*-%d-75-75-*-*-gb2312.1980-0
替换为:
serif.1=-zhongyi-SimSun-medium-r-normal--0-0-0-0-m-0-gbk-0
增加一行到其它filename.xxxxxx=的后面:
filename.simsun_medium_r=songti.ttf
5、修改startWeblogic.sh,设置LANG环境变量。
执行:locale -a
控制台输出:
# locale -a
C
POSIX
en_US
en_US.8859-15
Zh_CN
Zh_CN.GB18030
ZH_CN
ZH_CN.UTF-8
en_US.ISO8859-1
zh_CN.IBM-eucCN
zh_CN
根据输出设置LANG环境变量:
export LANG=zh_CN.IBM-eucCN
6、重新启动weblogic就可以了.