24

I cannot load a font from an S3 Inputstream in JRE 8. I do not have issue if a system is installed with JRE 7, JDK 7, or even JDK 8.

val fontInputStream = s3Client.getObject(bucketName, objectKey).getObjectContent

val customFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(Font.TRUETYPE_FONT, 20F)

The error that I got is

Exception in thread "main" java.io.IOException: Problem reading font data.
        at java.awt.Font.createFont0(Font.java:1000)
        at java.awt.Font.createFont(Font.java:877)
        at Main$.delayedEndpoint$Main$1(Main.scala:31)
        at Main$delayedInit$body.apply(Main.scala:11)
        at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
        at scala.App$class.main(App.scala:76)
        at Main$.main(Main.scala:11)
        at Main.main(Main.scala)

I tried to load the inputstream to a temp file, but it does not help. I also tried to load a font directly from a local file, but I got a different error with getting font metadata. Here is the error log.

Exception in thread "main" java.lang.NullPointerException
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
        at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
        at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
        at sun.font.SunFontManager$2.run(SunFontManager.java:431)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.<init>(SunFontManager.java:376)
        at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at java.lang.Class.newInstance(Class.java:442)
        at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        at java.awt.Font.<init>(Font.java:614)
        at java.awt.Font.createFont(Font.java:1056)
        at Main$.delayedEndpoint$Main$1(Main.scala:32)
        at Main$delayedInit$body.apply(Main.scala:11)
        at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
        at scala.App$class.main(App.scala:76)
        at Main$.main(Main.scala:11)
        at Main.main(Main.scala)

So, this is not a problem with inputstream, but rather with the loading of the font itself in JRE 8.

This seems like a bug in JRE 8 Font.

I am loading a font to use to draw a string in a picture. My code is run in a Docker container using images java:7-jre (ok), java:7-jdk (ok), java:8-jre (fail), java:8-jdk (ok).

Khanetor
  • 11,595
  • 8
  • 40
  • 76
  • 1
    and what's the URL for the font? You may want to run it through TTX, and see if that throws any errors, as well as try loading it in Font Forge, which is even more finicky when it comes to telling you the font you're loading has bad values somewhere. – Mike 'Pomax' Kamermans Jun 04 '15 at 05:33
  • The openjdk blog explains this problem here: https://blog.adoptopenjdk.net/2021/01/prerequisites-for-font-support-in-adoptopenjdk/ – ADJenks Jun 25 '21 at 23:12

7 Answers7

23

I get the same error with openjdk:8-jre-alpine. Switching to openjdk:8-jre helps.

--- FROM openjdk:8-jre-alpine
+++ FROM openjdk:8-jre
leoleozhu
  • 630
  • 6
  • 21
17

We also got that error when using tomcat:8.0.38-jre8-alpine. That image is missing the fontconfig. Instead of switching to a different image you could also install the ttf-dejavu package.

apk add --update ttf-dejavu
brass monkey
  • 5,841
  • 10
  • 36
  • 61
13

It turns out that this is a problem with the openjdk-8-jre-headless installation. This is the installation in the Docker image for java 8 JRE. I simply install openjdk-8-jre (without headless) and the problem goes away.

If you look at the error log, the loading of the font require awt X11, which is missing from headless version of JRE.

Khanetor
  • 11,595
  • 8
  • 40
  • 76
  • 2
    To further clarify the answer, the `headless` flavor of JRE does not support font loading because a headless environment is one without UI, thus no need for font. The non `headless` version, however, supports UI, thus supports font. – Khanetor Sep 25 '16 at 23:49
13

For alpine and openjdk : Use RUN apk --update add fontconfig ttf-dejavu Worked for me.

Bhagwati Malav
  • 3,349
  • 2
  • 20
  • 33
11

On CentOS headless JRE is missing the fontconfig dependency:

yum install fontconfig

Also one might need to install at least one font (dejavu, liberation, etc).

Vertigo
  • 1,847
  • 22
  • 19
6

For me this resolved issue:

apt-get install -y libfontconfig1
Rax
  • 470
  • 5
  • 15
  • For Docker add these line to remove this issue : RUN apt-get update && \ apt-get install -y libfontconfig1 – Shaam Aug 28 '23 at 08:58
0

I spent days suffering with it until I saw this github thread and made the night happy. it's practically calling GraphicsEnvironment again

link here