Die Schriftart steht der JVM mit Jasper Reports nicht zur Verfügung

87

Ich versuche, einen Bericht mit DynamicJasper zu erstellen, erhalte jedoch den folgenden Fehler:

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

msttcorefonts ist installiert, aber ich denke, die JVM verwendet keine Schriftarten davon.

Ich benutze Ubuntu 10.04.

Wie kann ich das beheben?

Andrew
quelle
3
Ich ignoriere es tatsächlich ... setze einfach die folgende "net.sf.jasperreports.awt.ignore.missing.font = true" schlechte Idee ... aber löst das Problem für einen Moment ...
Andrew
Sie müssten Microsoft-Schriftarten in Ubuntu installieren. Weitere
Sivaramakrishnan
1
wo stellst du das ein Ich arbeite mit einer eingebetteten Version von Jasperreports in Jbilling, in der keine Datei jasperreports.properties zum Bearbeiten vorhanden ist.
Darragh
1
@ Andrew, dies scheint keine gute Lösung zu sein (ich weiß, dass die Frage alt ist), aber vielleicht ist es besser, dass wir Inkonsistenzen bei Berichten vermeiden. Ich habe die Antwort weitergegeben.
Petter Friberg

Antworten:

62

Ich habe versucht, mscorefonts zu installieren, aber das Paket wurde installiert und auf dem neuesten Stand.

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

Ich habe versucht, im Dateisystem nach der Schriftart zu suchen, mit:

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

Dieser Ordner hatte gerade die README-Datei mit den korrekten Anweisungen zur Installation.

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

Dazu benötigen Sie eine Internetverbindung:

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

Ich habe neu installiert ttf-mscorefonts-installer(wie oben gezeigt, um sicherzustellen, dass die EULA akzeptiert wird!) Und das Problem wurde gelöst.

Braully Rocha
quelle
4
FYI auf anderen Linux-Varianten versuchen sudo apt-get installieren msttcorefonts
KCD
Wie lösen Sie für CentOS und RHEL6 das EULA-Problem? yum install gibt dir keine möglichkeit zu akzeptieren, irgendwelche ideen?
Darragh
Was ist mit dem gängigsten Windows-Betriebssystem?
Sarz
Dies ist eine Problemumgehung auf einem einzelnen PC, es werden keine Codierungsprobleme gelöst. Der richtige Weg ist die Verwendung von Font-Erweiterungen. Ich habe eine Antwort gepostet
Petter Friberg
1
Die Antwort ist richtig für die Situation, in der wir bereits Schriftarten installiert hatten, jedoch ohne akzeptierte Lizenz. Hier sind die Schritte, die Sie ausführen müssen, falls Sie die erste automatisierte Installation korrekt durchführen möchten: sudo echo ttf-mscorefonts-installer msttcorefonts / accept-mscorefonts-eula select true | debconf-set-selections && apt-get install -y -q ttf-mscorefonts-installer
Aleksander Lech
33

JasperReports löst eine JRFontNotFoundException aus, wenn die in einer Berichtsvorlage verwendete Schriftart für die JVM weder als Systemschriftart noch als Schriftart aus einer JR-Schriftartenerweiterung verfügbar ist. Dadurch wird sichergestellt, dass alle Probleme vermieden werden, die durch nicht übereinstimmende Schriftmetriken verursacht werden, und wir werden frühzeitig vor Inkonsistenzen gewarnt.

Jasper Reports versucht, Ihnen bei der Berichtsentwicklung zu helfen , und gibt an, dass Ihr Bericht nicht korrekt exportiert werden kann, da die in TextFieldoder definierte Schriftart nicht gefunden werden kannStaticText

<font fontName="Arial"/>

Ja, Sie können dies deaktivieren, indem Sie net.sf.jasperreports.awt.ignore.missing.font auf true setzen. Es treten jedoch Exportinkonsistenzen auf .

Ja, Sie können die Schriftart als JVM-Systemschriftart installieren (Sie müssen dies jedoch auf jedem verwendeten PC tun, auf dem möglicherweise Berichte erstellt werden, und es können weiterhin Codierungsprobleme auftreten ).

Der richtige Weg!

Verwenden Sie Font Extensions ! Wenn Sie, wie Sie Ihre eigenen erstellen (siehe Link unten), Jasper Reports verteilt auch eine Standard - Schriftart-Erweiterung jar ( jasperreports-fonts-x.x.x.jar), dass Stützen Schriftname DejaVu Sans, DejaVu SerifundDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

Aus dem JasperReport Ultimate Guide:

Wir empfehlen dringend, nur Schriftarten zu verwenden, die von Schriftartenerweiterungen abgeleitet sind, da nur so sichergestellt werden kann, dass die Schriftarten der Anwendung zur Verfügung stehen, wenn die Berichte zur Laufzeit ausgeführt werden. Die Verwendung von Systemschriftarten birgt immer das Risiko, dass die Berichte nicht ordnungsgemäß funktionieren, wenn sie auf einem neuen Computer bereitgestellt werden, auf dem diese Schriftarten möglicherweise nicht installiert sind

Links zu StackOverflow zum korrekten Rendern von Schriftarten im PDF-Format

Checkliste zum korrekten Rendern von Schriftarten im PDF-Format

Generieren Sie Font-Erweiterungen mit JasperSoft Studio

Generieren Sie Font-Erweiterungen mit iReport

Petter Friberg
quelle
Können Sie mir den Grund nennen, warum Jasper und JVM die PDF-Datei nicht mit einer im System vorhandenen Schriftart (unter C: \ windows \ fonts) rendern konnten? Stattdessen muss ich eine Jar Font-Erweiterung erstellen und als Bibliothek hinzufügen der Klassenpfad des Projekts (ich verwende Java und Eclipse). Ich habe versucht, nach der Antwort zu googeln, aber keine verständliche Erklärung gefunden. Ich sehe auch diese Probleme beim Exportieren von PDF-Schriftarten mit Apache FOP (keine Schriftartenerweiterung erforderlich, aber ich musste eine Schriftmetrikdatei erstellen und einige zusätzliche Konfigurationen
vornehmen, damit
1
@EagerToLearn alles hängt von der itext-Bibliothek ab, die das PDF generiert. Itext zum korrekten Rendern von Schriftarten benötigt Font-Erweiterungen (wobei nicht nur die Schriftart, sondern auch die Codierung enthalten ist, wenn eingebettetes ecc angegeben ist). Wenn Sie dies nicht angeben, unternimmt itext das, was sie als "Best Effort" bezeichnen, um Ihre Schrift zu rendern. Sie tun nicht das, was wir brauchen (in der Dokumentation geschrieben), lassen Sie uns unser Bestes geben, aber der Fehler liegt bei Ihnen. Daher ist die akzeptierte Antwort auf diese Frage nicht korrekt ! Es werden Schrifterweiterungen benötigt. Wenn Sie nicht angeben, müssen Sie mit dem leben, was erstellt wurde.
Petter Friberg
Vielen Dank für die Antwort, aber ich verstehe immer noch nur, dass das Problem mit der Schriftart auf die Funktionsweise der iText-Bibliothek zurückzuführen ist.
Vielleicht
@eag Es ist nicht viel mehr als das zu verstehen, um eine Schriftart zu rendern, müssen Sie wissen, wo sich die .ttf befindet und was die Codierung des Textes ist. Die Entwickler der Bibliothek, die diese Informationen kennen, haben Font-Erweiterungen erstellt. Wenn Sie diese nicht angeben, müssen sie mit dem Erraten beginnen. In einigen Fällen funktioniert dies nicht, weil das "Erraten" nicht korrekt ist, aber Sie können die Bibliothek nicht dafür verantwortlich machen Dies, da sie Ihnen ein System zur Verfügung gestellt haben, um das "Raten" zu vermeiden
Petter Friberg
22

Ich benutze IReport, um die Schriftart zu installieren:

Tools -> Optionen -> Schriftarten -> Klicken Sie auf Schriftart installieren

Wählen Sie dann die Schriftart aus und klicken Sie auf

-> Export als Erweiterung und Typname myfont.jar

Fügen Sie dieses Glas und auch spring.jar * zu Ihrem Erstellungspfad hinzu.

* Kopieren Sie spring.jar aus Jaspersoft \ iReport-3.7.0 \ ireport \ modules \ ext

Juan
quelle
1
Zum Abschluss befindet sich das arial ttf in c: / windows / fonts (zumindest in win xp): arial.ttf, arialbd.ttf (fett), ariali.ttf (kursiv), arialbi (fett-kursiv)
jneira
Durch Hinzufügen von spring.jar zum Erstellungspfad wurde das Problem behoben.
fishjd
Diese Methode hat bei mir tatsächlich funktioniert. Es packt die Schriftart als JAR-Datei, Sie fügen sie dem Klassenpfad hinzu und Dinge funktionieren einfach.
Satya
Wenn die Font-Erweiterung korrekt erstellt wurde, muss die Datei spring.jar nicht hinzugefügt werden.
Petter Friberg
Diese Tools-> Optionen-> Schriftarten-> Klick installieren ist auf dem Mac nicht verfügbar. :( irgendwelche Vorschläge?
L-Samuels
13

sudo apt-get install msttcorefonts funktioniert (in unserer Ubuntu-Entwicklungsumgebung), ist aber keine sehr gute Lösung.

Stattdessen haben wir die Schriftarten mit unserer Anwendung basierend auf diesem Tipp gebündelt . Ihre JAR-Datei enthält die folgenden Schriftarten:

  • Arial
  • Times New Roman
  • Kurier Neu
  • Comic ohne MS
  • Georgia
  • Verdana
  • Monospaced

Direkter Link zum Herunterladen von jar: Maven ver 1.0. DynamicFonts

user799188
quelle
Dies kann jetzt aus dem Standard-MVN-Repository heruntergeladen werden, zum Beispiel: mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts
Markus Pscheidt
12

Für CentOS:

wget msttcorefonts

Dann:

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

Starten Sie JVM schließlich neu.

Ricardo Carmo
quelle
9

Es gibt drei Methoden, um ein solches Problem zu vermeiden.

Methode 1: Durch Setzen der Option "Fehlende Schrifteigenschaft ignorieren".

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

oder Sie können diese Eigenschaft festlegen, indem Sie die folgende Zeile in die .jrxml-Datei eingeben.

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

Methode 2: Durch Festlegen der Standardschriftart-Eigenschaft.

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

oder Sie können diese Eigenschaft festlegen, indem Sie die folgende Zeile in die .jrxml-Datei eingeben.

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

Methode 3: durch Hinzufügen einer fehlenden Schrifteigenschaft.

Installieren Sie zunächst fehlende Schriftarten in IReport, indem Sie "Extras >> Optionen >> Schriftarten >> Schriftart installieren" auswählen, dann alle Schriftarten auswählen und exportieren, indem Sie mit der Erweiterung ".jar" auf "Als Erweiterung exportieren" klicken.

Sie können dieses Glas für Jasperreports-font.XXXjar verwenden, das in Ihrer Projektbibliothek oder Ihrem Klassenpfad vorhanden ist.

Mayur Bhokase
quelle
5

Ich habe dieses Problem gelöst, indem ich nur "SansSerif" oder "Serif" gewählt habe und nicht "Arial" oder "Times New Roman".

lkdg
quelle
6
Gemäß der Dokumentation der Ausnahme ( jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/… ) wird diese Methode ausdrücklich NICHT empfohlen. Dies kann zu unerwarteten Renderproblemen führen, da diese Schriftarten möglicherweise verschiedenen Systemschriftarten auf verschiedenen Systemen zugeordnet sind.
Doug
2

Sie können Ihre benutzerdefinierten Schriftarten über iReport erstellen und wie JAR-Dateien konvertieren

Mavirroco
quelle
2

Versuchen Sie, die Zeile hinzuzufügen

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

in Ihre Datei jasperreports.properties.

Jasper hört auf, eine Schriftart zu finden

Enrico Sanna
quelle
1
und ist eine schlechte Idee ... Exportinkonsistenzen!
Petter Friberg
@PetterFriberg nein, es ist ein guter Fallback-Mechanismus. Sie können die JVM nicht immer steuern. Es ist IMMER eine gute Idee, einen Fallback-Mechanismus zu haben, auch wenn das Ergebnis nicht ideal ist, ist es besser als ein Anwendungsabsturz, der durch eine fehlende Schriftart auf einem Kundencomputer verursacht wird.
Jwenting
@jwenting füge Font-Erweiterungen hinzu und es wird nicht abstürzen. Vertrauen Sie mir, wenn Sie deaktivieren, dass Sie etwas falsch machen, werden falsche Berichte generiert. Stattdessen sollten Sie das Root-Problem lösen (fehlende Font-Erweiterungen). Und ja, Sie können JVM immer steuern.
Petter Friberg
@jwenting Hinweis: Die Lösung besteht nicht darin, Schriftarten auf dem Server zu installieren (wie in der Antwort zum Akzeptieren angegeben, ist dies falsch!). Die Lösung besteht darin, abhängige Font-Erweiterungen zu generieren und hinzuzufügen. Siehe dies für die richtige Antwort stackoverflow.com/a/35549391
Petter Friberg
@PetterFriberg was oft unmöglich ist. Beispielsweise läuft die von mir verwaltete Anwendung auf einem Server, ermöglicht dem Benutzer jedoch das Hinzufügen von benutzerdefinierten .jrxml-Dateien mit einer bestimmten Namenskonvention, um benutzerdefinierte Berichte zu erstellen, die über das hinausgehen, was wir standardmäßig bereitstellen. Sie möchten nicht, dass diese Berichte abstürzen, wenn auf dem Server nicht die in der .jrxml angegebenen Schriftarten verfügbar sind. Daher verwenden wir einen Fallback.
Jwenting
2

Sie können dies tun, indem Sie Schriftarten installieren, dh überall dort, wo Sie diese bestimmte Anwendung ausführen möchten. Am einfachsten ist es, diese bl-Zeile zu Ihrer jrxml-Datei hinzuzufügen:

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

Ich hoffe es hilft.

Stephen
quelle
1
Dies führt jedoch zu Exportinkonsistenzen (daher kann nicht mit der in jrxml angegebenen Schriftart gerendert werden). Siehe meine Antwort.
Petter Friberg
2

Für Debian

hinzufügen

non-free contrib

zu deb und deb-src in /etc/apt/sources.list dh:

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

Dann

apt-get update
apt-get install msttcorefonts

Natürlich müssen Sie jasperserver neu starten. dh:

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

Ändern Sie für Ihre Version / Pfad.

d -_- b
quelle
2

Ich hatte das Problem mit meiner Webanwendung, die auf Spring 3 basiert und auf Weblogic 10.3 unter Oracle Linux 6 bereitgestellt wurde. Die unter dem Link erwähnte Lösung funktionierte bei mir nicht.

Ich musste die folgenden Schritte ausführen: 1. Kopieren Sie die Arial * .ttf-Schriftdateien in das Verzeichnis JROCKIT_JAVA_HOME / jre / lib / fonts. 2. Geben Sie die Schriftarten in fontconfig.properties.src ein. 3. Starten Sie den Cluster über die Weblogic-Konsole neu

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
quelle
2

Wenn Sie in Ihrem Projekt maven verwenden, können Sie pom.xml einfach die Abhängigkeit von jasper-fonts hinzufügen:

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

Das Installieren der fehlenden Schriftart auf dem System ist möglicherweise eine funktionierende Lösung, aber nicht für mich. Ich wollte die fehlenden Schriftarten nicht nach jeder Bereitstellung auf einem neuen Server installieren müssen, sondern habe mich dafür entschieden, die Schriftart in die Anwendung einzubetten.

Grüße.

Yassir
quelle
1

Jasper-Bericht in mehreren Sprachen erstellen (Unicode)

1) Installieren Sie die Schriftart in ireport desginer

2) Erstellen Sie eine Erweiterung der Schriftart (wir werden sie im Anwendungsklassenpfad verwenden).

3) Installieren Sie die Schriftart auf dem Betriebssystem (optional)

4) Fügen Sie alle .ttf-Schriftarten in das Verzeichnis jre-> lib-> fonts ein (andernfalls löst die Webanwendung eine Fehlerschrift aus, die für JVM nicht verfügbar ist.)

Rushabh
quelle
0

Eigentlich habe ich dieses Problem auf sehr einfache Weise behoben

  1. geh zu dir home path, wie/root
  2. Erstellen Sie einen Ordner mit dem Namen .fonts
  3. Kopieren Sie Ihre all your font filesnach .fonts, Sie können die Schriftart von kopieren, C:\windows\fontswenn Sie Windows verwenden.
  4. sudo apt-get install fontconfig
  5. fc-cache –fv Schriftarten-Caches neu zu erstellen.
Saorikido
quelle
0

Lösung in 2 Schritten (wenn Sie centOS verwenden)

  1. Laden Sie das RPM-Paket für Microsoft Core Fonts herunter.

    [root@WEBSVR~/]# wget http://www.itzgeek.com/msttcore-fonts-2.0-3.noarch.rpm
  2. Installieren Sie das RPM-Paket.

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

Kopieren Sie Ihre Schriftarten in das folgende Verzeichnis: JDK_HOME \ jre \ lib \ fonts

Ahmad Zyoud
quelle