====== Wiederholbare Formen ======
Eine PDF-Form ist eine Sequenz von Anweisungen zur Seitenbeschreibung, der ein Name zugeordnet wurde. Über diesen Namen kann die Form dann an beliebiger Stelle im Dokument eingesetzt werden. Die Form bildet dabei eine implizite Gruppe. Das heisst, Anweisungen in der Form können keinen Einfluss auf Anweisungen nach der Form nehmen. Umgekehrt können aber Anweisungen vor der Form Einfluss auf die Anweisungen in der Form nehmen.
===== Formobjekte =====
Zunächst müssen wir ein Formobjekt definieren. Dabei handelt es sich um ein Streamobjekt mit zusätzlichen Einträgen im Dictionary. Folgende Einträge neben ''/Length'' sollten vorhanden sein:
^/Type |immer ''/XObjekt'' |
^/Subtype |immer ''/Form'' |
^/BBox |Formumfang |
^/Resources |Resourcendictionary |
''/BBox'' ist mehr oder weniger das Gegenstück zu ''/MediaBox'' in Seitenbereichs- und Seitenobjekten. Man definiert damit die Zeichenfläche, die von den Anweisungen in der Form benötigt wird. Jegliche Operationen ausserhalb dieser Fläche werden abgeschnitten (so wie bei [[/grafik/komplexe_figuren#clipping|Clipping]]). Der Wert ist ein Array mit vier Zahlen, wovon typischerweise die ersten Beiden 0 sind, die Dritte auf die Breite, und die Vierte auf die Höhe des Bereichs gesetzt wird.
''/Resources'' enthält ein eigenes [[/grundlagen/metadaten/seitenparameter#resourcen|Resourcendictionary]]. Der Eintrag ist optional. Lässt man ihn weg, so wird jeweils das Resourcendictionary verwendet, welches beim Einfügen gerade gültig ist. Gibt es nur ein Resourcendictionary für das gesamte Dokument, so ist dies unproblematisch. Ansonsten kann man aber unliebsame Überraschungen erleben.
Als Streamdaten schliesslich legt man einfach die Anweisungen fest, welche man später einfügen will.
Beispiel:
10 0 obj
<<
/Type /XObject
/Subtype /Form
/BBox [0 0 100 100]
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >>
/Length 34
>>
stream
100 50 m 50 100 l 0 50 l 50 0 l f
endstream
endobj
Diese Form zeichnet einen gefüllten Rhombus. Da in der Form keine Füllfarbe definiert wurde, wird beim Einfügen die zu jenem Zeitpunkt gültige Farbe verwendet.
===== Einbindung als Resource =====
Nun können wir das Formobjekt im [[/grundlagen/metadaten/seitenparameter#x-objektdictionary|X-Object Dictionary]] des Resourcendictionarys der Seitenbereichs bzw. der Seite vermerken. Als Name wird üblicherweise ein ''Fo'' gefolgt von einer Nummer verwendet (da das grosse F alleine ja schon für Fonts verwendet wird).
Beispiel:
/Resources <<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 4 0 R
>>
/XObject <<
/Fo1 10 0 R
>>
>>
===== Einbindung in die Seite =====
Um die Form nun in einer Seite zu verwenden, benötigen wir die bereits bekannte Anweisung ''Do'', die wir bislang für Bilder verwendet haben.
Wie bei Bildern erwartet die Anweisung genau einen Parameter mit dem Namen des Objekts (in diesem Fall des Formobjekts), und wie bei Bildern wird die Form mit der linken, unteren Ecke auf dem Nullpunkt gezeichnet. Anders als bei Bildern wird die Form aber nicht 1x1 Einheiten gross gezeichnet, sondern gemäss den Angaben der ''/BBox''. Folglich müssen wir die Form immer noch per [[/grundlagen/seiteninhalt/transformation]] verschieben, aber wir müssen sie nicht unbedingt skalieren.
Beispiel:
q
1 0 0 1 72 670 cm
/Fo1 Do
Q
Damit zeichnen wir unseren Rhombus links oben auf dem Blatt.