字体在Jasper Reports中对JVM不可用。

108

我正在尝试使用DynamicJasper生成报告,但是出现了以下错误:

net.sf.jasperreports.engine.util.JRFontNotFoundException:  
                                 Font 'Arial' is not available to the JVM.   

msttcorefonts已经被安装,但是我猜JVM没有使用它提供的任何字体。

我正在使用Ubuntu 10.04。

我该如何解决这个问题?


3
我实际上是在忽略它...只需设置以下内容 "net.sf.jasperreports.awt.ignore.missing.font=true"这是一个不好的想法...但可以解决问题一时... - Andrew
1
你在哪里设置这个?我正在使用嵌入式版本的JasperReports在jbilling中工作,没有jasperreports.properties文件可供编辑。 - Darragh
请参考以下链接:http://stackoverflow.com/questions/19978524/jasper-report-font-error - Jaichander
1
@Andrew,这似乎不是一个好的解决方案(我知道问题很旧),但也许我们最好避免报告的不一致性,我已经传达了答案。 - Petter Friberg
1
jasperreports-fonts-6.8.0 添加这个 jar 包对我有用。 - vdeshan
显示剩余2条评论
20个回答

76

我尝试安装 mscorefonts,但是该软件包已经被安装且是最新版本。

sudo apt-get update
sudo apt-get install ttf-mscorefonts-installer

我尝试在文件系统中搜索字体,使用以下命令:

ls /usr/share/fonts/truetype/msttcorefonts/

这个文件夹里只有README文件,里面包含了正确的安装指南。
cat /usr/share/fonts/truetype/msttcorefonts/README

进行此操作需要互联网连接:

sudo apt-get install --reinstall ttf-mscorefonts-installer

我重新安装了ttf-mscorefonts-installer(如上所示,确保接受 EULA!)问题得到了解决。


5
其他Linux发行版请尝试使用sudo apt-get install msttcorefonts安装Microsoft TrueType字体。 - KCD
1
对于CentOS和RHEL6,您如何解决EULA问题?yum安装不会为您提供接受任何选项,有什么想法吗? - Darragh
2
这是在单个电脑上的一种解决方法,它无法解决任何编码问题,正确的方法是使用字体扩展。我已经发布了一个答案。 - Petter Friberg
1
答案适用于已安装字体但未接受许可证的情况。以下是在首次正确执行自动安装时要执行的步骤:sudo echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections && apt-get install -y -q ttf-mscorefonts-installer - Aleksander Lech
这是错误的方法。关于字体扩展的答案才是正确的方法。文档解释了原因,答案也解释了原因。 - undefined
显示剩余6条评论

45

JasperReports会在报表模板中使用的字体未作为系统字体或来自JR字体扩展的字体可用于JVM时,抛出一个JRFontNotFoundException异常。这样确保避免由字体度量不匹配引起的所有问题,并让我们提前了解到不一致性。

JasperReports试图帮助您进行报表开发,并指出无法正确导出您的报表,因为找不到在TextFieldStaticText中定义的字体。

<font fontName="Arial"/>

是的,您可以通过将net.sf.jasperreports.awt.ignore.missing.font设置为true来禁用此功能,但您可能会遇到导出不一致性问题。

是的,您可以将字体作为JVM系统字体进行安装(但您需要在可能生成报告的每台计算机上执行此操作,并且仍然可能存在编码问题)。

正确的方式!

使用字体扩展如果您想创建自己的字体扩展(请参见下面的链接),jasper reports还分发一个默认的字体扩展jar (jasperreports-fonts-x.x.x.jar),支持fontName DejaVu SansDejaVu SerifDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

来自JasperReport Ultimate Guide的内容:

我们强烈鼓励人们只使用从字体扩展中获取的字体,因为这是唯一确保在运行时执行报告时应用程序可以使用这些字体的方法。使用系统字体总是存在风险,可能会导致在部署到没有安装那些字体的新机器上时报告无法正常工作。

StackOverflow上有关如何正确呈现PDF字体的链接:

检查正确呈现PDF字体的清单

使用JasperSoft Studio生成字体扩展

使用iReport生成字体扩展


你能告诉我为什么Jasper和JVM不能使用系统中存在的字体(位于C:\windows\fonts),而必须创建一个Jar字体扩展并将其作为库添加到项目的类路径中来呈现PDF吗?(我正在使用Java和Eclipse)。我尝试在谷歌上寻找答案,但没有找到可理解的解释。此外,我也遇到了Apache FOP导出PDF时的字体问题(不需要字体扩展,但我必须创建一个字体度量文件并进行一些额外的配置才能正确呈现字体)。 - EagerToLearn
1
@EagerToLearn 一切都源于生成PDF的itext库,正确呈现字体需要字体扩展(不仅包括字体还包括编码,如果已嵌入ecc则指定)。 如果您没有提供这个,itext将尽最大努力呈现您的字体。 您没有按照我们需要的方式操作(在文档中写明),我们会尽最大努力,但错误是您的。 因此,这个问题上所接受的答案是不正确的!需要字体扩展,如果您没有提供,那么您将不得不接受所创建的任何内容。 - Petter Friberg
谢谢您的回答,但我仍然只知道字体问题是由于iText库的工作方式造成的。也许这个字体问题已经超出了我的技术理解能力 :( - EagerToLearn
@eag 要理解这个问题并不需要太多,要渲染字体,你需要知道.ttf文件在哪里以及文本的编码方式。库的开发人员已经创建了字体扩展来获取这些信息,如果你没有提供它们,他们就需要开始猜测。有时候它无法正常工作是因为“猜测”不正确,但你不能因此责怪库,因为他们已经为你提供了一个避免“猜测”的系统。 - Petter Friberg

24

我使用 IReport 安装字体:

工具 -> 选项 -> 字体 -> 点击安装字体

然后选择字体并点击

-> 导出为扩展名为 myfont.jar 的文件

将此 jar 文件和 spring.jar* 添加到您的构建路径中。

*从 Jaspersoft\iReport-3.7.0\ireport\modules\ext 中复制 spring.jar


1
为了完成,arial ttf 文件位于 c:/windows/fonts(至少在 win xp 中):arial.ttf,arialbd.ttf(粗体),ariali.ttf(斜体),arialbi(粗斜体)。 - jneira
将 spring.jar 添加到构建路径中解决了这个问题。 - fishjd
这种方法对我来说确实有效。它将字体打包成一个jar文件,您将其添加到类路径中,然后一切都可以正常工作。 - Satya
1
如果字体扩展正确制作,则无需添加spring.jar。 - Petter Friberg
这个工具->选项->字体->点击安装在Mac上不可用。:( 有什么建议吗? - L-Samuels

16

sudo apt-get install msttcorefonts 可以在Ubuntu开发环境下使用,但并不是一个很好的解决方案。

相反,我们基于这个提示将字体与我们的应用程序捆绑在一起。他们的JAR文件捆绑了以下字体:

  • Arial
  • Times New Roman
  • Courier New
  • Comic Sans MS
  • Georgia
  • Verdana
  • Monospaced

下载该jar文件的直接链接:Maven ver 1.0. DynamicFonts


现在可以从标准mvn存储库下载,例如:https://mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts - Markus Pscheidt

15

避免这种问题有三种方法。

方法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文件,该文件将存在于您的项目库或类路径中。


12

对于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

6
我通过只选择“SansSerif”或“Serif”,而不选择“Arial”或“Times New Roman”来解决了这个问题。

6
根据异常文档(http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/util/JRFontNotFoundException.html)所述,该方法被明确不建议使用。这可能会导致意外的渲染问题,因为这些字体在不同的系统上可能被映射到不同的系统字体。 - Doug

4

如果你在你的项目中使用maven,你可以在pom.xml文件中添加jasper-fonts依赖:

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports-fonts</artifactId>
    <version>6.8.1</version>
</dependency>

在系统上安装缺少的字体可能是一种可行的解决方案,但对我来说不是,我不想在每次部署到新服务器时都必须安装缺少的字体,相反我选择将字体嵌入应用程序中。

祝好。


有人知道这个依赖项是否会添加“Arial”字体吗? - midi

3
您可以通过安装字体来实现,这意味着您需要在想要运行该特定应用程序的每个地方都进行安装。最简单的方法是只需将以下一行代码添加到您的jrxml文件中:
 <property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

2
这将会产生导出不一致性(因此它无法使用jrxml中指定的字体进行渲染)。请参见我的答案。 - Petter Friberg

3

Debian平台

添加

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

当然,你需要重新启动jasperserver。即:
/opt/jasperreports-server-cp-4.5.0/ctlscript.sh restart

更改您的版本/路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接