无法在JRE 8中加载字体

Kha*_*tor 10 java fonts awt java-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)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

leo*_*zhu 11

我在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
Run Code Online (Sandbox Code Playgroud)


Kha*_*tor 8

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

如果查看错误日志,则加载字体需要awt X11,这是headlessJRE版本中缺少的.

  • 为了进一步澄清答案,JRE 的“无头”风格不支持字体加载,因为无头环境是没有 UI 的环境,因此不需要字体。然而,非“无头”版本支持 UI,因此支持字体。 (2认同)

Laz*_*ass 8

当使用tomcat:8.0.38-jre8-alpine时,也会出现该错误。该图像缺少fontconfig。除了切换到其他映像,您还可以安装该ttf-dejavu软件包。

apk add --update ttf-dejavu
Run Code Online (Sandbox Code Playgroud)


Ver*_*igo 7

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

yum install fontconfig
Run Code Online (Sandbox Code Playgroud)

另外一个可能需要至少安装一个字体(dejavu,liberation,等).


Rax*_*Rax 6

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

apt-get install -y libfontconfig1
Run Code Online (Sandbox Code Playgroud)


Bha*_*lav 5

对于alpine和openjdk:使用RUN apk --update add fontconfig ttf-dejavu 对我有用。