PDF-Aufbau aus Coding-Perspektive
Eine PDF-Datei ist von außen ein fertiges Dokument – von innen ein präzise spezifiziertes Format aus Objekten, Streams und Verweisen. Dieser Artikel zeigt, was sich hinter den Bytes verbirgt: vier Bestandteile, acht Objekttypen und ein klar definiertes Verweis-System. Die Coding-Sicht ist die Grundlage für alles, was später folgt – inklusive Tags und Barrierefreiheit.
Was eine PDF-Datei wirklich ist
Ein PDF – kurz für Portable Document Format – ist auf Datei-Ebene ein hybrides Format: Der äußere Rahmen ist eine textbasierte, lesbare Syntax. Eingebettet darin liegen Streams – häufig komprimierte oder binär kodierte Datenblöcke für Schriften, Bilder oder Seiteninhalte. Ein PDF lässt sich mit einem Texteditor öffnen und in Teilen lesen, auch wenn die Streams selbst nur mit Decoder verständlich sind.
Standardisiert ist das Format als ISO 32000. Die aktuelle Fassung ist ISO 32000-2:2020(PDF 2.0). Die ältere, weiter verbreitete ISO 32000-1:2008(PDF 1.7) wird in der Praxis nach wie vor häufig verwendet. Beide Spezifikationen sind heute frei zugänglich – die PDF Association veröffentlicht sie als freely available.
Die vier Bestandteile einer PDF-Datei
Jede PDF-Datei hat denselben groben Aufbau – vier Abschnitte, von oben nach unten gelesen:
%%EOF
und arbeiten sich rückwärts: zuerst der Trailer, dann die
xref-Tabelle, dann die referenzierten Objekte im Body.Header
Die ersten Bytes der Datei sind eine Versionsangabe wie %PDF-1.7
oder %PDF-2.0
. Direkt danach folgt
üblicherweise eine Zeile mit vier Bytes über dem Wert 128 (binär
kodiert), die signalisiert: Diese Datei enthält binäre Daten und darf
nicht als reine Textdatei behandelt werden.
Body
Im Body liegen alle Objekte, aus denen die PDF-Datei besteht: der Katalog, der Seitenbaum, die einzelnen Seiten, Schriften, Bilder, Content Streams und vieles mehr. Jedes Objekt hat eine eindeutige Nummer und eine Version (Generation), zusammen die indirekte Referenz.
Cross-Reference-Tabelle (xref)
Die xref-Tabelle ist der Index der Datei: Für jedes indirekte Objekt steht hier der Byte-Offset vom Dateianfang. Damit kann ein Reader gezielt zu einem Objekt springen, ohne die ganze Datei sequenziell zu lesen. In PDF 2.0 ersetzen häufig Cross-Reference-Streams die klassische Tabelle – funktional ist das identisch, nur kompakter und komprimierbar.
Trailer
Der Trailer schließt die Datei ab. Er nennt das Root-Objekt (den
Katalog), optional ein Info-Objekt, die Anzahl der Objekte und den
Byte-Offset zur xref-Tabelle. Die allerletzten Zeichen einer
konformen PDF-Datei sind startxref
, der Byte-Offset und %%EOF
als Endemarkierung.
Die acht Objekttypen
Alle Inhalte in einer PDF-Datei sind aus acht Grundtypen aufgebaut. Diese Typen sind die Bausteine, aus denen sich der gesamte Body zusammensetzt – Katalog, Seiten, Annotationen, Bilder und Schriften sind am Ende immer Dictionaries , manchmal mit angehängten Streams.
| Typ | Beispiel | Wofür |
|---|---|---|
| Boolean | true
, false
|
Ja/Nein-Werte in Dictionaries |
| Numeric | 42
, -1.75
|
Ganz- und Fließkommazahlen, Koordinaten, Größen |
| String | (Hallo)
, <48616C6C6F>
|
Text, in literaler oder hexadezimaler Form |
| Name | /Type
, /Pages
|
Schlüssel in Dictionaries, Bezeichner |
| Array | [0 0 612 792]
|
Geordnete Listen, z. B. MediaBox |
| Dictionary | << /Type /Catalog >>
|
Schlüssel-Wert-Tabellen, das Rückgrat des Formats |
| Stream | << /Length 123 >> stream … endstream
|
Binär-Blöcke: Content, Bilder, Schriften |
| Null | null
|
„Kein Wert" |
Der wichtigste dieser Typen ist das Dictionary. Es
besteht aus Paaren von Names
und Werten, eingerahmt von << … >>
. Fast jedes höhere PDF-Konstrukt ist
ein Dictionary mit einem /Type
-Eintrag, der den Inhalt
klassifiziert ( /Catalog
, /Pages
, /Page
, /Font
, /StructTreeRoot
und
so weiter).
Indirekte Objekte und der Verweis-Mechanismus
Objekte im Body sind in der Regel indirekte Objekte – sie haben eine Nummer und können von anderen Stellen referenziert werden. Die Syntax ist einfach:
Die Zahlen 1 0
sind Objekt-Nummer und Generation. Der
Eintrag 2 0 R
ist eine indirekte Referenz
auf das Objekt mit Nummer 2, Generation 0. So entstehen
Verweisketten: Der Katalog verweist auf den Seitenbaum, der Seitenbaum
auf die einzelnen Seiten, eine Seite auf ihren Content Stream, ihre
Schriften, ihre Bilder.
Die Cross-Reference-Tabelle ist das, was diese Referenzen schnell
auflösbar macht: Sie speichert für jede Objektnummer den Byte-Offset.
Beim Öffnen einer PDF-Datei beginnt ein Reader deshalb fast immer am
Ende – liest %%EOF
, springt zur durch startxref
angegebenen xref-Position und arbeitet sich von dort zu Trailer und
Katalog vor.
Content Streams und Resources
Eine einzelne Seite ist ein Dictionary mit dem Typ /Page
.
Sie verweist auf zwei zentrale Bausteine:
-
/Contents– einen oder mehrere Content Streams. Das sind binäre (meist komprimierte) Blöcke mit der eigentlichen Seitenbeschreibung : kleine Befehle, die sagen, wo Text gezeichnet wird, wo Linien verlaufen, wo Bilder platziert sind. -
/Resources– ein Dictionary mit allen Mitteln, die der Content Stream braucht: Schriften (/Font), Bilder und Formulare (/XObject), Farbräume (/ColorSpace), Muster (/Pattern) und mehr. Sie werden im Content Stream über ihren Resource Name referenziert – etwa/F1für eine bestimmte Schrift.
Innerhalb eines Content Streams werden Befehle in einer eigenen, sehr kompakten Operator-Syntax verwendet – Text-Operatoren, Pfad-Operatoren, Transformationen. Diese Schicht ist Thema eines eigenen Artikels.
Dieses Beispiel zeigt das Grundmuster der gesamten PDF-Seitenbeschreibung:
Sehr kurze Operatoren, in Postfix-Notation
, jeweils einzeln in
einer Zeile. BT
/ ET
umrahmen ein Text-Objekt, Tf
setzt Schrift und Größe, Td
verschiebt die
Schreibposition, Tj
zeichnet die Zeichenkette.
Wo Barrierefreiheit ins Spiel kommt
Die bisher beschriebene Struktur sagt einem Reader, wie eine Seite aussieht
– nicht, was sie bedeutet. Eine Überschrift
und ein normaler Absatz sehen im Content Stream praktisch gleich aus:
Texte werden mit denselben Operatoren gezeichnet, eine größere Schrift
ist nur ein anderer Wert nach Tf
. Für rein visuelle
Darstellung reicht das.
Damit eine PDF-Datei auch für Screenreader, Suche und
Wiederverwendbarkeit funktioniert, ergänzt das Format eine parallele Strukturebene: den Struktur-Baum.
Er hängt am Katalog unter dem Schlüssel /StructTreeRoot
und ist ein Baum aus Struktur-Elementen
– etwa /H1
, /P
, /Figure
, /Table
, /Form
oder /Link
.
Diese Strukturelemente verweisen über Marked-Content-IDs
auf konkrete Bereiche im Content
Stream. Im Content Stream selbst werden diese Bereiche durch die
Operatoren BDC
(Begin Dictionary Content) und EMC
(End Marked Content) abgegrenzt. So entsteht die
Verbindung zwischen was steht da
(Content Stream) und was ist es
(Strukturelement im Struktur-Baum).
Drei verbreitete Missverständnisse
„Eine PDF-Datei ist im Wesentlichen PostScript." Nicht mehr. Die Content-Stream-Operatoren erinnern an PostScript, aber PDF hat keine Programmierschleifen, keine prozeduralen Konstrukte und kein dynamisches Stack-Verhalten auf Datei-Ebene. Es ist ein deklaratives Format mit einem klar spezifizierten Objekt-Modell.
„Reader lesen die Datei von vorne nach hinten."
In der Regel nicht. Reader beginnen am Ende mit %%EOF
, lesen rückwärts den Trailer, lokalisieren die
xref-Tabelle und springen dann gezielt zu den benötigten Objekten.
Genau dieses Random-Access-Modell macht das Format „streamfähig" –
ohne dass man die Datei komplett laden müsste.
„Tags und Layout sind das Gleiche." Nein. Die visuelle Darstellung lebt im Content Stream, die semantische Struktur im Struktur-Baum am Katalog. Verbunden sind beide nur über Marked-Content-IDs. Wer Layout fixiert, ohne den Struktur-Baum zu pflegen, erzeugt eine PDF, die optisch funktioniert und für Assistive-Technologie blind bleibt.
Was du daraus mitnimmst
Drei Punkte, mit denen sich die meisten späteren PDF-Themen besser sortieren lassen:
- PDF ist ein hybrides Format aus Text-Syntax und binären
Streams.
Die Text-Syntax ist mit jedem Editor sichtbar –
wer in die Streams hineinschauen möchte, dekomprimiert sie z. B.
mit
qpdf --qdf. - Alles ist am Ende ein Dictionary. Katalog, Seiten, Schriften, Annotationen, Strukturelemente – immer ein Dictionary, oft mit einem zugehörigen Stream. Dieses Muster ist das wichtigste Werkzeug, um Spec-Stellen schnell zu lesen.
- Layout und Semantik laufen parallel. Der Content Stream zeichnet die Seite, der Struktur-Baum beschreibt ihre Bedeutung. Beide treffen sich über Marked-Content-IDs. Barrierefreiheit ist die Aufgabe, beide Bäume miteinander in Einklang zu bringen.
Wer diese Grundlagen kennt, kann später deutlich gezielter über Tagging, Content-Stream-Operatoren oder Barrierefreiheitsprüfungen sprechen – statt mit der Datei als „Black Box" zu hantieren.
PDF-Pipeline im Detail durchleuchten?
Wir analysieren bestehende PDF-Workflows bis auf Objekt-Ebene – von der Struktur des Tag-Baums über Tagging-Lücken im Content Stream bis zur Frage, ob das eingesetzte Werkzeug überhaupt PDF/UA-konform ausgibt – und unterstützen Entwicklungsteams bei der Anbindung eigener Tooling-Stacks.
Beratung oder Schulung anfragen
