3.12. 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 nur teilweise angezeigt. Ü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 Tests:

<!-- Tags to check field overflow: -->

<!-- Check text overflow for one text field: -->
<hasField ... >
  <withoutTextOverflow />
</hasField ... >

<!-- Check text overflow for all text fields: -->
<hasFields ... >
  <allWithoutTextOverflow />
</hasFields ... >

Es werden nur Textfelder überprüft! Buttons, Auswahllisten, Combo-Boxen, Signaturfelder und Passwort-Felder werden nicht überprü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:

<testcase name="hasField_WithoutTextOverflow_Fieldname"
          errorExpected="YES"
>
  <assertThat testDocument="acrofields/fieldSizeAndText.pdf">
    <hasField withName="Textfield, too much text, multiline:">
      <withoutTextOverflow />
    </hasField>
  </assertThat>
</testcase>

Wenn die Exception nicht abgefangen würde (errorExpected="YES"), lautet sie: Content of field 'Textfield, too much text, multiline:' of 'C:\...\fieldSizeAndText.pdf' does not fit in the available space.

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:

<testcase name="hasFields_AllWithoutTextOverflow">
  <assertThat testDocument="acrofields/javaScriptForFields.pdf">
    <hasFields>
      <allWithoutTextOverflow />
    </hasFields>
  </assertThat>
</testcase>

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

Technische Randbedingung

Der Inhalt eines Feldes wird aus technischen Gründen nicht durch das Test-Tag <containing>..</containing> erkannt. Soll er dennoch überprüft werden, muss das PDF-Dokument erst flach geklopft werden (engl. 'flatten').

Insofern schlägt der folgende Test fehl:

<!--
  Text from AcroFields (type PdfName.ANNOTS) is not detectable.
  Flatten it first.
-->
<testcase name="hasTextOnFirstPage_DocumentWithFields">
  <assertThat testDocument="&testfile;">
    <hasText on="FIRST_PAGE">
      <inClippingArea upperLeftX="0" upperLeftY="0" width="595" height="842" unit="POINTS">
        <containing whitespaces="NORMALIZE">
            middle
        </containing>
      </inClippingArea>
    </hasText>
  </assertThat>
</testcase>