Fast jeder Programmierkurs beginnt mit einem „Hallo Welt“ Programm. Und da PDF ein textbasiertes Format ist, warum nicht?
%PDF-1.4 1 0 obj << /Title (Hallo Welt) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Resources << /Font << /F1 4 0 R >> /ProcSet [/PDF /Text] >> /Kids [5 0 R] /Count 1 >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R >> endobj 6 0 obj << /Length 41 >> stream /F1 48 Tf BT 72 746 Td (Hallo Welt) Tj ET endstream endobj xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000050 00000 n 0000000102 00000 n 0000000268 00000 n 0000000374 00000 n 0000000443 00000 n trailer << /Size 7 /Info 1 0 R /Root 2 0 R >> startxref 534 %%EOF
Das ist ein gültiges PDF Dokument, mit einer A4-Seite und dem Text „Hallo Welt“ in der linken oberen Ecke. In diesem Fall ist die Datei im Unix-Textformat, welches unter anderem von Mac OS X und Linux verwendet wird. Im Windows-Textformat gibt es wegen der unterschiedlichen Zeilenumbrüche zwei Unterschiede, nämlich beim Objekt 6:
6 0 obj << /Length 45 >>
Bei der xref-Tabelle:
xref 0 7 0000000000 65535 f 0000000010 00000 n 0000000054 00000 n 0000000111 00000 n 0000000288 00000 n 0000000401 00000 n 0000000476 00000 n trailer << /Size 7 /Info 1 0 R /Root 2 0 R >> startxref 578 %%EOF
Schön und gut, aber was bedeutet das alles? Darauf gehen wir noch im Detail ein, aber hier eine Übersicht:
%PDF-1.4
Hiermit deklarieren wir die Datei als PDF der Version 1.4
1 0 obj << /Title (Hallo Welt) >> endobj
Die Metadaten des Dokuments. In diesem Fall nur dessen Titel.
2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj
Der Katalog enthält verschiedene Verweise für den Interpreter. In diesem Fall nur einen auf das Seitenbereichsobjekt.
3 0 obj << /Type /Pages /MediaBox [0 0 595 842] /Resources << /Font << /F1 4 0 R >> /ProcSet [/PDF /Text] >> /Kids [5 0 R] /Count 1 >> endobj
Das Seitenbereichsobjekt enthält die Grundeinstellungen für die Einzelseiten, und eine Liste der Einzelseiten.
In diesem Fall wird zunächst die Seitengrösse auf 595x842pt festgelegt. 1pt ist 1/72 Zoll, womit wir annähernd eine Seite von 21×29,7cm erhalten, also A4.
Zweitens haben wir eine Resourcenliste. In dieser enthalten sind eine Schrift F1 im Objekt Nummer 4, und eine Deklaration, dass dieses PDF nur die grundlegenden Strukturen und Textdarstellungen enthält.
Drittens schliesslich haben wir eine Liste und Zählung der Einzelseitenobjekte. In diesem Fall haben wir genau eine Seite.
4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj
Die Definition der Schrift. Wir verwenden eine der Standardschriften, wodurch diese paar Informationen ausreichen.
5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R >> endobj
Im Seitenobjekt können wir alle Angaben des Seitenbereichsobjekts übersteuern. Das macht aber hier keinen Sinn. Statt dessen verweisen wir lediglich auf das Inhaltsobjekt, welches den eigentlichen Seiteninhalt enthält.
6 0 obj << /Length 41 >> stream /F1 48 Tf BT 72 746 Td (Hallo Welt) Tj ET endstream endobj
Das Inhaltsobjekt ist ein sogenanntes Streamobjekt. Streams werden im Allgemeinen verwendet, um lange Zeichenketten oder externe Dateien einzubinden. Unter anderem verwendet man sie auch für die eigentlichen Seitenbeschreibungen. Betrachten wir die einzelnen Zeilen.
/F1 48 Tf
besagt, dass wir die Schrift F1 in Grösse 48 verwenden wollen.
BT
markiert den Anfang eines Textes.
72 746 Td
gibt die Position des Textes als 72pt vom linken und 746pt vom unteren Rand an.
(Hallo Welt) Tj
liefert den darzustellenden Text.
ET
schliesslich schliesst den Text ab.
xref 0 7 0000000000 65535 f 0000000009 00000 n 0000000050 00000 n 0000000102 00000 n 0000000268 00000 n 0000000374 00000 n 0000000443 00000 n
Die Referenztabelle enthält genaue Angaben darüber, wo innerhalb der Datei sich die einzelnen Objekte befinden.
trailer << /Size 7 /Info 1 0 R /Root 2 0 R >>
Der Trailer gibt Auskunft darüber, wie gross die Referenztabelle ist, welches Objekt die Metadaten enthält, und welches der Katalog ist.
startxref 534
Hiermit definieren wir die Position der Referenztabelle.
%%EOF
Und zu guter letzt markieren wir das Ende des Dokuments.
Diskussion