无法在JRE 8中加载字体

我无法从JRE 8中的S3 Inputstream加载字体。如果系统安装了JRE 7,JDK 7甚至JDK 8,我就没有问题。

val fontInputStream = s3Client.getObject(bucketName, objectKey).getObjectContent val customFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(Font.TRUETYPE_FONT, 20F) 

我得到的错误是

 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) 

我试图将输入流加载到临时文件,但它没有帮助。 我还试图直接从本地文件加载字体,但我得到了与获取字体元数据不同的错误。 这是错误日志。

 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.(SunFontManager.java:376) at sun.awt.X11FontManager.(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.(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) 

因此,这不是inputstream的问题,而是在JRE 8中加载字体本身。

这似乎是JRE 8 Font中的一个错误。

我正在加载一个字体用于在图片中绘制字符串。 我的代码使用图像java:7-jre(ok),java:7-jdk(ok),java:8-jre(fail),java:8-jdk(ok)在Docker容器中运行。

事实certificate这是openjdk-8-jre-headless安装的一个问题。 这是java 8 JRE的Docker镜像中的安装。 我只需安装openjdk-8-jre (没有无头),问题就消失了。

如果你查看错误日志,加载字体需要awt X11,这是headless JRE所缺少的。

我在openjdk中遇到了同样的错误:8-jre-alpine。 切换到openjdk:8-jre也有帮助。 (apt-get line似乎没必要)

 --- FROM openjdk:8-jre-alpine +++ FROM openjdk:8-jre +++ RUN apt-get install -y libfontconfig 

在CentOS无头JRE上缺少fontconfig依赖:

 yum install fontconfig 

也可能需要安装至少一种字体( dejavuliberation等)。

使用tomcat时我们也遇到了这个错误:8.0.38-jre8-alpine。 该图像缺少fontconfig。 您也可以安装ttf-dejavu软件包,而不是切换到不同的图像。

 apk add --update ttf-dejavu 

对我来说这个问题解决了:

 apt-get install -y libfontconfig1