3.15. Formularfelder, Textüberlauf

Überblick

Eine Möglichkeit, PDF-Dokumente zu erstellen, besteht darin, Platzhalter (Form Fields) einer Vorlage mit Textbausteinen zu füllen. Falls der Text aber größer ist, als der für die Anzeige zur Verfügung stehende Platz, wird der Text abgeschnitten. Überschüssiger Text (außerhalb des Fensters) wird nicht angezeigt. Als Gegenmaßnahme könnte die Schriftgröße verringert werden. Das schlägt aber auf das abschließende Erscheinungsbild durch und ist daher selten akzeptabel.

Die Prüfung, ob Text in ein Feld passt, ist nicht ganz einfach, schließlich ist das Ergebnis nicht nur von der Schriftgröße abhängig, sondern auch von der Länge der Wörter am jeweiligen Zeilenende und einer eventuell verwendeten Silbentrennung. Nach mehrfacher Nachfrage seitens verschiedener Interessenten, bietet PDFUnit nun diese beiden Testfunktionen:

// Fit(nes)-test for one field:
.hasField(..).withoutTextOverflow()

// Verifying that all fields are big enough:
.hasFields().allWithoutTextOverflow()

Es werden nur Textfelder überprüft! Buttons, Auswahllisten, Combo-Boxen, Signaturfelder und Passwort-Felder werden nicht geprüft.

Passende Größe eines Feldes

Der Screenshot zeigt die im nachfolgenden Beispiel verwendeten Felder mit ihren Texten. Es ist gut zu erkennen, dass der Text in den letzten drei Feldern über den Rand des jeweiligen Feldes hinausgeht:

Und so funktioniert der Test auf das letzte Feld des abgebildeten Dokumentes:

@Test(expected=PDFUnitValidationException.class)
public void hasField_WithoutTextOverflow_Fieldname() throws Exception {
  String filename = "documentUnderTest.pdf";
  String fieldname = "Textfield, too much text, multiline:";

  AssertThat.document(filename)
            .hasField(fieldname)
            .withoutTextOverflow()
  ;
}

Wenn die Exception nicht abgefangen wird, lautet sie: Content of field 'Textfield, too much text, multiline:' of 'C:\...\fieldSizeAndText.pdf' does not fit in the available space.

Wird die Methode hasField(..) für andere Felder als Textfelder aufgerufen, wird keine Exception geworfen.

Passende Größe aller Felder

Wenn ein PDF-Dokument viele Felder enthält, wäre es unnötig aufwendig, für jedes Feld einen eigenen Test zu schreiben. Deshalb können alle Felder gleichzeitig auf Textüberlauf überprüft werden:

@Test
public void hasFields_AllWithoutTextOverflow() throws Exception {
  String filename = "documentUnderTest.pdf";

  AssertThat.document(filename)
            .hasFields()
            .allWithoutTextOverflow()
  ;
}

Auch bei dieser Testmethode werden nur Textfelder überprüft, keine Buttons, Auswahllisten, Combo-Boxen, Signaturfelder und Passwort-Felder.