Jasper Reports在openjdk:15-alpine中使用时出现字体问题

3

我知道有很多类似的问题,但我没有找到完全符合我的情况。

我有:

  1. Spring Boot应用程序
  2. pom.xml
<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>6.17.0</version>
</dependency>

<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports-fonts</artifactId>
  <version>6.17.0</version>
</dependency>
  1. src/main/resources/jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.myfamily=fonts/myfamily.xml

  1. src/main/resources/fonts/myfamily.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <fontFamily name="Tahoma">
        <normal><![CDATA[fonts/Tahoma/tahoma.ttf]]></normal>
        <pdfEncoding><![CDATA[Cp1251]]></pdfEncoding>
        <pdfEmbedded><![CDATA[true]]></pdfEmbedded>
        <exportFonts/>
        <locales>
            <locale><![CDATA[ru_RU]]></locale>
        </locales>
    </fontFamily>
</fontFamilies>

  1. src/main/resources/fonts/Tahoma/tahoma.ttf

一切正常!使用ADOPT-OPENJDK-15本地启动时没有问题(抱歉全大写)。

在服务器上启动时遇到问题,在docker中我的应用程序使用openjdk:15-alpine启动,其中默认包含一些字体 https://wiki.alpinelinux.org/wiki/Fonts

第一次启动时,我会遇到两个错误:

java.lang.UnsatisfiedLinkError: /opt/openjdk-15/lib/libfontmanager.so: Error loading shared library libfreetype.so.6: No such file or directory (needed by /opt/openjdk-15/lib/libfontmanager.so)

第二次点击(以及接下来的每一次)时会出现以下错误。有趣的是为什么第一次总是出现一个错误,而第二次和其他次则出现另一个错误。
java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser] with root cause

我尝试了一些解决方案。

  1. 将JAVA_OPT添加到Docker容器中。
-Djava.awt.headless=true 
  1. 添加了对Docker容器的依赖
RUN apk update && apk upgrade \
   && apk add --no-cache ttf-dejavu

这对我有用!!!(但不适用于我的情况,因为我不想添加其他依赖项,这可能会在服务器上部署我的应用程序时引起更多问题)

  1. 切换到另一个jdk(而非alpine)可以解决问题,但也不适用于我的情况,因为我必须使用alpine版本。

  2. 将pdf编码切换为

<pdfEncoding><![CDATA[Identity-H]]></pdfEncoding>
  1. 尝试添加default.jasperreports.properties文件

使用以下内容:

net.sf.jasperreports.default.font.name=Tahoma
net.sf.jasperreports.default.pdf.font.name=Tahoma
net.sf.jasperreports.default.pdf.encoding=Cp1252
net.sf.jasperreports.default.pdf.embedded=false

我遇到了另一个NPE错误,搜索了一下,发现了一种解决默认属性问题的答案,但没有一个可行的方法。

那么如何处理ALPINE JDK中的这些错误?


1
我认为没有办法不安装一些字体包,例如ttf-dejavu或freetype(方案2)。正如您所提到的,Alpine香草镜像非常紧凑且只包含绝对最少量的必要软件包,其中不包括GUI支持和适当的字体。 - valiano
1个回答

0

实际上,如Alex K所提到的,没有其他方法,只能安装一些字体包。

当我创建一个没有任何文本、表单或字体的空Jasper模板时,最终我找到了解决方法。同样的问题也出现了。

由于我的ci/cd和部署设置更重要,我不得不从Jasper转移到iText库。


希望您在项目中使用itext时注意到了它的许可证,它是AGPL的一个版本,在商业项目中使用可能会有一些问题。 - Satish Patro

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