Kachelmuster

In PDF ist es möglich, anstelle einer Füllfarbe ein Kachelmuster anzugeben. Der Inhalt der Kachel wird dabei ähnlich wie bei Formen definiert. Anders als bei Formen haben aber Anweisungen vor der Verwendung des Musters keinen Einfluss auf die Anweisungen innerhalb des Musters. Die Kacheln werden an der unteren, linken Ecke des Blattes ausgerichtet. Wenn zwei Figuren dasselbe Kachelmuster verwenden, sind die Kacheln daher bündig. Dies gilt auch dann, wenn auf die Figuren unterschiedliche Transformationen angewandt werden.

Es gibt eine Ausnahme, mit der sich das oben erwähnte Verhalten durchbrechen lässt: Wird das Muster innerhalb einer Form verwendet, so werden die Kacheln an der unteren, linken Ecke der Form ausgerichtet. Zudem haben Anweisungen vor Verwendung der Form einen Einfluss auf die Kacheln. Insbesondere wirkt sich die Transformation der Form auf die Kacheln aus. Anweisungen innerhalb der Form haben hingegen nach wie vor keinen Einfluss auf die Anweisungen der Kachel.

Neben den normalen Kachelmuster gibt es noch sogenannte farblose Kachelmuster. Bei diesen wird nur definiert, wo Linien und Flächen gezeichnet werden, aber nicht, in welcher Farbe. Die Farbe lässt sich dann bei der Anwendung des Musters festlegen. Für farblose Muster gibt es einige spezielle Punkte zu beachten, weswegen ich weiter unten spezifisch auf sie eingehe.

Kachelmusterobjekte

Kachelmusterobjekte sind ähnlich aufgebaut wie Formobjekte. Es handelt sich auch hier um ein Streamobjekt mit zusätzlichen Einträgen. Neben /Length wären dies:

/Type immer /Pattern
/PatternTypeimmer 1
/PaintType farbig oder farblos
/TilingType Skalierungsmethode
/BBox Kachelumfang
/XStep Kachelbreite
/YStep Kachelhöhe
/Resources Resourcendictionary

/PaintType ist 1 bei farbigen Mustern, 2 bei farblosen Mustern.

/TilingType gibt an, wie die Kacheln auf dem Bildschirm skaliert werden sollen. Aus Geschwindigkeitsgründen wird nämlich grundsätzlich auf eine exakte Pixelzahl hin skaliert, was uns optisch aber vor ein Dilemma stellt. Wir können entscheiden, wie es gelöst werden soll:

  • 1: Jede Kachel wird auf dieselbe Grösse skaliert. Das sieht gut aus, bewirkt aber, dass die Kacheln sich bei unterschiedlichen Zoomstufen verschieben können.
  • 2: Jede Kachel wird einzeln skaliert. Damit verschieben sich die Kacheln nicht, aber es kann zu leichten Verzerrungen führen, wenn manche Kacheln etwas grösser sind, als andere.
  • 3: Die Darstellung soll so schnell wie möglich ohne Rücksicht auf die Optik erfolgen.

/BBox verlangt ein Array mit vier Zahlen, wovon die ersten Beiden 0 sein sollten. Die dritte Zahl soll die Breite der Zeichenfläche, die vierte Zahl die Höhe der Zeichenfläche enthalten.

/XStep und /YStep geben die Breite und Höhe der gesamten Kachel einschliesslich des horizontalen bzw. vertikalen Abstands an. Sie können somit grösser sein als die Werte in /BBox, aber auf keinen Fall kleiner.

/Resources enthält ein eigenes Resourcendictionary. Anders als bei Formen ist dies bei Kachelmustern obligatorisch.

Als Streamdaten legt man die Anweisungen zum Zeichnen der einzelnen Kacheln fest.

Beispiel:

10 0 obj
<<
/Type /Pattern
/PatternType 1
/PaintType 1
/TilingType 1
/BBox [0 0 10 10]
/XStep 15
/YStep 15
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >>
/Length 36
>>
stream
0 0 1 rg
10 5 m 5 10 l 0 5 l 5 0 l f
endstream
endobj

Damit definieren wir ein Muster aus blauen Rhomben.

Einbindung als Resource

Nun können wir das Muster im Resourcendictionary der Seite, des Seitenbereichs oder der Form eintragen. Für Muster gibt es dabei ein eigenes Unterdictionary nammens /Pattern. Die Einträge funktionieren gleich, wie wir es von Schriften, Bildern und Formen kennen. Als Name wird typischerweise ein grosses P gefolgt von einer Nummer verwendet.

Beispiel:

/Resources <<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 4 0 R
>>
/Pattern <<
/P1 10 0 R
>>
>>

Einbindung in die Seite/Form

Um das Muster verwenden zu können, müssen wir es als „Füllfarbe“ auswählen. Die Muster existieren dabei als benannte „Farben“ im Pseudofarbraum /Pattern. Um darauf zugreifen zu können, brauchen wir zwei neue Anweisungen:

cs Wählt einen Farbraum
scn Wählt eine benannte Farbe aus dem aktuellen Farbraum

cs erwartet genau einen Parameter mit dem Namen des Farbraums. scn erwartet ein bis fünf Parameter, je nach Farbraum. Im Falle von farbigen Mustern ist es genau ein Parameter mit dem Namen des Musters.

Beispiel:

/Pattern cs
/P1 scn
72 72 144 144 re b

farblose Muster

Objekt

Das Musterobjekt wird bei farblosen Mustern grundsätzlich gleich definiert, wie bei farbigen Mustern. Es gibt nur drei Unterschiede:

  1. Der Eintrag /PaintType wird auf 2 gesetzt.
  2. Es dürfen keine Anweisungen vorhanden sein, welche eine Farbe setzen.
  3. Strich- und Füllfarbe sind identisch.

Beispiel:

10 0 obj
<<
/Type /Pattern
/PatternType 1
/PaintType 2
/TilingType 1
/BBox [0 0 10 10]
/XStep 15
/YStep 15
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >>
/Length 28
>>
stream
10 5 m 5 10 l 0 5 l 5 0 l f
endstream
endobj

Schablonen

Regel Nummer 2 bewirkt indirekt, dass keine normalen Bilder verwendet werden können. Erlaubt sind nur sogenannte Schablonen. Dabei handelt es sich um Schwarzweissbilder, wobei schwarze Punkte als „bemalt“ und weisse Punkte als „unbemalt“ gelten. Um eine Schablone zu definieren, erzeugt man ein Bildobjekt mit folgenden Eigenheiten:

  1. Ein Eintrag /ImageMask mit Wert true wird hinzugefügt.
  2. Der Eintrag /ColorSpace wird weggelassen.
  3. Der Eintrag /BitsPerComponent muss auf 1 stehen.

Resource

Farblose Muster werden auf die gleiche Art wie farbige Muster als Resource eingebunden. Zusätzlich müssen wir aber einen eigenen Pseudofarbraum definieren. Die Definition ist ein Array mit zwei Einträgen. Der erste Eintrag ist immer /Pattern, der zweite Eintrag ist der Farbraum, in dem wir später die Farbe angeben wollen (also z.B. /DeviceRGB). Als Name des Farbraums nimmt man typischerweise Cs gefolgt von einer Nummer. Definiert wird der Farbraum in einem /ColorSpace Dictionary des Resourcendictionarys.

Beispiel:

/Resources <<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 4 0 R
>>
/Pattern <<
/P1 10 0 R
>>
/ColorSpace <<
/Cs1 [/Pattern /DeviceRGB]
>>
>>

Verwendung

Für die Einbindung in die Seite oder Form verwenden wir wiederum cs und scn. Bei cs muss aber diesmal unser selbst definierter Farbraum stehen, und scn erwartet vor dem Namen des Musters nun ein bis vier Zahlen mit den Farbwerten.

Beispiel:

/Cs1 cs
1 0 0 /P1 scn
72 72 144 144 re b
0 1 0 /P1 scn
72 216 144 144 re b