Il carattere non è disponibile per la JVM con Jasper Reports


91

Sto cercando di generare report con DynamicJasper, ma ricevo il seguente errore:

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

msttcorefonts è installato, ma immagino che la JVM non utilizzi alcun tipo di carattere.

Sto usando Ubuntu 10.04.

Come posso risolvere questo problema?


3
In realtà lo sto ignorando ... imposta semplicemente il seguente "net.sf.jasperreports.awt.ignore.missing.font = true" cattiva idea ... ma risolve il problema per un momento ....
Andrew

Dovresti installare i font microsoft in Ubuntu, fare riferimento a questo collegamento per informazioni .. embraceubuntu.com/2005/09/09/installing-microsoft-fonts
Sivaramakrishnan

1
dove lo metti? Sto lavorando con una versione incorporata di jasperreports in jbilling dove non esiste alcun file jasperreports.properties da modificare.
Darragh


1
@Andrew, questa non sembra una buona soluzione (so che la domanda è vecchia), ma forse è meglio che evitiamo rapporti incoerenti, ho passato la risposta.
Petter Friberg

Risposte:


63

Ho provato a installare mscorefonts, ma il pacchetto è stato installato e aggiornato.

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

Ho provato a cercare il carattere nel filesystem, con:

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

Questa cartella aveva appena il README, con le istruzioni corrette su come installare.

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

Hai bisogno di una connessione Internet per questo:

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

Ho reinstallato ttf-mscorefonts-installer(come mostrato sopra, assicurandomi di accettare l'EULA!) E il problema è stato risolto.


5
Cordiali saluti su altri gusti Linux prova sudo apt-get install msttcorefonts
KCD

per CentOS e RHEL6 come risolvete il problema dell'EULA? yum install non ti dà alcuna possibilità di accettare, qualche idea?
Darragh

E il sistema operativo Windows più comune?
Sarz

Questa è una soluzione su un singolo PC, non risolverà alcun problema di codifica, il modo corretto è usare le estensioni dei caratteri Ho postato una risposta
Petter Friberg

1
La risposta è corretta per la situazione in cui avevamo i caratteri già installati ma senza licenza accettata. Di seguito sono riportati i passaggi da eseguire nel caso in cui si stia per eseguire correttamente la prima installazione automatica: 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 un'eccezione JRFontNotFoundException nel caso in cui il carattere utilizzato all'interno di un modello di report non sia disponibile per la JVM come carattere di sistema o come carattere proveniente da un'estensione di carattere JR. Ciò garantisce che tutti i problemi causati da mancate corrispondenze delle metriche dei caratteri siano evitati e riceviamo un avviso tempestivo sull'incongruenza.

Jasper reports sta cercando di aiutarti nello sviluppo del tuo rapporto, affermando che non può esportare correttamente il tuo rapporto poiché non riesce a trovare il carattere definito in TextFieldoStaticText

<font fontName="Arial"/>

Sì, puoi disabilitarlo impostando net.sf.jasperreports.awt.ignore.missing.font su true ma avrai incoerenze nell'esportazione .

Sì, puoi installare il font come font di sistema JVM (ma devi farlo su ogni PC utilizzato che può generare report e puoi ancora avere problemi di codifica ).

Il modo corretto!

Usa le estensioni dei caratteri ! , se desideri crearne uno tuo (vedi link sotto), i rapporti jasper distribuiscono anche un'estensione font predefinita jar ( jasperreports-fonts-x.x.x.jar), che supporta fontName DejaVu Sans, DejaVu SerifeDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

Dalla guida definitiva di JasperReport:

Incoraggiamo vivamente le persone a utilizzare solo caratteri derivati ​​da estensioni di caratteri, perché questo è l'unico modo per assicurarsi che i caratteri siano disponibili per l'applicazione quando i rapporti vengono eseguiti in fase di esecuzione. L'uso dei caratteri di sistema comporta sempre il rischio che i rapporti non funzionino correttamente quando vengono distribuiti su una nuova macchina che potrebbe non avere quei caratteri installati

Collegamenti su StackOverflow su come rendere correttamente i caratteri in pdf

Elenco di controllo su come rendere correttamente il font in pdf

Genera estensioni dei caratteri con JasperSoft Studio

Genera estensioni dei caratteri con iReport


Potresti dirmi il motivo per cui Jasper e JVM non sono riusciti a rendere il PDF con un font che esiste nel sistema (situato in C: \ windows \ fonts), invece devo creare un'estensione Jar Font e aggiungerla come libreria in il percorso di classe del progetto (sto usando Java ed Eclipse). Ho provato a cercare su Google la risposta ma non ho trovato una spiegazione comprensibile. Inoltre vedo anche questi problemi di esportazione-pdf-font con Apache FOP (non è necessaria alcuna estensione del font ma ho dovuto creare un file-metrico-font e ho fatto alcune configurazioni extra per rendere il font correttamente)
EagerToLearn

1
@EagerToLearn tutto si riduce alla libreria itext che sta generando il pdf, itext per visualizzare correttamente i font necessita delle estensioni dei font (dove non solo il font è incluso ma anche la codifica, se è specificato ecc incorporato). Se non lo fornisci, itext farà quello che chiamano "massimo sforzo" per rendere il tuo carattere. Non stai facendo ciò di cui abbiamo bisogno (scritto nella documentazione), facciamo del nostro meglio, ma la colpa è tua. Quindi la risposta accettata a questa domanda non è corretta !, Le estensioni dei caratteri sono necessarie, se non le fornisci dovrai convivere con tutto ciò che viene creato.
Petter Friberg

grazie per la risposta, ma ho ancora capito che il problema dei font è dovuto al modo in cui funziona la libreria iText. Può essere che questo carattere vada ben oltre le mie capacità tecniche di comprensione :(
EagerToLearn

@eag Non è molto più di questo per capire, per rendere un font devi sapere dove si trova il .ttf e devi sapere cosa codifica il testo. Gli sviluppatori della libreria per conoscere queste informazioni hanno creato estensioni dei caratteri, se non le fornisci devono iniziare a indovinare, perché in alcuni casi non funziona è perché "indovinare" non è corretto, ma non puoi incolpare la libreria per questo poiché ti hanno fornito un sistema per evitare di "indovinare"
Petter Friberg

22

Uso IReport per installare il font:

strumenti -> opzioni -> caratteri -> fai clic su installa carattere

Quindi seleziona il carattere e fai clic

-> esporta come estensione e digita il nome myfont.jar

aggiungi questo jar e anche spring.jar * al tuo percorso di build.

* copia spring.jar da Jaspersoft \ iReport-3.7.0 \ ireport \ modules \ ext


1
Per il completamento, il ttf arial è in c: / windows / fonts (almeno in win xp): arial.ttf, arialbd.ttf (grassetto), ariali.ttf (corsivo), arialbi (grassetto corsivo)
jneira

L'aggiunta di spring.jar al percorso di build lo ha risolto.
fishjd

Questo metodo ha effettivamente funzionato per me. Comprende il font come file jar, lo aggiungi al classpath e le cose funzionano.
Satya

Se l'estensione del carattere è corretta, non è necessario aggiungere spring.jar.
Petter Friberg

Questo strumento-> opzioni-> caratteri-> fai clic su installa non è disponibile su mac. :( qualche suggerimento?
L-Samuels

13

sudo apt-get install msttcorefonts funziona (sul nostro ambiente di sviluppo Ubuntu), ma non è una soluzione molto buona.

Invece, abbiamo raggruppato i caratteri con la nostra applicazione basata su questo suggerimento . Il loro file JAR raggruppa i seguenti caratteri,

  • Arial
  • Times New Roman
  • Courier New
  • Comic Sans MS
  • Georgia
  • Verdana
  • Monospaziato

Link diretto per scaricare jar: Maven ver 1.0. DynamicFonts


Questo ora può essere scaricato dal repository mvn standard, ad esempio: mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts
Markus Pscheidt

12

Per CentOS:

wget msttcorefonts

Poi:

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

Dopo tutto, riavvia JVM.


9

Esistono tre metodi per evitare questo problema.

Metodo 1: impostando ignora la proprietà del carattere mancante.

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

oppure puoi impostare questa proprietà inserendo la seguente riga nel file .jrxml.

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

Metodo 2: impostando la proprietà del carattere predefinita.

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

oppure puoi impostare questa proprietà inserendo la seguente riga nel file .jrxml.

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

Metodo 3: aggiungendo la proprietà del carattere mancante.

Innanzitutto installa i caratteri mancanti in IReport selezionando "Strumenti >> Opzioni >> Caratteri >> Installa carattere", quindi seleziona tutti i caratteri ed esporta facendo clic su "Esporta come estensione" con estensione .jar.

Puoi usare questo jar per Jasperreports-font.XXXjar che sarà presente nella libreria del tuo progetto o nel classpath.



3

Se stai usando Maven nel tuo progetto, puoi semplicemente aggiungere la dipendenza jasper-fonts a pom.xml:

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

L'installazione del font mancante sul sistema può essere una soluzione funzionante ma non per me, non volevo dover installare i font mancanti dopo ogni distribuzione in un nuovo server, invece ho optato per incorporare il font con l'applicazione.

Saluti.


2

puoi creare i tuoi caratteri personalizzati tramite iReport e convertire i file come jar


2

Prova ad aggiungere la linea

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

al file jasperreports.properties.

Jasper smette di trovare un font


1
ed è una cattiva idea ... esportare incongruenze!
Petter Friberg

@PetterFriberg no, è un buon meccanismo di ripiego. Non puoi sempre controllare la JVM. È SEMPRE una buona idea avere un meccanismo di fallback, anche se il risultato non è l'ideale è meglio di un crash dell'applicazione causato da un font mancante su una macchina del cliente.
jwenting

@jwenting aggiunge font-extensions e non andrà in crash. Credimi se stai disabilitando stai facendo qualcosa di sbagliato, verranno generati rapporti errati invece dovresti risolvere il problema alla radice (estensioni dei caratteri mancanti). E sì, puoi sempre controllare JVM.
Petter Friberg

@jwenting Nota: la soluzione è non installare i caratteri sul server (come dice la risposta di accettazione, è sbagliato!). La soluzione è generare e aggiungere estensioni dei font dei dipendenti. Vedi questo per la risposta corretta stackoverflow.com/a/35549391
Petter Friberg

@PetterFriberg che spesso è impossibile. Ad esempio, l'applicazione che mantengo viene eseguita su un server, ma consente all'utente di aggiungere file .jrxml personalizzati con una convenzione di denominazione specifica per generare report personalizzati al di sopra di quanto fornito di serie. Non vuoi che quei rapporti si blocchino se il server non ha i caratteri disponibili che il .jrxml specifica, quindi usiamo un fallback.
jwenting

2

Puoi farlo installando i caratteri, il che significa ovunque tu voglia eseguire quella particolare applicazione. Il modo più semplice è aggiungere questa riga bl al tuo file jrxml:

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

Spero che sia d'aiuto.


1
Ciò creerà tuttavia incongruenze di esportazione (quindi non può essere visualizzato con il carattere indicato in jrxml). Vedi la mia risposta.
Petter Friberg

2

Per Debian

Inserisci

non-free contrib

a deb e deb-src in /etc/apt/sources.list cioè:

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

Poi

apt-get update
apt-get install msttcorefonts

Ovviamente dovrai riavviare jasperserver. cioè:

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

Cambia per la tua versione / percorso.


2

Ho affrontato il problema con la mia applicazione web basata su Spring 3 e distribuita su Weblogic 10.3 su Oracle Linux 6. La soluzione menzionata al collegamento non ha funzionato per me.

Ho dovuto eseguire i seguenti passaggi: 1. Copiare i file dei caratteri Arial * .ttf nella directory JROCKIT_JAVA_HOME / jre / lib / fonts 2. Inserire i caratteri in fontconfig.properties.src 3. Riavvia il cluster dalla console 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

Crea report jasper in più lingue (Unicode)

1) Installa il font in ireport desginer

2) crea l'estensione del carattere (la useremo nel classpath delle applicazioni)

3) installa il font su sistema operativo (opzionale)

4) incolla tutto il .ttf del carattere nella directory jre-> lib-> fonts (altrimenti l'applicazione web genererà un errore di font non disponibile per JVM)


0

In realtà ho risolto questo problema in un modo molto semplice

  1. vai al tuo home path, mi piace/root
  2. creare una cartella denominata .fonts
  3. copia il tuo all your font filesin .fonts, puoi copiare il carattere da C:\windows\fontsse usi Windows.
  4. sudo apt-get install fontconfig
  5. fc-cache –fv per ricostruire le cache dei font.

0

Soluzione in 2 passaggi (se stai usando centOS)

  1. Scarica il pacchetto rpm dei font Microsoft core.

    [root@WEBSVR~/]# wget http://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
    
  2. Installa il pacchetto rpm.

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.