A fonte não está disponível para JVM com relatórios Jasper

94

Estou tentando gerar um relatório com DynamicJasper, mas estou recebendo o seguinte erro:

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

msttcorefonts está instalado, mas acho que o JVM não está usando nenhuma fonte dele.

Estou usando o Ubuntu 10.04.

Como posso consertar isso?

Andrew
fonte
3
Na verdade, estou ignorando ... apenas defina a seguinte "net.sf.jasperreports.awt.ignore.missing.font = true" má ideia ... mas resolve o problema por um momento ...
Andrew,
Você precisaria instalar fontes microsoft no Ubuntu, consulte este link para obter informações .. embraceubuntu.com/2005/09/09/installing-microsoft-fonts
Sivaramakrishnan
1
onde você define isso? estou trabalhando com uma versão incorporada de jasperreports em jbilling onde nenhum arquivo jasperreports.properties existe para editar.
Darragh de
1
@Andrew, esta não parece uma boa solução (sei que a pergunta é antiga), mas talvez seja melhor evitarmos a inconsistência de relatórios, já repassei a resposta.
Petter Friberg

Respostas:

66

Tentei instalar mscorefonts, mas o pacote estava instalado e atualizado.

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

Tentei pesquisar a fonte no sistema de arquivos, com:

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

Esta pasta continha apenas o README, com as instruções corretas de instalação.

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

Você precisa de uma conexão com a Internet para isso:

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

Eu reinstalei ttf-mscorefonts-installer(como mostrado acima, certificando-se de aceitar o EULA!) E o problema foi resolvido.

Braully Rocha
fonte
5
Para sua informação, em outras versões do Linux, tente sudo apt-get install msttcorefonts
KCD
para CentOS e RHEL6 como você resolve o problema do EULA? yum install não lhe dá nenhuma opção de aceitar, alguma ideia?
Darragh de
E o sistema operacional Windows mais comum?
Sarz
1
Esta é uma solução alternativa para um único pc, não resolverá nenhum problema de codificação, a maneira correta é usar extensões de fonte. Eu postei uma resposta
Petter Friberg
1
A resposta está correta para a situação em que tínhamos fontes já instaladas, mas sem licença aceita. Aqui estão as etapas a serem executadas caso você esteja prestes a executar a primeira instalação automatizada corretamente: sudo echo ttf-mscorefonts-installer msttcorefonts / stored-mscorefonts-eula select true | debconf-set-selections && apt-get install -y -q ttf-mscorefonts-installer
Aleksander Lech
35

JasperReports gera uma JRFontNotFoundException no caso em que a fonte usada dentro de um modelo de relatório não está disponível para a JVM como uma fonte do sistema ou como uma fonte vinda de uma extensão de fonte JR. Isso garante que todos os problemas causados ​​por incompatibilidades de métricas de fonte sejam evitados e tenhamos um aviso prévio sobre a inconsistência.

Jasper reports está tentando ajudá-lo no desenvolvimento de seu relatório, afirmando que não pode exportar seu relatório corretamente, pois não consegue encontrar a fonte definida em TextFieldouStaticText

<font fontName="Arial"/>

Sim, você pode desabilitar isso configurando net.sf.jasperreports.awt.ignore.missing.font como true, mas você terá inconsistências de exportação .

Sim, você pode instalar a fonte como fonte do sistema JVM (mas você precisa fazer isso em cada PC usado que pode gerar relatório e você ainda pode ter problemas de codificação ).

Da maneira correta!

Use extensões de fonte ! , se você gosta de criar o seu próprio (veja o link abaixo), os relatórios jasper também distribuem um jar ( jasperreports-fonts-x.x.x.jar) de extensão de fonte padrão , que suporta fontName DejaVu Sans, DejaVu SerifeDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

Do JasperReport Ultimate Guide:

Nós encorajamos fortemente as pessoas a usarem apenas fontes derivadas de extensões de fontes, porque esta é a única maneira de garantir que as fontes estarão disponíveis para o aplicativo quando os relatórios forem executados em tempo de execução. Usar fontes do sistema sempre traz o risco de os relatórios não funcionarem corretamente quando implantados em uma nova máquina que pode não ter essas fontes instaladas

Links no StackOverflow sobre como renderizar fontes corretamente em pdf

Lista de verificação sobre como renderizar a fonte corretamente em pdf

Gere extensões de fonte com JasperSoft Studio

Gere extensões de fonte com iReport

Petter Friberg
fonte
Você poderia me dizer o motivo pelo qual Jasper e JVM não conseguiram renderizar o PDF com uma fonte que existe no sistema (localizada em C: \ windows \ fonts), em vez disso, tenho que criar uma extensão Jar Font e adicioná-la como uma biblioteca em o caminho da classe do projeto (estou usando Java e Eclipse). Eu tentei google para a resposta, mas não encontrei uma explicação compreensível. Também vejo problemas de exportação de fontes de pdf com Apache FOP (nenhuma extensão de fonte necessária, mas tive que criar um arquivo de métrica de fonte e fiz algumas configurações extras para a fonte ser renderizada corretamente)
EagerToLearn
1
@EagerToLearn tudo se resume à biblioteca itext que está gerando o pdf, itext para renderizar fontes corretamente precisa de extensões de fonte (onde não apenas a fonte é incluída, mas também a codificação, se o ecc incorporado for especificado). Se você não fornecer isso, o itext fará o que eles chamam de "melhor esforço" para renderizar sua fonte. Você não está fazendo o que precisamos (escrito na documentação), vamos fazer o nosso melhor, mas a culpa é sua. Portanto, a resposta aceita para esta questão não está correta !, Extensões de fonte são necessárias, se você não fornecer, terá que conviver com o que for criado.
Petter Friberg
obrigado pela resposta, mas ainda assim entendi que o problema da fonte é devido à forma como a biblioteca iText funciona. Pode ser que essa fonte esteja muito além da minha capacidade técnica de entender :(
EagerToLearn
@eag Não é muito mais que isso para entender, para renderizar uma fonte você precisa saber onde está o .ttf e você precisa saber qual é a codificação do texto. Os desenvolvedores da lib para saber esta informação criaram extensões de fonte, se você não fornecer eles precisam começar a adivinhar, porque não está funcionando em alguns casos é porque a "suposição" não está correta, mas você não pode culpar a lib por isso, pois eles forneceram a você um sistema para evitar a "suposição"
Petter Friberg
22

Eu uso o IReport para instalar a fonte:

ferramentas -> opções -> fontes -> clique em instalar fonte

Em seguida, selecione a fonte e clique

-> exportar como extensão e digitar o nome myfont.jar

adicione este jar e também spring.jar * ao seu caminho de construção.

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

Juan
fonte
1
Para completar, o arial ttf está em c: / windows / fonts (pelo menos no win xp): arial.ttf, arialbd.ttf (negrito), ariali.ttf (itálico), arialbi (negrito-itálico)
jneira
Adicionar spring.jar ao caminho de construção corrigiu o problema.
fishjd
Este método realmente funcionou para mim. Ele empacota a fonte como um arquivo jar, você a adiciona ao classpath e as coisas simplesmente funcionam.
Satya
Se a extensão da fonte for feita corretamente, não há necessidade de adicionar o spring.jar.
Petter Friberg
Estas ferramentas-> opções-> fontes-> clique em instalar não estão disponíveis no mac. :( alguma sugestão?
L-Samuels
14

sudo apt-get install msttcorefonts funciona (em nosso ambiente de desenvolvimento Ubuntu), mas não é uma solução muito boa.

Em vez disso, agrupamos as fontes com nosso aplicativo com base nesta dica . Seu arquivo JAR agrupa as seguintes fontes,

  • Arial
  • Times New Roman
  • Courier New
  • Comic Sans MS
  • Georgia
  • Verdana
  • Monoespaçado

Link direto para baixar o jar: Maven versão 1.0. DynamicFonts

user799188
fonte
Isso agora pode ser baixado do repositório mvn padrão, por exemplo: mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts
Markus Pscheidt
12

Para CentOS:

wget msttcorefonts

Então:

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

Afinal, reinicie o JVM.

Ricardo Carmo
fonte
9

Existem três métodos para evitar esse problema.

Método 1: definindo ignorar propriedade de fonte ausente.

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

ou você pode definir essa propriedade inserindo a seguinte linha no arquivo .jrxml.

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

Método 2: definindo a propriedade da fonte padrão.

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

ou você pode definir essa propriedade inserindo a seguinte linha no arquivo .jrxml.

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

Método 3: adicionando propriedade de fonte ausente.

Em primeiro lugar, instale as fontes ausentes no IReport selecionando "Ferramentas >> Opções >> Fontes >> Instalar fonte", em seguida, selecione todas as fontes e exporte-as clicando em "Exportar como extensão" com extensão .jar.

Você pode usar este jar para Jasperreports-font.XXXjar que estará presente em sua biblioteca de projeto ou classpath.

Mayur Bhokase
fonte
5

Resolvi isso escolhendo 'SansSerif' ou 'Serif' apenas e não 'Arial' ou 'Times New Roman'.

lkdg
fonte
6
De acordo com a documentação da exceção ( jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/… ), este método NÃO é explicitamente recomendado. Isso pode causar problemas de renderização inesperados, pois essas fontes podem ser mapeadas para diferentes fontes de sistema em diferentes sistemas.
Doug
3

Se você estiver usando o maven em seu projeto, pode apenas adicionar a dependência jasper-fonts a pom.xml:

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

Instalar a fonte ausente no sistema pode ser uma solução funcional, mas não para mim, eu não queria ter que instalar as fontes ausentes após cada implantação em um novo servidor, em vez disso, optei por incorporar a fonte ao aplicativo.

Saudações.

Yassir
fonte
2

pode fazer suas fontes personalizadas através do iReport e convertendo como arquivos jars

mavirroco
fonte
2

Tente adicionar a linha

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

ao seu arquivo jasperreports.properties.

Jasper para de encontrar uma fonte

Enrico Sanna
fonte
1
e é uma má ideia ... inconsistências de exportação!
Petter Friberg
@PetterFriberg não, é um bom mecanismo de fallback. Você nem sempre pode controlar o JVM. É SEMPRE uma boa ideia ter um mecanismo de fallback, mesmo se o resultado não for o ideal, é melhor do que um travamento do aplicativo causado por uma fonte ausente na máquina do cliente.
início de
@jwenting adicione extensões de fonte e não irá travar. Acredite em mim, se você estiver desabilitando, você está fazendo algo errado, você terá relatórios incorretos gerados em vez disso, você deve resolver o problema raiz (extensões de fonte ausentes). E sim, você sempre pode controlar o JVM.
Petter Friberg
@jwenting Observação: a solução não é instalar fontes no servidor (como diz a resposta de aceitação, está errado!). A solução é gerar e adicionar extensões de fonte às dependências. Veja esta resposta correta stackoverflow.com/a/35549391
Petter Friberg
@PetterFriberg que geralmente é impossível. Por exemplo, o aplicativo que mantenho é executado em um servidor, mas permite que o usuário adicione arquivos .jrxml personalizados com uma convenção de nomenclatura específica para gerar relatórios personalizados além do que fornecemos como padrão. Não quer que esses relatórios travem se o servidor não tiver as fontes disponíveis que o .jrxml especifica, então usamos um fallback.
início de
2

Você pode fazer isso instalando fontes, o que significa em todos os lugares onde você deseja executar aquele aplicativo específico. A maneira mais simples é adicionar esta linha bl ao seu arquivo jrxml:

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

Espero que ajude.

Stephen
fonte
1
No entanto, isso criará inconsistências de exportação (portanto, não pode ser renderizado com a fonte indicada em jrxml). Veja minha resposta.
Petter Friberg
2

Para Debian

adicionar

non-free contrib

para deb e deb-src em /etc/apt/sources.list ou seja:

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

Então

apt-get update
apt-get install msttcorefonts

Claro, você precisará reiniciar o jasperserver. ie:

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

Mude para sua versão / caminho.

d -_- b
fonte
2

Enfrentei o problema com meu aplicativo da web baseado no Spring 3 e implantado no Weblogic 10.3 no Oracle Linux 6. A solução mencionada no link não funcionou para mim.

Tive que seguir os seguintes passos - 1. Copie os arquivos de fonte Arial * .ttf para o diretório JROCKIT_JAVA_HOME / jre / lib / fonts 2. Faça as entradas das fontes em fontconfig.properties.src 3. Reinicie o cluster no console do 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
Ujjwal
fonte
1

Criar relatório jasper em vários idiomas (Unicode)

1) Instale a fonte no ireport desginer

2) criar extensão de fonte (vamos usá-la no classpath de aplicativos)

3) instalar fonte no sistema operacional (opcional)

4) cole todos os .ttf da fonte no diretório jre-> lib-> fonts (caso contrário, o aplicativo da web lançará um erro de fonte não disponível para JVM)

rushabh
fonte
0

Na verdade, resolvi esse problema de uma maneira muito simples

  1. vai para o seu home pathgosto/root
  2. crie uma pasta chamada .fonts
  3. copie seu all your font filespara .fonts, você pode copiar a fonte de C:\windows\fontsse usar o Windows.
  4. sudo apt-get install fontconfig
  5. fc-cache –fv para reconstruir caches de fontes.
Saorikido
fonte
0

Solução em 2 etapas (se você estiver usando o centOS)

  1. Baixe o pacote rpm das fontes principais da Microsoft.

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

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

Copie suas fontes no seguinte diretório JDK_HOME \ jre \ lib \ fonts

Ahmad Zyoud
fonte