无法在 JRE 8 中加载字体

Posted

技术标签:

【中文标题】无法在 JRE 8 中加载字体【英文标题】:Cannot load font in JRE 8 【发布时间】:2015-08-18 00:28:21 【问题描述】:

我无法从 JRE 8 中的 S3 输入流加载字体。如果系统安装了 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.<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)

所以,这不是 inputstream 的问题,而是 JRE 8 中字体本身的加载问题。

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

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

【问题讨论】:

字体的 URL 是什么?您可能希望通过 TTX 运行它,看看是否会引发任何错误,并尝试在 Font Forge 中加载它,当它告诉您您正在加载的字体在某处有错误值时,这就更加挑剔了。 openjdk 博客在这里解释了这个问题:blog.adoptopenjdk.net/2021/01/… 【参考方案1】:

我在使用 openjdk:8-jre-alpine 时遇到同样的错误。切换到 openjdk:8-jre 会有所帮助。

--- FROM openjdk:8-jre-alpine
+++ FROM openjdk:8-jre

【讨论】:

从 Alpine 切换到 jre 为我解决了这个问题。【参考方案2】:

我们在使用 tomcat:8.0.38-jre8-alpine 时也遇到了这个错误。该图像缺少字体配置。 您也可以安装 ttf-dejavu 包,而不是切换到其他图像。

apk add --update ttf-dejavu

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

原来这是openjdk-8-jre-headless 安装的问题。这是 Java 8 JRE 的 Docker 映像中的安装。我只需安装openjdk-8-jre(没有无头),问题就消失了。

如果您查看错误日志,字体的加载需要 awt X11,而 headless 版本的 JRE 中缺少此功能。

【讨论】:

为了进一步澄清答案,JRE 的headless 风格不支持字体加载,因为无头环境是没有 UI 的环境,因此不需要字体。但是,非headless 版本支持UI,因此支持字体。【参考方案5】:

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

yum install fontconfig

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

【讨论】:

【参考方案6】:

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

apt-get install -y libfontconfig1

【讨论】:

【参考方案7】:

我花了几天的时间忍受它,直到我看到这个 github 线程并让夜晚变得快乐。它实际上又在调用 GraphicsEnvironment

link here

【讨论】:

以上是关于无法在 JRE 8 中加载字体的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg drawtext - 无法从文件中加载字体[关闭]

FontAwesome 无法在本地和电子应用程序中加载字体

Google Web 字体无法在 iOS 版 Chrome 中加载

C ++发布程序无法在visual studio 2015中加载图像和字体

在QML中加载不同字体

在QML中加载不同字体