我正在尝试使用DynamicJasper生成报告,但是出现了以下错误:
net.sf.jasperreports.engine.util.JRFontNotFoundException:
Font 'Arial' is not available to the JVM.
msttcorefonts已经被安装,但是我猜JVM没有使用它提供的任何字体。
我正在使用Ubuntu 10.04。
我该如何解决这个问题?
我正在尝试使用DynamicJasper生成报告,但是出现了以下错误:
net.sf.jasperreports.engine.util.JRFontNotFoundException:
Font 'Arial' is not available to the JVM.
msttcorefonts已经被安装,但是我猜JVM没有使用它提供的任何字体。
我正在使用Ubuntu 10.04。
我该如何解决这个问题?
我尝试安装 mscorefonts,但是该软件包已经被安装且是最新版本。
sudo apt-get update
sudo apt-get install ttf-mscorefonts-installer
我尝试在文件系统中搜索字体,使用以下命令:
ls /usr/share/fonts/truetype/msttcorefonts/
cat /usr/share/fonts/truetype/msttcorefonts/README
进行此操作需要互联网连接:
sudo apt-get install --reinstall ttf-mscorefonts-installer
我重新安装了ttf-mscorefonts-installer
(如上所示,确保接受 EULA!)问题得到了解决。
JasperReports会在报表模板中使用的字体未作为系统字体或来自JR字体扩展的字体可用于JVM时,抛出一个JRFontNotFoundException异常。这样确保避免由字体度量不匹配引起的所有问题,并让我们提前了解到不一致性。
JasperReports试图帮助您进行报表开发,并指出无法正确导出您的报表,因为找不到在TextField
或StaticText
中定义的字体。
<font fontName="Arial"/>
是的,您可以通过将net.sf.jasperreports.awt.ignore.missing.font设置为true来禁用此功能,但您可能会遇到导出不一致性问题。
是的,您可以将字体作为JVM系统字体进行安装(但您需要在可能生成报告的每台计算机上执行此操作,并且仍然可能存在编码问题)。
使用字体扩展!如果您想创建自己的字体扩展(请参见下面的链接),jasper reports还分发一个默认的字体扩展jar (jasperreports-fonts-x.x.x.jar
),支持fontName DejaVu Sans
、DejaVu Serif
和DejaVu Sans Mono
。
<font fontName="DejaVu Sans"/>
来自JasperReport Ultimate Guide的内容:
我们强烈鼓励人们只使用从字体扩展中获取的字体,因为这是唯一确保在运行时执行报告时应用程序可以使用这些字体的方法。使用系统字体总是存在风险,可能会导致在部署到没有安装那些字体的新机器上时报告无法正常工作。
StackOverflow上有关如何正确呈现PDF字体的链接:
我使用 IReport 安装字体:
工具 -> 选项 -> 字体 -> 点击安装字体
然后选择字体并点击
-> 导出为扩展名为 myfont.jar 的文件
将此 jar 文件和 spring.jar* 添加到您的构建路径中。
*从 Jaspersoft\iReport-3.7.0\ireport\modules\ext 中复制 spring.jar
sudo apt-get install msttcorefonts
可以在Ubuntu开发环境下使用,但并不是一个很好的解决方案。
相反,我们基于这个提示将字体与我们的应用程序捆绑在一起。他们的JAR文件捆绑了以下字体:
下载该jar文件的直接链接:Maven ver 1.0. DynamicFonts
避免这种问题有三种方法。
方法1:通过设置忽略缺失字体属性。
JRProperties.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");
或者您可以通过将以下行输入到.jrxml文件中来设置此属性。
<property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>
方法二:通过设置默认字体属性。
JRProperties.setProperty("net.sf.jasperreports.default.font.name", "Sans Serif");
或者您可以通过在.jrxml文件中输入以下行来设置此属性。
<property name="net.sf.jasperreports.default.font.name" value="Sans Serif"/>
方法3:通过添加缺失的字体属性来解决。
首先,在IReport中安装缺失的字体,选择“工具>>选项>>字体>>安装字体”,然后选择所有字体并通过点击“导出为扩展名为.jar的扩展”来导出。
您可以使用Jasperreports-font.X.X.X.jar的jar文件,该文件将存在于您的项目库或类路径中。
对于CentOS:
wget msttcorefonts
然后:
tar -zxvf msttcorefonts.tar.gz
cp msttcorefonts/*.ttf /usr/share/fonts/TTF/
fc-cache -fv
毕竟,重新启动JVM。
tar -zxvf msttcorefonts.tar.gz
命令后,我遇到了以下错误:
gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
尽管安装成功。 - Eatsam ul haq如果你在你的项目中使用maven,你可以在pom.xml文件中添加jasper-fonts依赖:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.8.1</version>
</dependency>
在系统上安装缺少的字体可能是一种可行的解决方案,但对我来说不是,我不想在每次部署到新服务器时都必须安装缺少的字体,相反我选择将字体嵌入应用程序中。
祝好。
<property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>
添加
non-free contrib
在 /etc/apt/sources.list 中添加 deb 和 deb-src:
deb http://ftp.debian.org/debian/ squeeze main non-free contrib
deb-src http://ftp.debian.org/debian/ squeeze main non-free contrib
那么
apt-get update
apt-get install msttcorefonts
/opt/jasperreports-server-cp-4.5.0/ctlscript.sh restart
更改您的版本/路径。