La fuente no está disponible para la JVM con Jasper Reports


91

Estoy intentando generar un informe con DynamicJasper, pero recibo el siguiente error:

net.sf.jasperreports.engine.util.JRFontNotFoundException:  
                                 Font 'Arial' is not available to the JVM.   

msttcorefonts está instalado, pero supongo que la JVM no está usando ninguna fuente.

Estoy usando Ubuntu 10.04.

¿Cómo puedo arreglar esto?


3
De hecho, lo estoy ignorando ... solo establezco la siguiente mala idea "net.sf.jasperreports.awt.ignore.missing.font = true" ... pero resuelve el problema por un momento ...
Andrew

Necesitaría instalar fuentes de microsoft en Ubuntu, consulte este enlace para obtener información. Embraceubuntu.com/2005/09/09/installing-microsoft-fonts
Sivaramakrishnan

1
donde pones esto? Estoy trabajando con una versión incrustada de jasperreports en jbilling donde no existe ningún archivo jasperreports.properties para editar.
Darragh


1
@Andrew, esto no parece una buena solución (sé que la pregunta es vieja), pero tal vez sea mejor que evitemos la inconsistencia de los informes, he pasado la respuesta.
Petter Friberg

Respuestas:


63

Intenté instalar mscorefonts, pero el paquete estaba instalado y actualizado.

sudo apt-get update
sudo apt-get install ttf-mscorefonts-installer

Intenté buscar la fuente en el sistema de archivos, con:

ls /usr/share/fonts/truetype/msttcorefonts/

Esta carpeta acaba de tener el archivo README, con las instrucciones correctas sobre cómo instalar.

cat /usr/share/fonts/truetype/msttcorefonts/README

Necesita una conexión a Internet para esto:

sudo apt-get install --reinstall ttf-mscorefonts-installer

Reinstalé ttf-mscorefonts-installer(como se muestra arriba, asegurándome de aceptar el EULA) y el problema se resolvió.


5
Para su información, en otras versiones de Linux, pruebe sudo apt-get install msttcorefonts
KCD

para CentOS y RHEL6, ¿cómo se resuelve el problema del CLUF? yum install no te da ninguna opción para aceptar, ¿alguna idea?
Darragh

¿Qué pasa con el sistema operativo Windows más común?
Sarz

1
Esta es una solución en una sola PC, no resolverá ningún problema de codificación, la forma correcta es usar extensiones de fuente. He publicado una respuesta
Petter Friberg

1
La respuesta es correcta para la situación en la que ya teníamos fuentes instaladas pero sin licencia aceptada. Estos son los pasos a seguir en caso de que esté a punto de realizar la primera instalación automatizada correctamente: sudo echo ttf-mscorefonts-installer msttcorefonts / accept-mscorefonts-eula select true | debconf-set-selections && apt-get install -y -q ttf-mscorefonts-installer
Aleksander Lech

35

JasperReports genera una excepción JRFontNotFoundException en el caso de que la fuente utilizada dentro de una plantilla de informe no esté disponible para la JVM como fuente del sistema o como fuente procedente de una extensión de fuente JR. Esto asegura que se eviten todos los problemas causados ​​por discrepancias en las métricas de fuentes y que tengamos una advertencia temprana sobre la inconsistencia.

Jasper Reports está tratando de ayudarlo en el desarrollo de su informe, indicando que no puede exportar su informe correctamente ya que no puede encontrar la fuente definida en TextFieldoStaticText

<font fontName="Arial"/>

Sí, puede desactivar esto configurando net.sf.jasperreports.awt.ignore.missing.font en verdadero, pero tendrá inconsistencias de exportación .

Sí, puede instalar la fuente como fuente del sistema JVM (pero debe hacerlo en cada PC utilizada que pueda generar informes y aún puede tener problemas de codificación ).

¡La forma correcta!

¡Utilice extensiones de fuente ! , si desea crear el suyo propio (ver enlace a continuación), los informes de jasper también distribuyen un jar ( jasperreports-fonts-x.x.x.jar) de extensión de fuente predeterminado , que admite fontName DejaVu Sans, DejaVu SerifyDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

De la guía definitiva de JasperReport:

Recomendamos encarecidamente a las personas que utilicen solo fuentes derivadas de extensiones de fuente, porque esta es la única forma de asegurarse de que las fuentes estarán disponibles para la aplicación cuando los informes se ejecuten en tiempo de ejecución. El uso de fuentes del sistema siempre conlleva el riesgo de que los informes no funcionen correctamente cuando se implementan en una máquina nueva que podría no tener esas fuentes instaladas.

Enlaces en StackOverflow sobre cómo renderizar fuentes correctamente en pdf

Lista de verificación sobre cómo renderizar la fuente correctamente en pdf

Genere extensiones de fuente con JasperSoft Studio

Genere extensiones de fuente con iReport


¿Podría decirme la razón por la cual Jasper y JVM no pudieron renderizar el PDF con una fuente que existe en el sistema (ubicada en C: \ windows \ fonts), en su lugar tengo que crear una extensión Jar Font y agregarla como una biblioteca en la ruta de clases del proyecto (estoy usando Java y Eclipse). Intenté buscar en Google la respuesta, pero no he encontrado una explicación comprensible. También veo este exporting-pdf-font-problem también con Apache FOP (no se necesita extensión de fuente, pero tuve que crear un archivo de métrica de fuente e hice algunas configuraciones adicionales para que la fuente se
renderice

1
@EagerToLearn todo se reduce a la biblioteca de itext que está generando el pdf, itext para representar correctamente las fuentes necesita extensiones de fuente (donde no solo se incluye la fuente, sino también la codificación, si se especifica ecc incrustado). Si no proporciona esto, itext hará lo que ellos llaman "mejor esfuerzo" para representar su fuente. No está haciendo lo que necesitamos (escrito en la documentación), hagamos nuestro mejor esfuerzo, pero la culpa es suya. Por lo tanto, la respuesta aceptada a esta pregunta no es correcta , se necesitan extensiones de fuente, si no las proporciona, tendrá que vivir con lo que se cree.
Petter Friberg

gracias por la respuesta, pero aún así, solo entiendo que el problema de la fuente se debe a la forma en que funciona la biblioteca iText. Puede ser que esta fuente esté mucho más allá de mi capacidad técnica para entender :(
EagerToLearn

@eag No es mucho más que esto para entender, para renderizar una fuente necesitas saber dónde está el .ttf y necesitas saber qué codificación del texto. Los desarrolladores de la biblioteca para conocer esta información han creado extensiones de fuente, si no la proporcionas, deben comenzar a adivinar, la razón por la que no funciona en algunos casos es porque la "suposición" no es correcta, pero no puedes culpar a la biblioteca por esto ya que le han proporcionado un sistema para evitar las "conjeturas"
Petter Friberg

22

Yo uso IReport para instalar la fuente:

herramientas -> opciones -> fuentes -> haga clic en instalar fuente

Luego seleccione la fuente y haga clic en

-> exportar como extensión y escriba el nombre myfont.jar

agregue este jar y también spring.jar * a su ruta de construcción.

* copiar spring.jar de Jaspersoft \ iReport-3.7.0 \ ireport \ modules \ ext


1
Para completar, el ttf arial está en c: / windows / fonts (al menos en win xp): arial.ttf, arialbd.ttf (negrita), ariali.ttf (cursiva), arialbi (negrita-cursiva)
jneira

Agregar spring.jar a la ruta de construcción lo solucionó.
Fishjd

Este método realmente funcionó para mí. Empaqueta la fuente como un archivo jar, lo agrega a la ruta de clase y las cosas simplemente funcionan.
Satya

Si la extensión de fuente está hecha correctamente, no es necesario agregar el archivo spring.jar.
Petter Friberg

Esta herramienta-> opciones-> fuentes-> haga clic en instalar no está disponible en mac. :( ¿alguna sugerencia?
L-Samuels

13

sudo apt-get install msttcorefonts funciona (en nuestro entorno de desarrollo Ubuntu), pero no es una muy buena solución.

En su lugar, agrupamos las fuentes con nuestra aplicación según este consejo . Su archivo JAR incluye las siguientes fuentes,

  • Arial
  • Times New Roman
  • Mensajero Nuevo
  • Comic Sans MS
  • Georgia
  • Verdana
  • Monoespaciado

Enlace directo para descargar jar: Maven ver 1.0. DynamicFonts


Esto ahora se puede descargar del repositorio mvn estándar, por ejemplo: mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts
Markus Pscheidt

12

Para CentOS:

wget msttcorefonts

Entonces:

tar -zxvf msttcorefonts.tar.gz
cp msttcorefonts/*.ttf  /usr/share/fonts/TTF/
fc-cache -fv 

Después de todo, reinicie JVM.


9

Hay tres métodos para evitar este problema.

Método 1: estableciendo ignorar la propiedad de fuente que falta.

JRProperties.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");

o puede establecer esta propiedad ingresando la siguiente línea en el archivo .jrxml.

<property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

Método 2: estableciendo la propiedad de fuente predeterminada.

JRProperties.setProperty("net.sf.jasperreports.default.font.name", "Sans Serif");

o puede establecer esta propiedad ingresando la siguiente línea en el archivo .jrxml.

<property name="net.sf.jasperreports.default.font.name" value="Sans Serif"/>

Método 3: agregando la propiedad de fuente faltante.

En primer lugar, instale las fuentes que faltan en IReport seleccionando "Herramientas >> Opciones >> Fuentes >> Instalar fuente", luego seleccione todas las fuentes y exporte esto haciendo clic en "Exportar como extensión" con la extensión .jar.

Puede usar este jar para Jasperreports-font.XXXjar que estará presente en la biblioteca de su proyecto o en la ruta de clases.


5

Resolví esto eligiendo 'SansSerif' o 'Serif' solo y no 'Arial' o 'Times New Roman'.


6
Según la documentación de la excepción ( jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/… ), este método NO se recomienda explícitamente. Puede causar problemas de representación inesperados, ya que estas fuentes pueden asignarse a diferentes fuentes del sistema en diferentes sistemas.
Doug

3

Si está utilizando maven en su proyecto, puede simplemente agregar la dependencia jasper-fonts a pom.xml:

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports-fonts</artifactId>
    <version>6.8.1</version>
</dependency>

La instalación de la fuente que falta en el sistema puede ser una solución de trabajo, pero no para mí, no quería tener que instalar las fuentes que faltaban después de cada implementación en un nuevo servidor, sino que opté por incrustar la fuente con la aplicación.

Saludos.


2

puede crear sus fuentes personalizadas a través de iReport y convertir archivos como jar


2

Intenta agregar la línea

net.sf.jasperreports.awt.ignore.missing.font = true

a su archivo jasperreports.properties.

Jasper deja de encontrar una fuente


1
y es una mala idea ... exportar inconsistencias!
Petter Friberg

@PetterFriberg no, es un buen mecanismo de respaldo. No siempre puedes controlar la JVM. SIEMPRE es una buena idea tener un mecanismo de respaldo, incluso si el resultado no es ideal, es mejor que un bloqueo de la aplicación causado por una fuente faltante en la máquina del cliente.
partir del

@jwenting agrega extensiones de fuente y no se bloqueará. Créame, si está deshabilitando, está haciendo algo mal, se generarán informes incorrectos en su lugar, debe resolver el problema de raíz (faltan extensiones de fuente). Y sí, siempre puedes controlar JVM.
Petter Friberg

@jwenting Tenga en cuenta: la solución no es instalar fuentes en el servidor (como dice la respuesta de aceptación, ¡está mal!). La solución es generar y agregar extensiones de fuente dependientes. Vea esto para obtener la respuesta correcta stackoverflow.com/a/35549391
Petter Friberg

@PetterFriberg que a menudo es imposible. Por ejemplo, la aplicación que mantengo se ejecuta en un servidor, pero permite al usuario agregar archivos .jrxml personalizados con una convención de nomenclatura específica para generar informes personalizados más allá de lo que proporcionamos como estándar. No queremos que esos informes se bloqueen si el servidor no tiene las fuentes disponibles que especifica .jrxml, por lo que usamos una alternativa.
entrado el

2

Puede hacerlo instalando fuentes, es decir, en cualquier lugar donde desee ejecutar esa aplicación en particular. La forma más sencilla es simplemente agregar esta línea bl a su archivo jrxml:

 <property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

Espero eso ayude.


1
Sin embargo, esto creará inconsistencias de exportación (por lo tanto, no se puede renderizar con la fuente indicada en jrxml). Mira mi respuesta.
Petter Friberg

2

Para Debian

añadir

non-free contrib

a deb y deb-src en /etc/apt/sources.list es decir:

deb http://ftp.debian.org/debian/ squeeze main non-free contrib
deb-src http://ftp.debian.org/debian/ squeeze main non-free contrib

Entonces

apt-get update
apt-get install msttcorefonts

Por supuesto, deberá reiniciar jasperserver. es decir:

/opt/jasperreports-server-cp-4.5.0/ctlscript.sh restart

Cambie por su versión / ruta.


2

Enfrenté el problema con mi aplicación web basada en Spring 3 e implementada en Weblogic 10.3 en Oracle Linux 6. La solución mencionada en el enlace no funcionó para mí.

Tuve que seguir los siguientes pasos: 1. Copie los archivos de fuentes Arial * .ttf al directorio JROCKIT_JAVA_HOME / jre / lib / fonts 2. Realice entradas de las fuentes en fontconfig.properties.src 3. Reinicie el clúster desde la consola de Weblogic

filename.Arial=Arial.ttf
filename.Arial_Bold=Arial_Bold.ttf
filename.Arial_Italic=Arial_Italic.ttf
filename.Arial_Bold_Italic=Arial_Bold_Italic.ttf

1

Crear informe jasper en varios idiomas (Unicode)

1) Instalar fuente en ireport desginer

2) crear una extensión de fuente (la usaremos en la ruta de clases de las aplicaciones)

3) instalar la fuente en el sistema operativo (opcional)

4) pegue todos los .ttf de la fuente en jre-> lib-> directorio de fuentes (de lo contrario, la aplicación web arrojará un error, la fuente no está disponible para JVM)


0

En realidad, solucioné este problema de una manera muy simple.

  1. ve a tu home path, como/root
  2. crea una carpeta llamada .fonts
  3. copie su all your font filesa .fonts, puede copiar la fuente de C:\windows\fontssi usa Windows.
  4. sudo apt-get install fontconfig
  5. fc-cache –fv para reconstruir cachés de fuentes.

0

Solución en 2 pasos (si está usando centOS)

  1. Descargue el paquete rpm de fuentes principales de Microsoft.

    [root@WEBSVR~/]# wget http://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
    
  2. Instale el paquete rpm.

    [root@WEBSVR~/]# rpm -Uvh msttcore-fonts-2.0-3.noarch.rpm
    


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.