www.alexander-merz.com | Alexander Merz

JasperReports-Einführung Teil 3 - Texte und Schriften

Der Durchschnittsprogrammierer tippt seinen SQL-Befehl auf der Kommandozeile ein und erfreut sich an Zahlen weiß auf schwarz im Terminal. Berichte hingegen sind eine Erfindung für PowerPoint-verliebte Manager. Also sollten sie auch schön bunt sein. Heute schauen wir uns an, wie man Texte platziert und verschnörkelt.

Die Quelltexte der Java-Klassen, der XML-Dateien und der SQL-Skripte finden sich unter www.alexander-merz.com/jr-examples.zip.

Die Tags <staticText> und <textField> haben wir bereits in den vorausgegangenen Beispielen verwendet ohne groß auf deren Attribute und enthaltenen Tags einzugehen. Bei der Platzierung und der Formatierung unterscheiden sich beide Tags nicht. Auf dem ersten Blick wirkt die Definition etwas unübersichtlich, um nicht zu sagen, ausufernd.

Das Tag-Grundgerüst für einen Textblock umfasst folgende Bestandteile:

<staticText>
  <reportElement />
  <textElement>
   <font />
  </textElement>
  <text> </text>
</staticText>

Das <staticText>-Tag definiert den Text-Block. Die Position und Größe dieses Blocks wird mit <reportElement> angegeben, auch die Farbe mit der gezeichnet wird - hier als die Schriftfarbe. Die Angabe der Ausrichtung und Position des Textes innerhalb des Text-Blocks erfolgt mit den Attributen mit <textElement>. Bestandteil dieses Tags ist optional ein <font>-Tag. Damit wird die Schriftart, deren Größe und Stil angegeben.

Im <reportElement>-Tag müssen die Attribute für die Startposition (x und y) und die Höhe und Breite des Text-Blocks angegeben werden (width und height). Die Positionsangabe ist relativ zum umgebenden <band>-Tag. Die Angabe x=0 und y=0 würde die Textbox also in der linken, oberen Ecke des Bandes platzieren, nicht der Seite! Die Abmaße des Blocks dürfen die des Bandes nicht überschreiten. Ist das umgebende Band 400 Pixel hoch, dann darf der Block auch nicht höher als 400 Pixel werden. Beginnt der Block bei einer anderen Höhe als 0, dann ist dies zu berücksichtigen: Ist z.B. y=20, dann darf der Block nicht höher sein als 380 Pixel. Die Farbangabe mit forecolor kann entweder über eine der Farb-Konstanten (z.B. green, red, yellow) erfolgen, oder über die Angabe eines hexadezimalen RGB-Wertes mit vorangestellter Raute, wie bei HTML (z.B #000000, #ffffff).

Formatierungen

Die Art der Darstellung des Textes wird über das <textElement>-Tag bestimmt. Standardmäßig wird ein Text in der linken, oberen Ecke, linksbündig innerhalb des Text-Blocks ausgegeben. Über Attribute lässt sich dies ändern:

  • textAlignment ändert die horizontale Ausrichtung innerhalb des Blocks: linksbündig (Left), rechtsbündig (Right), zentriert (Center) und Blocksatz (Justified).
  • verticalAlignment ändert die vertikale Ausrichtung des Textes: oben (Top), unten (Bottom) und mittig (Middle).
  • rotation dreht den Text um 90° nach links (Left) bzw. rechts (Right).

Innerhalb des <textElement>-Tags kann ein <font>-Tag platziert werden, um die Schrift zu beeinflussen. Die Schriftgröße wird einfach über das size-Attribute geändert. Um den Schriftstil auf fett bzw. kursiv zu setzen, verwenden Sie die Attribute isBold (fett) bzw. isItalic (kursiv) und setzen sie auf true. Es sei denn, Sie wollen den Bericht als PDF erzeugen lassen, im PDF funktionieren diese Attribute nicht. Dazu unten mehr.

Zu Erinnerung: die Schriftfarbe wird über das forecolor-Attribut des <reportElement>-Tags gesetzt.

Es stehen gleichfalls Parameter für unterstrichenen Text (isUnderline) und durchgestrichenen Text zur Verfügung (isStrikeThrough), auch hier wieder wird dass entsprechende Attribut auf true gesetzt.

Schriftarten

Die Änderung der Schrift ist etwas komplexer, da hier das Zielformat des Berichtes eine Rolle spielt. Über das Attribut fontName geben Sie den Namen des Fonts an, der verwendet werden soll, z.B. Arial, Verdana oder ZapfDingsbat. Wie dieses Attribut beachtet wird, ist vom Zielformat abhängig.

Bei HTML wird eine entsprechende CSS-Style-Angabe erzeugt und der angegebene Wert eingesetzt. Damit ist die Darstellung auch davon abhängig, welche Schriftarten beim Benutzer installiert sind. Zugleich heißt das aber auch, dass wir die bei HTML möglichen Werte wie serif oder sans-serif für Schriftfamilien benutzen können. Der Parser von JasperReports prüft bei fontName nicht, ob der Wert in irgend einer Form zulässig ist oder nicht!

Erstellen wir hingegen ein PDF, wird die Schriftart-Angabe über fontName überhaupt nicht beachtet. Stattdessen müssen wir pdfFontName benutzen. Hier können zwei verschiedene Arten von Werten angegeben werden: entweder der Name eines der vordefinierten PDF-Schriften, z.B. Courier-Bold, oder der Name einer Schriftdatei im TrueType-Format (ttf), z.B. comic.ttf für Comic Sans MS. Die TTF-Datei muss sich im Wurzelverzeichnis des Projektes befinden. Damit die Darstellung nicht davon abhängig ist, ob eine gewählte Schriftart auch beim Leser verfügbar ist, kann die Schriftart in das PDF mit eingebunden werden. Das geschieht, wenn das Attribut isPdfEmbedded auf true gesetzt wird.

Bei der Angabe einer Schriftart sollten sowohl fontName als auch pdfFontName gesetzt werden, wenn man sichergehen will, dass bei der Ausgabe keine Probleme in den verschiedenen Formaten auftreten.

Die Problematik PDF vs. Den-Rest-der-Welt tritt auch bei den Attributen isItalic und isBold auf. Im PDF werden diese nicht umgesetzt, stattdessen muss ein entsprechender Schriftschnitt eingesetzt werden, d.h. eine Schriftart, die aus fetten bzw. kursive Buchstaben besteht. Für die PDF-Schrift Helvetica sind das z.B. Helvetica-Bold (fett) und Helvetica-Oblique (kursiv). Soll ein Text-Block also kursiv gesetzt werden, dann ist es notwendig, das isItalic-Attribute zu verwenden und eine entsprechende Schrift über pdfFontName zu setzen.

In Example6.jrxml werden drei Texte verschieden formatiert ausgegeben. Der zweite und dritte Text wird jeweils in einer anderen Schriftart gesetzt unter Verwendung von fontName und pdfFontName. Der Wert von pdfFontName ist beim zweiten Text eine TTF-Datei, beim dritten eine vordefinierte PDF-Schrift.

Damit das Beispiel gestartet werden kann, ist es notwendig, die Schriftdatei comic.ttf in das Verzeichnis des entpackten Archivs zu kopieren. Wenn Sie diese Datei nicht haben sollten, probieren Sie einfach eine andere und ändern den Eintrag für pdfFontName des dritten Textes in der jrxml-Datei einfach auf den Namen dieser Datei.

Stylish

Bisher haben wir uns angeschaut, wie ein kompletter Text-Block formatiert werden kann. Aber es ist auch möglich, nur einzelne Bestandteile des Textes zu formatierten.

Im ersten Schritt muss dafür das Attribut isStyledText im <textElement>-Tag auf true gesetzt werden. Dann können wir im Text das <style>-Tag verwenden. Die Art der Formatierung wird über Attribute dieses Tags gesetzt. Die zur Verfügung stehenden Attribute sind die des <textElement>-Tags und <font>-Tags, sowie die Attribute forecolor und backcolor von <reportElement>.

Der PDF-Sonderweg besteht auch hier. Deshalb kann der Ausdruck auch sehr lang werden (aus Example7.jrxml):

<textElement isStyledText="true">
 <font size="16"/>
</textElement>
<text><![CDATA[Das ist ein Text mit
<style isItalic="true" pdfFontName="Helvetica-Oblique">kursiven</style>
und <style isBold="true"
pdfFontName="Helvetica-Bold">fetten</style> Wörtern.]]></text>
</staticText>

Im Beispiel wird jeweils ein Wort kursiv und eines fett gesetzt. Es ist wichtig, dass Text mit <style>-Tags unbedingt in eine CDATA-Sektion gesetzt wird! Denn ansonsten würde der XML-Parser versuchen die <style>-Tags ebenfalls auszuwerten. Dies geschieht aber in einem zweiten Durchlauf, nach dem der Compilier aufgrund des isStyledText-Attributes erkannt hat, dass es sich um formatierten Text handelt.

Zeilenumbrüche und Leerzeichen

Im Beispiel Example8.jrml befindet sich ein Zeilenumbruch im ersten Text-Block:

<text><![CDATA[Das ist ein Text
  mit Zeilenumbruch.]]></text>

Dieser Zeilenumbruch wird sowohl im PDF, als auch, so gut wie möglich, in anderen Formaten (auch HTML!) beibehalten. Innerhalb einer CDATA-Sektion sind alle Zeichen relevant, nicht nur Zeilenumbrüche, sondern gleichfalls Leerzeichen, wie man gleichfalls im obigen Beispiel nachvollziehen kann: vor "mit" befinden sich zwei Leerzeichen als Folge der Einrückung.

Wird eine Textzeile länger als es die Breite des Text-Blocks erlaubt, dann wird der Text automatisch umgebrochen. Dieses Verhalten wird im zweiten Text-Block des Beispiels demonstriert.

Im dritten Beispiel schließlich sehen Sie was passiert, wenn ein Text zu lang ist und auch nach dem eingefügten Zeilenumbruch nicht mehr in den Block passt, weil dieser nicht hoch genug ist: er wird einfach abgeschnitten.

JasperReports-Einführung Teil 1
JasperReports-Einführung Teil 2 – Abschnitte und Größenangaben
JasperReports-Einführung Teil 3 - Texte und Schriften
JasperReports Einführung Teil 4 - Die Datenquellen
JasperReports Einführung Teil 5 - Die Ausgabeformat