Cómo solucionar RuntimeException Fontconfig head es nulo

El error java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration ocurre cuando Aspose.Cells for Java no puede localizar las fuentes requeridas en el sistema. Aspose.Cells confía en archivos de fuentes para operaciones de renderizado y procesamiento como la generación de PDF, renderizado de imágenes y manejo de diseño de página.

Para resolver este problema, tienes algunas opciones:

Ejecutar en modo sin cabeza

Dado que probablemente estás ejecutando en un entorno sin cabeza, debes configurar Java para que se ejecute en modo sin cabeza. El modo sin cabeza permite que Java opere sin requerir acceso a una pantalla o entorno gráfico, lo cual es esencial cuando se ejecuta en entornos como Azure o Docker.

Puedes habilitar el modo sin cabeza agregando la siguiente propiedad del sistema al inicio de tu aplicación Java:

java

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

O configúrelo mediante la línea de comandos al iniciar la JVM:

-Djava.awt.headless=true

Instalar las fuentes necesarias

Si trabaja en un entorno donde puede instalar paquetes, puede instalar paquetes relacionados con fuentes para garantizar que estén disponibles las fuentes básicas. Para sistemas Linux, puede instalar paquetes de fuentes como:

Debian/Ubuntu:

sudo apt-get install -y fontconfig ttf-dejavu

Alpine (para configuraciones mínimas de Docker):

apk add --no-cache fontconfig ttf-dejavu

Red Hat/CentOS:

sudo yum install -y fontconfig dejavu-sans-fonts

Ejemplo

Aquí tienes un Dockerfile de Alpine con solo jdk17 instalado.

# 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

Usa el Docker con Aspose.Cells for Java, ocurrirá la siguiente excepción al renderizar a PDF e imagen.

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

Después de agregar los paquetes fontconfig y ttf-dejavu, será correcto al renderizar a PDF e imagen.

# 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