2015-06-03 23 views
8

Non posso caricare un font da un S3 InputStream in JRE 8. Non ho problema se un sistema è installato con JRE 7, JDK 7, o anche JDK 8.Impossibile caricare carattere in JRE 8

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

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

l'errore che ho ottenuto è

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) 

ho provato a caricare l'InputStream in un file temporaneo, ma non aiuta. Ho anche provato a caricare un font direttamente da un file locale, ma ho riscontrato un errore diverso nell'ottenere i metadati dei font. Ecco il registro degli errori.

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) 

Quindi, questo non è un problema con InputStream, ma piuttosto con il caricamento del font stesso in JRE 8.

Questo mi sembra un bug in JRE 8 caratteri.

Sto caricando un tipo di carattere da utilizzare per disegnare una stringa in un'immagine. Il mio codice viene eseguito in un contenitore mobile utilizzando le immagini java: 7-jre (ok), java: 7-jdk (ok), java: 8-jre (fail), java: 8-jdk (ok).

+1

e qual è l'URL per il carattere? Si consiglia di eseguirlo attraverso TTX, e vedere se questo genera errori, così come provare a caricarlo in Font Forge, che è ancora più schizzinoso quando si tratta di dirvi che il font che si sta caricando ha valori cattivi da qualche parte. –

risposta

4

Si scopre che questo è un problema con l'installazione openjdk-8-jre-headless. Questa è l'installazione nell'immagine Docker per java 8 JRE. Semplicemente installo openjdk-8-jre (senza headless) e il problema scompare.

Se si guarda il log degli errori, il caricamento del font richiede awt X11, che manca nella versione headless di JRE.

+0

Per chiarire ulteriormente la risposta, il sapore 'headless' di JRE non supporta il caricamento dei font perché un ambiente headless è uno senza UI, quindi non c'è bisogno di font. La versione non 'headless', tuttavia, supporta l'interfaccia utente, quindi supporta font. – Khanetor

0

Per me questo problema risolto:

apt-get install -y libfontconfig1 
1

su CentOS senza testa JRE manca l'fontconfig dipendenza:

yum install fontconfig 

anche uno potrebbe aver bisogno di installare almeno un tipo di carattere (dejavu, liberation, ecc).

3

Ho incontrato lo stesso errore in openjdk: 8-jre-alpine. Passando a openjdk: 8-jre ha anche aiutato. (la linea apt-get non sembra necessaria)

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