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 Tags rund um das Thema „Layer“ an:
<!-- Tags to test layers: --> <!-- 'Layer' means the same as 'OCG, Optional Content Group'. So they have the same type: --> <hasNumberOfLayers />, <hasNumberOfOCGs /> <!-- Nested tags: --> <hasLayer> or <hasOCG> <withName> (required) <matchingComplete /> (one of these nested tags ... <containing /> ... <startingWith /> ... is required) </withName> </hasLayer> or </hasOCG> <hasLayers> or <hasOCGs> <allWithoutDuplicateNames /> (optional) </hasLayers> or </hasOCGs>
Ein Tag <endingWith />
steht nicht zur Verfügung,
weil doppelte Layernamen intern mit einem Suffix erweitert werden
und das Namensende somit nicht vorhersehbar ist.
Ein Tag matchingRegex />
wird ebenfalls nicht
angeboten. Es wird nicht benötigt, denn Layernamen sind üblicherweise
kurz und bekannt.
Die ersten Tests zielen auf die Anzahl der Layer (OCG):
<testcase name="hasNumberOfOCGs"> <assertThat testDocument="layer/hang-man-game.pdf"> <hasNumberOfOCGs>40</hasNumberOfOCGs> <hasNumberOfLayers>40</hasNumberOfLayers> </assertThat> </testcase>
Der nächste Test zielt auf die Namen der Layer:
<testcase name="hasLayerWithName_MatchingComplete"> <assertThat testDocument="layer/simpleLayerDemo.pdf"> <hasLayer> <withName> <matchingComplete>Parent Layer</matchingComplete> </withName> </hasLayer> </assertThat> </testcase>
Die Tags endingWith />
und matchingRegex />
werden aus den am Anfang des Kapitels erläuterten Gründen nicht angeboten.
Alle Vergleiche werden case-insensitiv ausgeführt. Leerzeichen bleiben erhalten:
<!-- Layer names are treated case-insensitive. --> <testcase name="hasLayerWithName_CaseInSensitive"> <assertThat testDocument="layer/simpleLayerDemo.pdf"> <hasLayer> <withName> <matchingComplete>parent layer</matchingComplete> </withName> </hasLayer> <hasLayer> <withName> <matchingComplete>Parent Layer</matchingComplete> </withName> </hasLayer> </assertThat> </testcase>
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 einem passenden Test überprüfen:
<testcase name="hasLayers_AllWithoutDuplicateNames"> <assertThat testDocument="layer/simpleLayerDemo.pdf"> <hasLayers> <allWithoutDuplicateNames /> </hasLayers> <hasOCGs> <!-- <hasOCGs /> is equal to <hasLayers /> --> <allWithoutDuplicateNames /> </hasOCGs> </assertThat> </testcase>
PDFUnit bietet im aktuellen Release 2015.10 noch keine Test, um auf die Inhalte von Layern zu testen.