Come risolvere RuntimeException Fontconfig head is null

L’errore java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration si verifica quando Aspose.Cells for Java non riesce a localizzare i font necessari sul sistema. Aspose.Cells si appoggia sui file di font per operazioni di rendering e elaborazione come generazione PDF, rendering di immagini e gestione del layout di pagina.

Per risolvere questo problema, hai alcune opzioni:

Esegui in Modalità Headless

Poiché molto probabilmente operi in un ambiente senza interfaccia grafica, dovresti configurare Java per funzionare in modalità headless. La modalità headless permette a Java di operare senza richiedere l’accesso a uno schermo o a un ambiente grafico, essenziale quando si lavora in ambienti come Azure o Docker.

Puoi abilitare la modalità headless aggiungendo la seguente proprietà di sistema all’avvio della tua applicazione Java:

java

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

Oppure impostandola tramite la riga di comando al lancio della JVM:

-Djava.awt.headless=true

Installa i Font Necessari

Se lavori in un ambiente dove puoi installare pacchetti, puoi installare pacchetti relativi ai font per assicurarti che i font di base siano disponibili. Per i sistemi Linux, puoi installare pacchetti di font come:

Debian/Ubuntu:

sudo apt-get install -y fontconfig ttf-dejavu

Alpine (per setup Docker minimalisti):

apk add --no-cache fontconfig ttf-dejavu

Red Hat/CentOS:

sudo yum install -y fontconfig dejavu-sans-fonts

Esempio

Ecco un esempio di Dockerfile di Alpine con solo l’installazione di jdk17.

# 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 il docker con Aspose.Cells for Java, si verificherà la seguente eccezione durante il rendering in PDF e immagine.

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

Dopo aver aggiunto i pacchetti fontconfig e ttf-dejavu, il rendering in PDF e immagine sarà OK.

# 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