【问题标题】:Font is not available to the JVM with Jasper Reports带有 Jasper Reports 的 JVM 无法使用字体
【发布时间】:2011-04-18 05:38:59
【问题描述】:

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

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

msttcorefonts 已安装,但我猜 JVM 没有使用其中的任何字体。

我使用的是 Ubuntu 10.04。

我该如何解决这个问题?

【问题讨论】:

  • 我实际上忽略了它......只需设置以下“net.sf.jasperreports.awt.ignore.missing.font=true”这个坏主意......但暂时解决了问题....
  • 您需要在 Ubuntu 中安装 microsoft 字体,请参阅此链接以获取信息 .. embraceubuntu.com/2005/09/09/installing-microsoft-fonts
  • 你在哪里设置这个?我正在 jbilling 中使用 jasperreports 的嵌入式版本,其中不存在可编辑的 jasperreports.properties 文件。
  • @Andrew,这似乎不是一个好的解决方案(我知道问题是旧的),但也许我们避免报告不一致更好,我已经通过了答案。

标签: jvm jasper-reports ubuntu-10.04 dynamic-jasper


【解决方案1】:

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

【讨论】:

  • FYI 在其他 linux 风格上尝试 sudo apt-get install msttcorefonts
  • 对于 CentOS 和 RHEL6 你如何解决 EULA 问题? yum install 没有给你任何接受的选项,有什么想法吗?
  • 最常见的windows操作系统呢?
  • 这是在单台电脑上的解决方法,它不会解决任何编码问题,正确的方法是使用字体扩展我已经发布了一个答案
  • 对于我们已经安装了字体但没有接受许可的情况,答案是正确的。如果您要正确执行第一次自动安装,请执行以下步骤:sudo echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections && apt-get install -y -q ttf-mscorefonts-installer
【解决方案2】:

JasperReports 引发 JRFontNotFoundException 在报告模板中使用的字体不可用于 JVM 作为系统字体或来自 JR 字体扩展的字体的情况下。这样可以确保避免由字体指标不匹配引起的所有问题,并且我们会对不一致进行早期警告。

Jasper 报告试图在您的报告开发中帮助您,指出它无法正确导出您的报告,因为它找不到在TextFieldStaticText 中定义的字体

<font fontName="Arial"/>

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

是的,您可以安装该字体作为 JVM 系统字体(但您需要在每台使用的可能生成报告的 PC 上执行此操作,并且您仍然可能遇到 编码问题) .

正确的方法!

使用Font Extensions!,如果您想创建自己的(请参见下面的链接),jasper 报告还分发了一个默认的字体扩展 jar (jasperreports-fonts-x.x.x.jar),它支持 fontName @987654330 @、DejaVu SerifDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

来自 JasperReport 终极指南:

我们强烈建议人们仅使用从 font 派生的字体 扩展名,因为这是确保字体 将在执行报告时对应用程序可用 运行。使用系统字体总是会给报告带来风险 部署在可能没有的新机器上时正常工作 那些字体安装

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

Checklist on how to render font correctly in pdf

Generate font-extensions with JasperSoft Studio

Generate font-extensions with iReport

【讨论】:

  • 你能告诉我为什么 Jasper 和 JVM 无法使用系统中存在的字体(位于 C:\windows\fonts)呈现 PDF,而是我必须创建一个 Jar 字体扩展并将其作为库添加到项目的类路径中(我使用的是 Java 和 Eclipse)。我试图用谷歌搜索答案,但没有找到可以理解的解释。此外,我在 Apache FOP 中也看到了这个 exporting-pdf-font-problems(不需要字体扩展名,但我必须创建一个 font-metric-file 并为正确呈现字体做了一些额外的配置)
  • @EagerToLearn 这一切都归结为生成 pdf 的 itext 库,正确渲染字体的 itext 需要字体扩展(如果指定了嵌入式 ecc,则不仅包括字体,还包括编码) .如果你不提供这个,itext 会做他们所谓的“尽力而为”来渲染你的字体。你没有做我们需要的(写在文档中),让我们尽力而为,但错在你。因此,这个问题的公认答案是不正确!,需要字体扩展,如果你不提供,你将不得不接受所创建的任何内容。
  • 感谢您的回答,但我仍然只知道字体问题是由 iText 库的工作方式引起的。可能是这种字体的东西超出了我的技术理解能力:(
  • @eag 要理解这一点并不多,要渲染字体,您需要知道 .ttf 在哪里,并且您需要知道文本的编码是什么。了解此信息的 lib 开发人员已经创建了字体扩展,如果您不提供,他们需要开始猜测,为什么它在某些情况下不起作用是因为“猜测”不正确,但您不能责怪 lib这是因为他们为您提供了一个避免“猜测”的系统
【解决方案3】:

我使用 IReport 安装字体:

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

然后选择字体并点击

-> 导出为扩展名并输入名称 myfont.jar

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

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

【讨论】:

  • 为了补全,arial ttf在c:/windows/fonts(至少在win xp中):arial.ttf, arialbd.ttf(bold),ariali.ttf(italic),arialbi(粗斜体)
  • 将 spring.jar 添加到构建路径修复它。
  • 这种方法实际上对我有用。它将字体打包为 jar 文件,您将其添加到类路径中,然后就可以工作了。
  • 如果字体扩展正确,则无需添加spring.jar。
  • 此工具->选项->字体->点击安装在 mac 上不可用。 :( 有什么建议吗?
【解决方案4】:

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

相反,我们基于this tip将字体与我们的应用程序捆绑。他们的 JAR 文件捆绑了以下字体,

  • 宋体
  • 新罗马时代
  • 快递新
  • Comic Sans MS
  • 格鲁吉亚
  • 维达纳
  • 等宽

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

【讨论】:

【解决方案5】:

对于 CentOS:

wgetmsttcorefonts

然后:

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虽然安装成功
【解决方案6】:

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

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

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

您可以将此 jar 用于 Jasperreports-font.X.X.X.jar,它将出现在您的项目库或类路径中。

【讨论】:

    【解决方案7】:

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

    【讨论】:

    【解决方案8】:

    尝试添加行

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

    到您的 jasperreports.properties 文件。

    Jasper stops finding one font

    【讨论】:

    • 这是个坏主意...导出不一致!
    • @PetterFriberg 不,这是一个很好的后备机制。你不能总是控制 JVM。拥有一个回退机制总是一个好主意,即使结果并不理想,它也比因客户机器上缺少字体而导致的应用程序崩溃要好。
    • @jwenting 添加字体扩展,它不会崩溃。相信我,如果您禁用您做错了什么,您将生成不正确的报告,而不是您应该解决根本问题(缺少字体扩展)。是的,你总是可以控制 JVM。
    • @jwenting 请注意:解决方案是不在服务器上安装字体(正如接受答案所说,这是错误的!)。解决方案是生成并添加依赖字体扩展。正确答案见此stackoverflow.com/a/35549391
    • @PetterFriberg 这通常是不可能的。例如,我维护的应用程序在服务器上运行,但允许用户添加具有特定命名约定的自定义 .jrxml 文件,以便生成超出我们作为标准提供的自定义报告。如果服务器没有 .jrxml 指定的可用字体,不希望这些报告崩溃,因此我们使用后备。
    【解决方案9】:

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

    我必须采取以下步骤 - 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
    

    【讨论】:

      【解决方案10】:

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

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

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

      问候。

      【讨论】:

        【解决方案11】:

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

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

        【讨论】:

        • 这将导致导出不一致(因此无法使用 jrxml 中指示的字体呈现)。看我的回答。
        【解决方案12】:

        可以通过 iReport 制作您的自定义字体并像 jars 文件一样转换

        【讨论】:

          【解决方案13】:

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

          更改您的版本/路径。

          【讨论】:

            【解决方案14】:

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

            1)在 ireport 设计器中安装字体

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

            3)在操作系统上安装字体(可选)

            4)将所有字体的.ttf粘贴到jre->lib->fonts目录下(否则web应用会抛出错误font is not available to JVM)

            【讨论】:

              【解决方案15】:

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

              1. 转到您的home path,例如/root
              2. 创建一个名为.fonts的文件夹
              3. 复制你的all your font files.fonts,如果你使用windows,你可以从C:\windows\fonts复制字体。
              4. sudo apt-get install fontconfig
              5. fc-cache –fv 重建字体缓存。

              【讨论】:

                【解决方案16】:

                分两步解决(如果您使用的是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
                  

                【讨论】:

                  【解决方案17】:

                  您可以使用这个库,它将 Liberation-fonts 打包为 JasperReport 字体扩展,并将它们注册为 Arial、Times New Roman 和 Courier:

                  https://mvnrepository.com/artifact/com.mpobjects.jasperreports.font/jasperreports-fonts-liberation

                  【讨论】:

                    【解决方案18】:

                    将您的字体复制到以下目录 JDK_HOME\jre\lib\fonts

                    【讨论】:

                      【解决方案19】:

                      嘿,查看在 Windows 上生成的文档时遇到问题?

                      您可以轻松尝试一个很好的解决方案:

                      yum install curl cabextract xorg-x11-font-utils fontconfig

                      rpm -i https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm

                      在此之后我需要重新启动我的系统 CentOS6。

                      来源:http://mscorefonts2.sourceforge.net/

                      【讨论】:

                        猜你喜欢
                        • 2020-12-13
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-09-07
                        • 1970-01-01
                        • 2018-11-10
                        • 1970-01-01
                        相关资源
                        最近更新 更多