Exportieren von Unicode Reports als PDF mit JasperReports

Vorwort

Viele Menschen, die mit JasperReports arbeiten, machen sich wahrscheinlich gar keine Gedanken über Unicode. Sie wählen für die Formularfelder und den statischen Text ganz einfach eine Schriftart, die ihnen gefällt, führen den Report aus und das wars. Aber wenn Ihr Report Zeichen enthält, die in dem default non-unicode Zeichensatz Ihres Betriebssystems nicht enthalten sind, werden Sie eine Überraschung erleben. Die Druckvorschau und der Druck werden zwar ganz korrekt dargestellt, das exportierte PDF aber nicht. Manche Zeichen werden fehlen.

Ich hatte selber dieses Problem. Und das, was ich im Internet fand, war ziemlich verwirrend. Ich fand alles Mögliche von "dies ist ein Bug in der darunterliegenden itext Library" bis zu Lösungen mit überholten Funktionen von JasperReports, die sehr kompliziert aussahen.

Aber die richtige Lösung ist zum Glück sehr einfach...

Einen Schritt näher

Wählen Sie für das gewünschte Feld die Schrifart "DejaVu Sans". Je nach dem, welche Zeichen verwendet wurden, werden sie nun wahrscheinlich auch in der PDF Datei sichtbar.

(Die Fontfamilie DejaVu ist etwas begrenzt, aber Sie können zum Beispiel kyrillische Zeichen damit exportieren. Siehe http://dejavu-fonts.org für weitere Informationen.)

Es funktioniert noch immer nicht

Sie haben den Fontnamen für das gewünschte Feld richtig auf "DejaVu Sans" gestellt und Sie haben auf der Webseite nachgeschaut, dass der Font alle Zeichen beinhaltet, aber Sie haben in dem PDF noch immer keine Zeichen?

Kann es sein, dass Sie mal in der Vergangenheit mit den überholten Funktionen wie z.B. "PDF font name" oder "PDF Encoding" gespielt haben? Sogar dann, wenn Sie die Einstellungen auf Default zurücksetzen, könnte es der Grund sein, warum die Zeichen im PDF nicht angezeigt werden. Schalten Sie die Report Definition in die xml Ansicht und versichern Sie sich, dass diese Optionen GAR NICHT vorhanden sind!

Das folgende Beispiel funktioniert nicht:

<staticText>
    <reportElement x="14" y="63" width="521" height="24"/>
    <textElement>
       <font fontName="DejaVu Sans" size="15" pdfFontName="DejaVu Sans" pdfEncoding="Identity-H"/>
    </textElement>
    <text><![CDATA[Cyrillic: б в г д ж з и ь к л м н п ф ц ч ш шт э я ю я ы]]></text>
</staticText>

Das wird funktionieren, denn die Attribute pdfFontName und pdfEncoding sind gar nicht vorhanden:

<staticText>
    <reportElement x="14" y="63" width="521" height="24"/>
    <textElement>
       <font fontName="DejaVu Sans" size="15"/>
    </textElement>
    <text><![CDATA[Cyrillic: б в г д ж з и ь к л м н п ф ц ч ш шт э я ю я ы]]></text>
</staticText>

Benutzen von anderen Unicode Fonts

Vielleicht werden die von Ihnen gewünschten Zeichen mit der DejaVu Schriftart nicht angezeigt oder die Schriftart gefällt Ihnen einfach nicht. Wie wäre es mit Arial oder jeder anderen Unicode-Schriftart?

Um das zu erreichen, müssen Sie Ihre Schriftart auf eine besonderer Weise dem JasperReport bereitstellen. Das bedeutet, dass die Schriftarten in eine .jar Datei gepackt werden müssen, die zusätzliche Informationen in einer Property-Datei und einer speziellen xml Datei, die die beinhalteten Schriftarten beschreibt, beinhalten muss. Diese jar Datei muss sich im Java Classpath befinden, während Sie den Report ausführen. Klingt kompliziert? Keine Panik... ;-)

Solch eine jar Datei für Schriftarten können Sie mit Hilfe des grafischen Reporteditors, den Sie ohnehin vielleicht schon benutzen, in zwei Schritten erstellen. iReport

Wenn Sie in iReport das Auswahlmenu für Schrifteigenschaften öffnen, merken Sie vielleicht, dass es dort einige Einträge am Anfang der Liste gibt, und dann, getrennt mit einem Strich, folgt eine längere Liste von Schriftarten. In der längeren Liste unter dem Strich befinden sich Schriftarten, die in Ihrem Betriebssystem installiert sind. Die Einträge über dem Strich sind Schriftarten, die im iReport installiert sind. Nur die in iReport installierten Schriftarten können zum exportieren von Unicode-Zeichen als pdf in iReport benutzt werden. Der erste Schritt ist also Ihre Lieblingsschriftarten in iReport zu installieren.

Installieren einer Schriftart in iReport

  • Öffnen Sie in iReport den Dialog Optionen.
  • Wählen Sie die iReport Rubrik (falls sie noch nicht ausgewählt ist).
  • Klicken Sie auf den Tab "Fonts".

Jetzt sehen Sie eine Liste von allen bereits installierten Schriftarten. Die drei DejaVu Fonts sind per default installiert, die anderen drei sind allgemeine Schriftartennamen.

  • Klicken Sie auf den "Install Font" Button.
  • Benutzen Sie den "Browse" Button, um eine Fontdatei aus zu wählen (benutzen Sie die Standardform, nicht bold oder italic).
  • Im nächsten Fenster können Sie andere Fonttypen hinzufügen.
    • Wählen Sie "Identity-H (Unicode with horizontal writing)"
    • Wenn Sie einen speziellen Font installieren, der auf den Systemen anderer Nutzer üblicherweise nicht vorhanden ist, sollten Sie die Auswahl "Embed this font in the PDF document" markieren.
    • Klicken Sie "Next"
  • Die locales Liste kann leer bleiben. Klicken Sie "Next"
  • Wenn Sie Ihren Report in html, xhtml oder rtf exportieren, werden Font- mappings benutzt. Wenn Sie dies nicht brauchen, lassen Sie es leer.
  • Nun klicken Sie "Finish"

Jetzt sollte es Ihnen möglich sein in iReport Ihren Report mit fremden Zeichen mithilfe der von Ihnen installierten Schriftarten als pdf zu exportieren.

Eine Notiz für Windows 7 Benutzer:

Sie bekommen möglicherweise eine Fehlermeldung, wenn Sie versuchen in iReport eine Schriftart zu installieren, weil Sie keine Schreibrechte in dem Verzeichnis haben. Ändern Sie die Sicherheitseinstellungen von dem Verzeichnis

C:\Program Files\Jaspersoft\iReport-4.1.1\ireport\fonts

oder

C:\Program Files (x86)\Jaspersoft\iReport-4.1.1\ireport\fonts

damit es beschreibbar wird.

Benutzen einer Schriftart ausserhalb von iReport

  • Öffnen Sie in iReport wieder den Dialog Optionen.
  • Wählen Sie die iReport Rubrik (wenn nicht schon ausgewählt).
  • Klicken Sie auf den Tab Fonts.
  • Wählen Sie einen vorher installierten Font und klicken Sie auf den Button "Export as extension".
  • Wählen Sie ein Verzeichnis und einen Dateinamen mit der Endung .jar

Jetzt haben Sie eine gebrauchsfertige Schriftarten-jar-Datei, die Sie mit JasperReports benutzen können. Fügen Sie sie dem classpath Ihrer Applikation zu.

Eine Schriftart in JasperStarter benutzen

Wenn Sie in JasperStarter eine bereits kreierte font-jar benutzen wollen, legen Sie sie einfach in das jdbc Verzeichnis, das Sie für JasperStarter benutzen. Alle jar-Dateien, die sich dort befinden, werden dem classpath hinzugefügt.