如何修复 RuntimeException Fontconfig head 为 null

当出现错误 java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 时,表示 Aspose.Cells for Java 无法在系统中找到所需字体。Aspose.Cells 依赖字体文件进行渲染和处理,如生成 PDF、图像渲染和页面布局处理。

解决此问题的方法有几种:

在无头模式下运行

由于你可能在无头环境中运行,应将 Java 配置为 无头模式。无头模式允许 Java 在没有显示或图形环境的情况下运行,这在 Azure 或 Docker 等环境中运行时非常重要。

可以在你的 Java 应用开始时添加以下系统属性,以启用无头模式:

java

System.setProperty("java.awt.headless", "true");

或者在启动 JVM 时通过命令行设置:

-Djava.awt.headless=true

安装必要的字体

如果你在可以安装软件包的环境中工作,可以安装字体相关的包,以确保基本字体的可用。例如在 Linux 系统中,可以安装以下字体包:

Debian/Ubuntu

sudo apt-get install -y fontconfig ttf-dejavu

Alpine(适用于极简 Docker 设置):

apk add --no-cache fontconfig ttf-dejavu

Red Hat/CentOS

sudo yum install -y fontconfig dejavu-sans-fonts

示例

这是只安装了 jdk17 的 Alpine Dockerfile示例。

# Start with the bare Alpine base image
FROM alpine:latest

# Set environment variables for Java
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk \
    PATH=$JAVA_HOME/bin:$PATH

# Install only the minimal OpenJDK 17 package
RUN apk add --no-cache openjdk17-jdk \
    && java -version

使用带有 Aspose.Cells for Java 的 Docker,渲染为 PDF 和图像时将会出现以下异常。

Caused by: java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
    at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1271)
    at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:224)
    at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:106)
    at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:706)
    at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:358)
    at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:315)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:315)
    at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
    at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
    ... 33 more

添加fontconfigttf-dejavu包后,在渲染为pdf和图片时将会正常。

# Start with the bare Alpine base image
FROM alpine:latest

# Set environment variables for Java
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk \
    PATH=$JAVA_HOME/bin:$PATH

# Install only the minimal OpenJDK 17 package
RUN apk add --no-cache openjdk17-jdk \
    && java -version

# Install fontconfig and ttf-dejavu packages to fix RuntimeException: Fontconfig head is null
RUN apk add --no-cache fontconfig ttf-dejavu \
    && fc-cache -f -v