3.3. Anhänge (Attachments)

Überblick

Dateien, die als Attachments in PDF-Dokumenten enthalten sind, spielen in nachverarbeitenden Prozessen meist eine wichtige Rolle. Deshalb stellt PDFUnit Testmethoden für Attachments (eingebettete Dateien) bereit:

// Simple tests:
.hasEmbeddedFile()
.hasNumberOfEmbeddedFiles(..) 

// More detailed tests:
.hasEmbeddedFile().withContent(..) 
.hasEmbeddedFile().withName(..)

Die folgenden Tests beziehen sich auf das PDF-Formular für die deutsche Umsatzsteuervoranmeldung 2010, umsatzsteuervoranmeldung-2010.pdf. Es enthält eine Datei mit dem Namen PrePress-Qualität.joboptions.

Existenz

Der einfachste Test ist, zu prüfen, ob es überhaupt eingebettete Dateien gibt:

@Test
public void hasEmbeddedFile() throws Exception {
  String filename = "umsatzsteuervoranmeldung-2010.pdf";
  
  AssertThat.document(filename)
            .hasEmbeddedFile()
  ;
}

Anzahl

Etwas weiter geht die Prüfung der Anzahl der eingebetteten Dateien:

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

Dateiname

Danach kommen die Namen der Dateien:

@Test
public void hasEmbeddedFile_WithName() throws Exception {
  String filename = "documentUnderTest.pdf";
  
  AssertThat.document(filename)
            .hasEmbeddedFile().withName("PrePress-Qualität.joboptions")
  ;
}

Inhalt

Und schließlich kann der Inhalt der in PDF eingebetteten Datei mit einer externen Datei verglichen werden:

@Test
public void hasEmbeddedFile_WithContent() throws Exception {
  String filename = "documentUnderTest.pdf";
  String embeddedFileName = "embeddedfiles/PrePress-Qualität.joboptions";
  
  AssertThat.document(filename)
            .hasEmbeddedFile().withContent(embeddedFileName)
  ;
}

Der Vergleich erfolgt Byte-weise. Als Parameter für die Vergleichsdatei kann entweder ein Dateiname oder eine Instanz von java.util.File verwendet werden.

Mehrfachaufrufe

Das nächste Beispiel bezieht sich auf die Datei kubrick_dvds.pdf, eine Beispieldatei von iText. Der Adobe Reader® zeigt die eingebetteten Dateien an:

Mehrere Dateien können mit einem Test überprüft werden. Wählen Sie aber einen passenderen Namen für die Testmethode, als in dem nächsten Beispiel:

@Test
public void hasEmbeddedFile_MultipleInvocation() throws Exception {
  String filename = "kubrick_dvds.pdf";
  String embeddedFileName1 = "0048254.jpg";
  String embeddedFileName2 = "0049406.jpg";
  String embeddedFileName3 = "0050825.jpg";
  
  AssertThat.document(filename)
            .hasEmbeddedFile().withName(embeddedFileName1)
            .hasEmbeddedFile().withName(embeddedFileName2)
            .hasEmbeddedFile().withName(embeddedFileName3)
  ;
}

Wenn die eingebetteten Dateien nicht als eigene Datei vorliegen, können sie mit dem Hilfsprogramm ExtractEmbeddedFiles aus einem bestehenden PDF-Dokument extrahiert werden. Das Programm wird in Kapitel 9.2: „Anhänge extrahieren“ genauer beschrieben.