Titel: Aufbau des Portable Document Format (PDF)
Beitrag von: Sebastian am 01. Dezember 2022, 16:45:00
Wie hier (https://www.suletuxe.de/forum/index.php?board=12;action=display;threadid=709) angekündigt, wollte ich mich zurückmelden, sobald ich etwas mehr über das PDF weis. Da das Thema komplexer ist, mache ich dafür lieber einen eignen Thread auf.
Der Post wird noch nicht ganz fertig und ich werde ihn später noch weiter ergänzen.
PDF Syntax
Der Dokumenteninhalt besteht aus verschiedenen Objekten, die aus folgenden Elementen bestehen:
- Namen geschrieben als /Name
- Ganzzahlen wie 30
- Strings, die mit Klammern dargestellt werden (Dies ist ein String)
- Objektreferenzen wie 3 0 R das zum dritten Objekt verweist.
- Arrays wie [30 70 /Name] ein Array mit 3 Objekten 30, 70 und /Name
- Dictionaries (Bilioteken) wie << /ten 10 /two 2 >> das /ten auf die 10 und /two auf die 2 verweist.
- Streams, die aus Dictionaries bestehen, die PDF-Grafik Operatoren (um PDF Vektorgrafiken zu zeichnen) oder andere binäre Daten enthalten (Anhänge, Rastergrafiken etc.)
Anmerkung:
In so einen Stream Objekt kann man alles an Daten rein kodieren, was man möchte.
Jedes erzeugte Objekt wird durchnummeriert und in die cross-reference-table eingetragen, die den offset jedes Objekt enthält, wo genau man dies in der Datei finden kann.
z.b. diese Seiten Liste Objekt:
Code:
1 0 obj # Objekt 1 << /Type /Pages # Es ist eine Seiten Liste /Count 1 # Es gibt eine Seite /Kids [2 0 R] # Liste von Objekt Nummern der Seiten, hier nur das Seiten Objekt 2 >> endobj # Ende von Objekt 1
|
|
Wenn man also in dem Seiten Liste Objekt nach /Count sucht, bekommt man die Anzahl der Seiten einer PDF heraus. Das kann man sich in Hinterkopf behalten, falls man die Seitenanzahl einer PDF mithilfe eines Skriptes einlesen möchte.
PDF Struktur
Eine einfache gültige PDF-Datei besteht aus 4 Teilen in folgender Reihenfolge:
- Denn Header indem die PDF Version Nummer steht
- Denn Body der die Seiten, Grafiken und ergänzende Informationen in Form von mehreren Objekten kodiert hat.
- Die cross-reference table die, die Positionen der Objekte in der Datei referenziert, und damit den Zufallszugriff (Es muss nicht die ganze Datei geladen werden, um eine Seite in der Mitte z.B. aufzurufen) sicherstellt.
- Denn trailer mit dem trailer dictionary der Metadaten enthählt und hilft jede stelle in der Datei zu finden. Dieser enthält auch denn offset zur cross-reference table
Der Header
Eine PDF-Datei fängt mit dem Header an, die dem jeweiligen benutzten Programmen mitteilt, dass es sich um eine PDF-Datei handelt, und in welche Version diese vorliegt.
- 1 Zeile enthält die PDF-Version
- 2 Zeile enthält binär Daten, damit die Datei als ein Binary erkannt wird.
Code:
%PDF-1.4 # PDF 1.4 Version header 0101010 # Binary Daten
|
|
Fortsetzung folgt...
|
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2003, YaBB SE Dev Team. All Rights Reserved.
|