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 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 |
---|---|
/PatternType | immer 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:
/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.
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 >> >>
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
Das Musterobjekt wird bei farblosen Mustern grundsätzlich gleich definiert, wie bei farbigen Mustern. Es gibt nur drei Unterschiede:
/PaintType
wird auf 2
gesetzt.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
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:
/ImageMask
mit Wert true
wird hinzugefügt./ColorSpace
wird weggelassen./BitsPerComponent
muss auf 1
stehen.
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] >> >>
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
Diskussion