3.17. 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 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.

Anzahl

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)     1
            .hasNumberOfLayers(40)   2
  ;
}

1 2

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

Layernamen

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)

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 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.