Die sichtbaren Inhalte eines PDF-Dokumentes können sich in mehreren Ebenen befinden und jede Ebene kann sichtbar oder unsichtbar geschaltet werden. In der PDF-Spezifikation „PDF 32000-1:2008“ heißt es dazu in Abschnitt 8.11.2.1. „An optional content group is a dictionary representing a collection of graphics that can be made visible or invisible dynamically by users of conforming readers.“
Die Begriffe „Layer“ und „Optional Content Group, OCG“ bezeichnen das Gleiche. Während die Spezifikation den Begriff „OCG“ benutzt, verwendet der Adobe Reader® den Begriff „Layer“.
PDFUnit bietet folgende Testmethoden rund um das Thema Layer an:
// Simple methods: .hasNumberOfLayers(..) // 'Layer' and ... .hasNumberOfOCGs(..) // ...'OCG' are always used the same way .hasLayer() .hasOCG() .hasOCGs() .hasLayers() // Methods for layer names: .hasLayer().withName().containing(..) .hasLayer().withName().equalsTo(..) .hasLayer().withName().startingWith(..) .hasOCG().withName().containing(..) .hasOCG().withName().equalsTo(..) .hasOCG().withName().startingWith(..) // see the plural form: .hasLayers().allWithoutDuplicateNames() .hasOCG().allWithoutDuplicateNames()
Eine Testmethode matchingRegex()
wird nicht angeboten.
Sie ist nicht nötigt, weil Layernamen üblicherweise kurz und klar sind.
Der erste Test zielt auf die Anzahl der Layer (OCG):
@Test public void hasNumberOfOCGs() throws Exception { String filename = "documentUnderTest.pdf"; AssertThat.document(filename) .hasNumberOfOCGs(40) .hasNumberOfLayers(40) ; }
Der nächste Test zielt auf die Namen der Layer:
@Test public void hasLayer_WithName() throws Exception { String filename = "documentUnderTest.pdf"; AssertThat.document(filename) .hasLayer() .withName().equalsTo("Parent Layer") ; }
Für den Namen gibt es folgende Vergleichsmethoden:
.hasLayer().withName().equalsTo(layerName1) .hasLayer().withName().startingWith(layerName2) .hasLayer().withName().containing(layerName3)
Die Namen von Layern innerhalb eines PDF-Dokumentes müssen laut PDF-Standard nicht eindeutig sein. Das Dokument im folgenden Beispiel enthält doppelte Layernamen. Sie werden vom Adobe Reader® nicht angezeigt, wohl aber vom Analysewerkzeug „PDFVole“, wie die folgenden Bilder zeigen:
Layer-Namen im Adobe Reader® | Layer Objekte in PDFVole |
---|---|
|
|
Anhand der Bilder ist zu sehen, dass die Layer-Objekte mit den Nummern 32 und 52 den gleichen Namen „Dash9“ haben.
Wenn ein PDF-Dokument keine gleichnamigen Layer haben soll, können Sie das mit einer passenden Testmethode überprüfen:
@Test public void hasLayers_AllWithoutDuplicateNames() throws Exception { String filename = "documentUnderTest.pdf"; AssertThat.document(filename) .hasLayers().allWithoutDuplicateNames() .hasOCGs().allWithoutDuplicateNames() // hasOCGs() is equal to hasLayers() ; }
PDFUnit bietet im aktuellen Release 2016.05 noch keine Tests, um auf die Inhalte von Layern zu testen.