Czcionka nie jest dostępna dla maszyny JVM z Jasper Reports


91

Próbuję wygenerować raport za pomocą DynamicJasper, ale pojawia się następujący błąd:

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

msttcorefonts jest zainstalowany, ale wydaje mi się, że JVM nie używa z niego żadnych czcionek.

Używam Ubuntu 10.04.

Jak mogę to naprawić?


3
Właściwie to ignoruję ... po prostu ustaw następujące "net.sf.jasperreports.awt.ignore.missing.font = true" zły pomysł ... ale rozwiązuje problem na chwilę ....
Andrew

Trzeba by zainstalować Microsoft czcionek w Ubuntu można znaleźć link do informacji .. embraceubuntu.com/2005/09/09/installing-microsoft-fonts
Sivaramakrishnan

1
gdzie to ustawiasz? Pracuję z osadzoną wersją raportów jasperreports w jbilling, gdzie nie ma pliku jasperreports.properties do edycji.
Darragh


1
@ Andrew, nie wydaje się to dobrym rozwiązaniem (wiem, że pytanie jest stare), ale może lepiej, że unikniemy niespójności raportów, przekazałem odpowiedź.
Petter Friberg

Odpowiedzi:


63

Próbowałem zainstalować mscorefonts, ale pakiet był zainstalowany i aktualny.

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

Próbowałem wyszukać czcionkę w systemie plików, używając:

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

Ten folder miał właśnie plik README z poprawnymi instrukcjami dotyczącymi instalacji.

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

Do tego potrzebne jest połączenie internetowe:

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

Ponownie zainstalowałem ttf-mscorefonts-installer(jak pokazano powyżej, upewniając się, że akceptujesz umowę EULA!) I problem został rozwiązany.


5
Do Twojej wiadomości na temat innych smaków Linuksa wypróbuj sudo apt-get install msttcorefonts
KCD

dla CentOS i RHEL6 jak rozwiązać problem EULA? yum install nie daje żadnej opcji do zaakceptowania, żadnych pomysłów?
Darragh

A co z najpopularniejszym systemem operacyjnym Windows?
Sarz,

1
Jest to obejście na jednym komputerze, nie rozwiąże to żadnych problemów z kodowaniem, poprawnym sposobem jest użycie rozszerzeń czcionek. Wysłałem odpowiedź
Petter Friberg

1
Odpowiedź jest poprawna w przypadku, gdy mieliśmy już zainstalowane czcionki, ale bez zaakceptowanej licencji. Oto kroki, które należy wykonać w przypadku, gdy zamierzasz poprawnie przeprowadzić pierwszą automatyczną instalację: 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 generuje wyjątek JRFontNotFoundException w przypadku, gdy czcionka użyta w szablonie raportu nie jest dostępna dla maszyny JVM jako czcionka systemowa lub czcionka pochodząca z rozszerzenia czcionki JR. Zapewnia to uniknięcie wszystkich problemów spowodowanych niedopasowaniem metryk czcionek i wczesne ostrzeżenie o niespójności.

Raporty Jasper próbuje pomóc Ci w opracowaniu raportu, stwierdzając, że nie może poprawnie wyeksportować raportu, ponieważ nie może znaleźć czcionki zdefiniowanej w TextFieldlubStaticText

<font fontName="Arial"/>

Tak, możesz to wyłączyć , ustawiając wartość true dla funkcji net.sf.jasperreports.awt.ignore.missing.font, ale wystąpią niespójności w eksporcie .

Tak, możesz zainstalować czcionkę jako czcionkę systemową JVM (ale musisz to zrobić na każdym używanym komputerze, który może generować raport i nadal możesz mieć problemy z kodowaniem ).

Właściwy sposób!

Użyj rozszerzeń czcionek ! Jeśli chcesz tworzyć własne (patrz link poniżej), Jasper raporty dystrybuuje również domyślny słoik font-extension ( jasperreports-fonts-x.x.x.jar), która wspiera fontName DejaVu Sans, DejaVu SerifiDejaVu Sans Mono

<font fontName="DejaVu Sans"/>

Z przewodnika JasperReport Ultimate:

Zdecydowanie zachęcamy ludzi do używania tylko czcionek pochodzących z rozszerzeń czcionek, ponieważ jest to jedyny sposób, aby upewnić się, że czcionki będą dostępne dla aplikacji podczas wykonywania raportów w czasie wykonywania. Używanie czcionek systemowych zawsze wiąże się z ryzykiem, że raporty nie będą działać poprawnie po wdrożeniu na nowym komputerze, na którym mogą nie być zainstalowane te czcionki

Linki w StackOverflow na temat prawidłowego renderowania czcionek w formacie PDF

Lista kontrolna dotycząca prawidłowego renderowania czcionki w formacie PDF

Generuj rozszerzenia czcionek za pomocą JasperSoft Studio

Generuj rozszerzenia czcionek za pomocą iReport


Czy możesz mi podać powód, dla którego Jasper i JVM nie mogą renderować pliku PDF z czcionką istniejącą w systemie (znajdującą się w C: \ windows \ fonts), zamiast tego muszę utworzyć rozszerzenie Jar Font i dodać je jako bibliotekę do ścieżka klasy projektu (używam Java i Eclipse). Próbowałem znaleźć odpowiedź w Google, ale nie znalazłem zrozumiałego wyjaśnienia. Widzę również te problemy z eksportowaniem czcionek PDF również w przypadku Apache FOP (bez rozszerzenia czcionki, ale musiałem utworzyć plik metryczny czcionki i wykonałem kilka dodatkowych konfiguracji, aby czcionka była poprawnie renderowana)
EagerToLearn

1
@EagerToLearn wszystko sprowadza się do biblioteki itext, która generuje plik pdf, itext, aby poprawnie renderować czcionki, wymaga rozszerzeń czcionek (gdzie nie tylko czcionka jest dołączona, ale także kodowanie, jeśli określono osadzone ecc). Jeśli tego nie podasz, itext wykona to, co nazywa „najlepszym wysiłkiem”, aby wyrenderować czcionkę. Nie robisz tego, czego potrzebujemy (zapisane w dokumentacji), dajmy z siebie wszystko, ale wina leży po Twojej stronie. Stąd przyjęta odpowiedź na to pytanie jest nieprawidłowa !, Rozszerzenia czcionek są potrzebne, jeśli nie podasz, będziesz musiał żyć z tym, co zostanie utworzone.
Petter Friberg

dziękuję za odpowiedź, ale nadal rozumiem tylko, że problem z czcionkami jest związany ze sposobem działania biblioteki iText. Być może ta czcionka wykracza poza moje techniczne możliwości zrozumienia :(
EagerToLearn

@eag To niewiele więcej niż to, aby zrozumieć, aby wyrenderować czcionkę, musisz wiedzieć, gdzie znajduje się plik .ttf i musisz wiedzieć, jakie jest kodowanie tekstu. Twórcy biblioteki, aby znać te informacje, stworzyli rozszerzenia czcionek, jeśli ich nie podasz, muszą zacząć zgadywać, dlaczego w niektórych przypadkach to nie działa, ponieważ "zgadywanie" nie jest poprawne, ale nie możesz winić biblioteki za to dlatego, że dostarczyli ci system pozwalający uniknąć „zgadywania”
Petter Friberg

22

Używam IReport do zainstalowania czcionki:

narzędzia -> opcje -> czcionki -> kliknij zainstaluj czcionkę

Następnie wybierz czcionkę i kliknij

-> eksportuj jako rozszerzenie i wpisz nazwę myfont.jar

dodaj ten jar, a także spring.jar * do ścieżki kompilacji.

* skopiuj plik spring.jar z Jaspersoft \ iReport-3.7.0 \ ireport \ modules \ ext


1
Aby uzupełnić, arial ttf jest w c: / windows / fonts (przynajmniej w win xp): arial.ttf, arialbd.ttf (pogrubiony), ariali.ttf (kursywa), arialbi (pogrubiony-kursywa)
jneira

Dodanie pliku spring.jar do ścieżki kompilacji naprawiło ten problem.
fishjd

Ta metoda faktycznie zadziałała dla mnie. Pakuje czcionkę jako plik jar, dodajesz ją do ścieżki klas i po prostu działa.
Satya

Jeśli rozszerzenie czcionki zostało wykonane poprawnie, nie ma potrzeby dodawania pliku spring.jar.
Petter Friberg

To narzędzie-> opcje-> czcionki-> kliknij zainstalować nie jest dostępne na Macu. :( jakieś sugestie?
L-Samuels,

13

sudo apt-get install msttcorefonts działa (w naszym środowisku programistycznym Ubuntu), ale nie jest zbyt dobrym rozwiązaniem.

Zamiast tego, w oparciu o tę wskazówkę , dołączyliśmy czcionki do naszej aplikacji . Ich plik JAR zawiera następujące czcionki,

  • Arial
  • Czcionka Times New Roman
  • Courier New
  • Comic Sans MS
  • Gruzja
  • Verdana
  • O stałej szerokości

Bezpośredni link do pobrania jar: Maven ver 1.0. DynamicFonts


Można to teraz pobrać ze standardowego repozytorium mvn, na przykład: mvnrepository.com/artifact/ar.com.fdvs/DynamicJasper-core-fonts
Markus Pscheidt

12

Dla CentOS:

wget msttcorefonts

Następnie:

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

W końcu zrestartuj JVM.


9

Istnieją trzy metody uniknięcia takiego problemu.

Metoda 1: przez ustawienie ignorowania brakującej właściwości czcionki.

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

lub możesz ustawić tę właściwość, wprowadzając następujący wiersz do pliku .jrxml.

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

Metoda 2: ustawiając domyślną właściwość czcionki.

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

lub możesz ustawić tę właściwość, wprowadzając następujący wiersz do pliku .jrxml.

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

Metoda 3: dodając brakującą właściwość czcionki.

Najpierw zainstaluj brakujące czcionki w IReport, wybierając „Narzędzia >> Opcje >> Czcionki >> Zainstaluj czcionkę”, a następnie wybierz całą czcionkę i wyeksportuj ją, klikając „Eksportuj jako rozszerzenie” z rozszerzeniem .jar.

Możesz użyć tego jar dla Jasperreports-font.XXXjar, który będzie obecny w twojej bibliotece projektu lub ścieżce klas.


5

Rozwiązałem to, wybierając tylko „SansSerif” lub „Serif”, a nie „Arial” lub „Times New Roman”.


6
Zgodnie z dokumentacją wyjątku ( jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/… ) ta metoda jest wyraźnie NIE zalecana. Może to powodować nieoczekiwane problemy z renderowaniem, ponieważ te czcionki mogą być mapowane na różne czcionki systemowe w różnych systemach.
Doug

3

Jeśli używasz mavena w swoim projekcie, możesz po prostu dodać zależność jasper-fonts do pom.xml:

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

Zainstalowanie brakującej czcionki w systemie może być działającym rozwiązaniem, ale nie dla mnie, nie chciałem instalować brakujących czcionek po każdym wdrożeniu na nowym serwerze, zamiast tego zdecydowałem się osadzić czcionkę w aplikacji.

Pozdrowienia.


2

może tworzyć własne czcionki przez iReport i konwertować jak pliki jars


2

Spróbuj dodać linię

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

do pliku jasperreports.properties.

Jasper przestaje znajdować jedną czcionkę


1
i to zły pomysł ... niezgodności eksportu!
Petter Friberg

@PetterFriberg nie, to dobry mechanizm awaryjny. Nie zawsze możesz kontrolować JVM. ZAWSZE dobrym pomysłem jest posiadanie mechanizmu rezerwowego, nawet jeśli wynik nie jest idealny, jest lepszy niż awaria aplikacji spowodowana brakiem czcionki na komputerze klienta.
jwenting

@jwenting dodaje rozszerzenia czcionek i nie zawiesza się. Zaufaj mi, jeśli wyłączasz, robisz coś źle, będziesz mieć wygenerowane nieprawidłowe raporty, zamiast tego powinieneś rozwiązać problem główny (brakujące rozszerzenia czcionek). I tak, zawsze możesz kontrolować JVM.
Petter Friberg

@jwenting Uwaga: rozwiązaniem nie jest instalowanie czcionek na serwerze (jak mówi odpowiedź accept, jest źle!). Rozwiązaniem jest wygenerowanie i dodanie w zależnościach rozszerzeń czcionek. Zobacz to, aby uzyskać poprawną odpowiedź stackoverflow.com/a/35549391
Petter Friberg

@PetterFriberg, co często jest niemożliwe. Na przykład aplikacja, którą utrzymuję, działa na serwerze, ale umożliwia użytkownikowi dodawanie niestandardowych plików .jrxml z określoną konwencją nazewnictwa w celu generowania niestandardowych raportów wykraczających poza to, co oferujemy w standardzie. Nie chcemy, aby te raporty ulegały awarii, jeśli serwer nie ma dostępnych czcionek określonych w pliku .jrxml, więc używamy rezerwy.
jwenting

2

Możesz to zrobić, instalując czcionki, czyli wszędzie tam, gdzie chcesz uruchomić tę konkretną aplikację. Najprostszym sposobem jest po prostu dodanie tej linii bl do pliku jrxml:

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

Mam nadzieję, że to pomoże.


1
Spowoduje to jednak niespójności w eksporcie (dlatego nie można renderować z czcionką wskazaną w jrxml). Zobacz moją odpowiedź.
Petter Friberg

2

Dla Debiana

Dodaj

non-free contrib

do deb i deb-src w /etc/apt/sources.list, czyli:

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

Następnie

apt-get update
apt-get install msttcorefonts

Oczywiście musisz ponownie uruchomić Jasperserver. to znaczy:

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

Zmień wersję / ścieżkę.


2

Napotkałem problem z moją aplikacją internetową opartą na Spring 3 i wdrożoną na Weblogic 10.3 na Oracle Linux 6. Rozwiązanie wymienione w linku nie działa dla mnie.

Musiałem wykonać następujące kroki - 1. Skopiuj pliki czcionek Arial * .ttf do katalogu JROCKIT_JAVA_HOME / jre / lib / fonts 2. Wprowadź wpisy czcionek w fontconfig.properties.src 3. Uruchom ponownie klaster z konsoli 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

Utwórz raport Jasper w wielu językach (Unicode)

1) Zainstaluj czcionkę w ireport Desginer

2) Utwórz rozszerzenie czcionki (użyjemy go w ścieżce klas aplikacji)

3) zainstaluj czcionkę w systemie operacyjnym (opcjonalnie)

4) wklej cały .ttf czcionki do katalogu jre-> lib-> fonts (w przeciwnym razie aplikacja internetowa wyświetli błąd czcionki nie jest dostępna dla JVM)


0

Właściwie naprawiłem ten problem w bardzo prosty sposób

  1. idź do swojego home path , jak/root
  2. utwórz folder o nazwie .fonts
  3. skopiuj all your font filesdo .fonts, możesz skopiować czcionkę, C:\windows\fontsjeśli używasz systemu Windows.
  4. sudo apt-get install fontconfig
  5. fc-cache –fv odbudować pamięci podręczne czcionek.

0

Rozwiązanie w 2 krokach (jeśli używasz centOS)

  1. Pobierz pakiet rpm podstawowych czcionek firmy Microsoft.

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

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.