3.10. Dokumenteneigenschaften

Überblick

PDF-Dokumente enthalten Informationen über Titel, Autor, Stichworte/Keywords und weitere Eigenschaften. Diese vom PDF-Standard vorgegebenen Informationen können durch individuelle Key-Value-Paare erweitert werden. Im Zeitalter von Suchmaschinen und Archivsystemen spielen sie eine zunehmend große Rolle. Umso wichtiger ist es, die Metadaten mit ordentlichen Werten zu füllen.

Ein Beispiel für schlechte Dokumenteneigenschaften aus der Praxis ist ein PDF-Dokument mit dem Titel jfqd231.tmp (das ist tatsächlich der Titel des Dokumentes). Mit diesem Titel wird es nie gesucht und gefunden werden. Bei diesem Dokument einer amerikanischen Behörde handelt es sich um ein eingescanntes Schriftstück aus der Schreibmaschinenzeit. Es wurde 1993 eingescannt. Da aber auch der Dateiname eine semantikfreie Zahlenfolge ist, ist der Nutzen dieses Dokumentes nur marginal größer, als wenn es gar nicht existierte.

Folgende Methoden stehen zur Validierung der Metadaten zur Verfügung:

// Testing document properties:

.hasAuthor()
.hasCreator()
.hasKeywords()
.hasProducer()
.hasProperty(..) 
.hasSubject()
.hasTitle()

.hasNoAuthor()
.hasNoCreator()
.hasNoKeywords()
.hasNoProducer()
.hasNoProperty(..) 
.hasNoSubject()
.hasNoTitle()

.hasCreationDate()       1
.hasModificationDate()   2
.hasNoCreationDate()
.hasNoModificationDate()

1 2

Tests auf das Erstellungs- und Änderungsdatum werden in einem eigenen Kapitel beschrieben, weil sich die Art der Tests von denen der anderen Metadaten unterscheidet. Siehe Kapitel 3.8: „Datum“.

Metadaten eines Test-Dokumentes können auch mit den Metadaten eines anderen PDF-Dokumentes verglichen werden. Solche Vergleiche sind in Kapitel 4.6: „Dokumenteneigenschaften vergleichen“ beschrieben.

Autor validieren ...

Sie können den Autor eines Dokumentes manuell in einem PDF-Reader überprüfen. Einfacher geht es aber mit automatisierten Tests.

Wenn das Dokument einen beliebigen Wert für den Autor enthalten soll, können Sie das so testen:

@Test
public void hasAuthor() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasAuthor()
  ;
}

Um explizit zu prüfen, dass die Dokumenteneigenschaft Autor nicht vorhanden ist, muss die Methode hasNoAuthor() verwendet werden:

@Test
public void hasNoAuthor() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasNoAuthor()
  ;
}

Der nächste Test überprüft den Wert der Eigenschaft Autor:

@Test
public void hasAuthor() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasAuthor()
            .equalsTo("PDFUnit.com")
  ;
}

Verschiedene Vergleichsmethoden stehen zur Verfügung. Die Methodennamen sind selbsterklärend:

// Comparing text for author, creator, keywords, producer, subject, title:
.containing(..)
.endingWith(..)
.equalsTo(..)
.matchingRegex(..)
.notContaining(..)
.notMatchingRegex(..)
.startingWith(..)

In allen Vergleichsmethoden werden Leerzeichen nicht verändert. Bei so kurzen Feldern obliegt die Verantwortung über die Leerzeichen dem Testentwickler.

Alle Vergleichsmethoden arbeiten case-sensitiv.

Die Funktion matchingRegex() folgt den Regeln von java.util.regex.Pattern .

... und Creator, Keywords, Producer, Subject und Title

Die Tests auf Inhalte von Creator, Keywords, Producer, Subject und Title funktionieren genauso wie zuvor für Autor beschrieben.

Verketten von Methoden

Mehrere Testmethoden können in einem Test verkettet werden:

@Test
public void hasKeywords_allTextComparingMethods() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasKeywords().notContaining("--")
            .hasKeywords().matchingRegex(".*key.*")
            .hasKeywords().startingWith("PDFUnit")
  ;
}

Allgemeine Prüfung als Key-Value-Paar

Die in den vorhergehenden Abschnitten gezeigten Prüfungen auf Standardeigenschaften können auch mit der allgemeinen Methode hasProperty(..) ausgeführt werden. Sie prüft eine beliebige Dokumenteneigenschaft als Key/Value-Paar:

@Test
public void hasProperty_StandardProperties() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasProperty("Title")
            .equalsTo("PDFUnit sample - Demo for Document Infos")
            .hasProperty("Subject").equalsTo("Demo for Document Infos")
            .hasProperty("CreationDate").equalsTo("D:20131027172417+01'00'")
            .hasProperty("ModDate").equalsTo("D:20131027172417+01'00'")
  ;
}

Das im folgenden Beispiel benutzte Dokument besitzt zwei individuelle Key/Value-Werte, wie der Adobe Reader® zeigt:

Der Test auf die Existenz dieser individuellen Eigenschaften mit konkreten Werten sieht so aus:

@Test
public void hasProperty_CustomProperties() throws Exception {
  String filename = "documentUnderTest.pdf";
  String key1 = "Company";
  String expectedValue1 = "Signature Perfect KG";
  String key2 = "SourceModified";
  String expectedValue2 = "D:20081204045205";
  
  AssertThat.document(filename)
            .hasProperty(key1).equalsTo(expectedValue1)
            .hasProperty(key2).equalsTo(expectedValue2)
  ;
}

Um sicherzustellen, dass eine bestimmte 'Custom-Property' nicht im PDF-Dokument auftaucht, muss der Test so aussehen:

@Test
public void hasNoProperty() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasNoProperty("OldProperty_ShouldNotExist")
  ;
}

Ab PDF-1.4 existiert die Möglichkeit, Metadaten intern als XML zu speichern (Extensible Metadata Platform, XMP). Das Kapitel 3.37: „XMP-Daten“ geht darauf ausführlich ein.