3.2. Aktionen (Actions)

Überblick

PDF-Dokumente werden durch Aktionen interaktiv aber auch komplizierter. Und kompliziert bedeutet, dass sie getestet werden müssen, zumal wenn die interaktiven Teile eines Dokumentes ein wichtiger Teil einer Prozesskette sind.

Technisch betrachtet ist eine Aktion ein Dictionary-Objekt mit den Elementen /S und /Type. Das Element /Type hat immer immer den Wert Action und das Element /S (Subtype) hat typabhängige Werte:

// Types of actions:

GoTo:        Set the focus to a destination in the current PDF document
GoToR:       Set the focus to a destination in another PDF document
GoToE:       Go to a destination inside an embedded file
GoTo3DView:  Set the view to a 3D annotation
Hide:        Set the hidden flag of the specified annotation
ImportData:  Import data from a file to the current document
JavaScript:  Execute JavaScript code
Movie:       Play a specified movie
Named:       Execute an action, which is predefined by the PDF viewer
Rendition:   Control the playing of multimedia content
ResetForm:   Set the values of form fields to default
SetOCGState: Set the state of an OCG
Sound:       Play a specified sound
SubmitForm:  Send the form data to an URL
Launch:      Execute an application
Thread:      Set the viewer to the beginning of a specified article
Trans:       Update the display of a document, using a transition dictionary
URI:         Go to the remote URI

Für einige dieser Aktionen stellt PDFUnit Testmethoden zur Verfügung. In zukünftigen Releases werden weitere Testmethoden zur Verfügung gestellt.

// Simple tests:

.hasNumberOfActions(..) 

// Action specific tests:

.hasJavaScriptAction()
.hasJavaScriptAction().containing(..)
.hasJavaScriptAction().containingSource(..)
.hasJavaScriptAction().equalsTo(..)
.hasJavaScriptAction().equalsToSource(..)
.hasJavaScriptAction().matchingRegex(..)

.hasLocalGotoAction()
.hasLocalGotoAction().toDestination(..)
.hasLocalGotoAction().toDestination(.., pageNumber)

Die folgenden Abschnitte zeigen Beispiele für diese Testmethoden.

JavaScript-Actions

JavaScript-Text ist gewöhnlich etwas umfangreich, deshalb macht es Sinn, den Vergleichstext für einen JavaScript-Action-Test aus einer Datei zu lesen:

@Test
public void hasJavaScriptAction_WithWhitespaceProcessing() throws Exception {
  String filename = "documentUnderTest.pdf";
  String scriptFileName = "javascript/javascriptAction_OneSimpleAlert.js";
  Reader scriptFileAsReader = new FileReader(scriptFileName);

  AssertThat.document(filename)
            .hasJavaScriptAction()
            .equalsToSource(scriptFileAsReader, WhitespaceProcessing.IGNORE)
  ;
}

Die Methoden containingSource(..) und equalsToSource(..) nehmen Parameter vom Typ java.io.Reader, java.io.InputStream oder java.lang.String entgegen.

In dem vorhergehenden Beispiel wird der vollständige Inhalt der JavaScript-Datei mit dem Inhalt der JavaScript-Action verglichen. Whitespaces werden dabei ignoriert.

Es können aber auch einfache Zeichenkette innerhalb des JavaScript-Codes geprüft werden:

@Test
public void hasJavaScript_ContainingText_FunctionNames() throws Exception {
  String filename = "javaScriptClock.pdf";
  
  AssertThat.document(filename)
            .hasJavaScript()
            .containing("StopWatchProc")
            .containing("SetFldEnable")
            .containing("DoTimers")
            .containing("ClockProc")
            .containing("CountDownProc")
            .containing("CDEnables")
            .containing("SWSetEnables")
  ;
}

Das Kapitel 13.5: „Behandlung von Whitespaces“ geht ausführlich auf den flexiblen Umgang mit Whitespaces ein.

Goto-Actions

Goto-Actions benötigen ein Sprungziel in derselben Datei:

@Test
public void hasGotoAction_ToNamedDestination() throws Exception {
  String filename = "documentUnderTest.pdf";
  String destinationName21 = "destination2.1";
  
  AssertThat.document(filename)
            .hasLocalGotoAction()  
            .toDestination(destinationName21)
  ;
}

Dieser Test ist erfolgreich, wenn das aktuelle Test-PDF eine GoTo-Action enthält die auf das Sprungziel destination2.1 zeigt. Sprungziele können im Zusammenhang mit Lesezeichen (Bookmarks) getestet werden. Darauf geht Kapitel 4.12: „"Named Destinations" vergleichen“ ein.

Es kann auch geprüft werden, ob sich ein Sprungziel auf einer bestimmten Seite befindet:

@Test
public void hasGotoAction_ToDestinationWithPage_Page3() throws Exception {
  String filename = "documentUnderTest.pdf";
  String destinationName21 = "destination2.1";
  int page3 = 3;
  
  AssertThat.document(filename)
            .hasLocalGotoAction()
            .toDestination(destinationName21, page3)
  ;
}