字体无法用于Jasper Reports的JVM


91

我正在尝试使用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 =真正的”坏主意...但解决了一时的问题....
安德鲁·

您将需要在Ubuntu中安装Microsoft字体,请参阅此链接以获取信息..claudubuntu.com / 2005/09/09 / installing
Sivaramakrishnan

1
您在哪里设置?我正在jbilling中使用jasperreports的嵌入式版本,其中不存在要编辑的jasperreports.properties文件。
达拉格


1
@Andrew,这似乎不是一个很好的解决方案(我知道问题很旧),但是最好避免我们出现报告不一致的情况,我已经给出了答案。
皮特·弗里伯格

Answers:


63

我尝试安装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!),问题已解决。


5
仅供参考,在其他Linux版本上尝试sudo apt-get install msttcorefonts
KCD

对于CentOS和RHEL6,您如何解决EULA问题?yum install不能让您选择接受任何想法吗?
达拉格

那么最常见的Windows操作系统呢?
Sarz 2015年

这是在单台PC上解决的问题,它不会解决任何编码问题,正确的方法是使用我发布了答案的字体扩展
Petter Friberg 16/02/22

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

35

如果报表模板中使用的字体无法作为JVM的系统字体或来自JR字体扩展名的字体供JVM使用,则JasperReports会引发JRFontNotFoundException。这样可以确保避免由字体规格不匹配引起的所有问题,并且我们会提前发出有关不一致的警告。

Jasper报表试图帮助您进行报表开发,指出由于找不到在TextField或中定义的字体,因此无法正确导出报表。StaticText

<font fontName="Arial"/>

是的,您可以通过将net.sf.jasperreports.awt.ignore.missing.font设置为true来禁用此功能,但是会出现导出不一致的情况

是的,您可以字体安装为JVM系统字体(但是您需要在使用的每台PC上进行安装,这可能会生成报告,并且仍然会出现编码问题)。

正确的方法!

使用字体扩展,如果你想创建自己的(见下面的链接),碧玉报告还经销默认字体扩展罐子(jasperreports-fonts-x.x.x.jar),支持的fontName DejaVu SansDejaVu SerifDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

从JasperReport Ultimate Guide:

我们强烈建议人们仅使用从字体扩展名衍生的字体,因为这是确保在运行时执行报告时,字体对于应用程序可用的唯一方法。使用系统字体通常会带来以下风险:将报告部署到可能未安装这些字体的新计算机上时,报告无法正常工作

关于如何在pdf中正确呈现字体的StackOverflow上的链接

有关如何在pdf中正确呈现字体的清单

使用JasperSoft Studio生成字体扩展名

使用iReport生成字体扩展名


您能否告诉我Jasper和JVM无法使用系统中存在的字体(位于C:\ windows \ fonts)呈现PDF的原因,而是必须创建一个Jar字体扩展并将其作为库添加到项目的类路径(我正在使用Java和Eclipse)。我试图用谷歌搜索答案,但是没有找到可以理解的解释。我也看到Apache FOP也存在这种导出pdf字体的问题(不需要字体扩展,但是我必须创建一个字体度量文件,并做了一些额外的配置才能正确呈现该字体)
EagerToLearn

1
@EagerToLearn全部归结为生成pdf的itext库,正确地渲染字体的itext需要字体扩展(如果指定了嵌入式ecc,则不仅包括字体,还包括编码)。如果您不提供此功能,则itext将执行他们所谓的“尽力而为”来呈现您的字体。您没有做我们需要做的事情(写在文档中),让我们尽力而为,但错是您的。因此,关于这个问题的可接受答案是不正确的!,需要扩展字体,如果不提供,您将不得不忍受所创建的任何东西。
佩特·弗里贝格

感谢您的回答,但我仍然只知道字体问题与iText库的工作方式有关。可能是因为这种字体超出了我的技术理解能力:(
EagerToLearn

@eag要理解的只是这些,要呈现一种字体,您需要知道.ttf的位置,并且需要知道文本的编码方式。lib的开发人员知道此信息已创建了字体扩展名,如果您不提供它们,则需要开始猜测,为什么在某些情况下它不起作用是因为“ guessing”是不正确的,但您不能将lib归咎于这是因为他们为您提供了避免“猜测”的系统
皮特·弗里伯格

22

我使用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 2012年

这种方法实际上对我有用。它将字体打包为jar文件,将其添加到类路径中,然后“ Just Work”就可以了。
萨蒂亚(Satya)

如果正确执行了字体扩展,则无需添加spring.jar。
皮特·弗里伯格

此工具->选项->字体->单击安装在Mac上不可用。:(有什么建议吗?
L-Samuels

13

sudo apt-get install msttcorefonts 可以工作(在我们的Ubuntu开发环境中),但这不是一个很好的解决方案。

相反,我们根据此技巧将字体与我们的应用程序捆绑在一起。他们的JAR文件捆绑了以下字体,

  • Arial
  • 英语字体格式一种
  • 快递新
  • Comic Sans MS
  • 佐治亚州
  • Verdana
  • 等距

直接链接下载jar: Maven版本1.0。动态字体


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


9

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

方法1:通过设置忽略缺少的字体属性。

JRProperties.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");

或者您可以通过在.jrxml文件中输入以下行来设置此属性。

<property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

方法2:通过设置默认字体属性。

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扩展名的“导出为扩展名”将其导出。

您可以将此Jar用于Jasperreports-font.XXXjar,它将存在于您的项目库或类路径中。




2

尝试添加线

net.sf.jasperreports.awt.ignore.missing.font = true

到您的jasperreports.properties文件。

贾斯珀停止寻找一种字体


1
这是一个坏主意...出口不一致!
皮特·

@PetterFriberg不,这是一个很好的后备机制。您不能总是控制JVM。最好有一个后备机制,即使结果不理想,也比客户计算机上缺少字体引起的应用程序崩溃要好。
jwenting

@jwenting添加字体扩展名,它不会崩溃。相信我,如果您禁用自己做错了什么,将会生成不正确的报告,而是应该解决根本问题(缺少字体扩展名)。是的,您始终可以控制JVM。
佩特·弗里贝格

@jwenting请注意:解决方案不是在服务器上安装字体(正如接受答案所说,这是错误的!)。解决方案是生成并添加依赖字体的扩展名。参见正确答案stackoverflow.com/a/35549391
Petter Friberg

@PetterFriberg,这通常是不可能的。例如,我维护的应用程序在服务器上运行,但允许用户添加具有特定命名约定的自定义.jrxml文件,以便生成超出我们标准提供的自定义报告。如果服务器没有.jrxml指定的可用字体,不要让这些报告崩溃,因此我们使用后备。
jwenting

2

您可以通过安装字体来做到这一点,这意味着您想在任何地方运行该特定应用程序。最简单的方法是将此bl行添加到您的jrxml文件中:

 <property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

希望能帮助到你。


1
但是,这将导致导出不一致(因此无法使用jrxml中指示的字体进行渲染)。看我的答案。
皮特·弗里伯格

2

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

更改您的版本/路径。


2

我遇到了基于Spring 3并部署在Oracle Linux 6上的Weblogic 10.3上的Web应用程序的问题。链接上提到的解决方案对我不起作用。

我必须执行以下步骤-1.将Arial * .ttf字体文件复制到JROCKIT_JAVA_HOME / jre / lib / fonts目录中2.在fontconfig.properties.src中输入字体3.从Weblogic控制台重新启动群集

filename.Arial=Arial.ttf
filename.Arial_Bold=Arial_Bold.ttf
filename.Arial_Italic=Arial_Italic.ttf
filename.Arial_Bold_Italic=Arial_Bold_Italic.ttf

2

如果您在项目中使用Maven,则只需将jasper-fonts依赖项添加到pom.xml中:

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

在系统上安装缺少的字体可能是一个可行的解决方案,但对我而言不是,我不想在每次部署后都在新服务器上安装缺少的字体,而是选择将字体嵌入到应用程序中。

问候。


1

以多种语言创建jasper报告(Unicode)

1)在ireport desginer中安装字体

2)创建字体扩展名(我们将在应用程序的类路径中使用它)

3)在OS上安装字体(可选)

4)将字体的所有.ttf粘贴到jre-> lib-> fonts目录中(否则Web应用程序将抛出错误的字体对JVM不可用)


0

其实我以非常简单的方式解决了这个问题

  1. 去你的home path,就像/root
  2. 创建一个名为 .fonts
  3. 复制all your font files.fontsC:\windows\fonts如果使用Windows ,则可以从复制字体。
  4. sudo apt-get install fontconfig
  5. fc-cache –fv 重新建立字体缓存。

0

分两步解决(如果您使用的是centOS)

  1. 下载Microsoft核心字体rpm软件包。

    [root@WEBSVR~/]# wget http://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
    
  2. 安装rpm软件包。

    [root@WEBSVR~/]# rpm -Uvh msttcore-fonts-2.0-3.noarch.rpm
    


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.