3.14. Layer

Überblick

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.

Anzahl

Die ersten Tests zielen auf die Anzahl der Layer (OCG):

<testcase name="hasNumberOfOCGs">
  <assertThat testDocument="layer/hang-man-game.pdf">
    <hasNumberOfOCGs>40</hasNumberOfOCGs>     1
    <hasNumberOfLayers>40</hasNumberOfLayers> 2
  </assertThat>
</testcase>

1 2

Layer und Optional Content Group sind funktional identisch. Aus sprachlichen Gründen werden beide Begriffe als gleichwertige Tags angeboten.

Layernamen

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>

Doppelte Layername

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.