Wie werden Bilder in PDF gespeichert? XObject, Filter und Masken
8 Min. Lesezeit
Wie liegt das Foto, das Sie beim Öffnen eines PDFs sehen, in der Datei? Die Antwort ist komplexer, als es zunächst scheint: Bilddaten, Farbinformationen, Transparenzmaske und Platzierungsangaben werden an getrennten Stellen gespeichert. In diesem Beitrag erklären wir die Bildspeicherarchitektur von PDF und wie sie sich auf das Extrahieren auswirkt.
Image XObject: die Grundstruktur
In PDF wird ein Bild als Objekt namens Image XObject gespeichert. Dieses Objekt besteht aus einem Wörterbuch und einem Datenstrom:
<< /Type /XObject
/Subtype /Image
/Width 2400
/Height 1800
/ColorSpace /DeviceRGB
/BitsPerComponent 8
/Filter /DCTDecode
/Length 458392
>>
stream
...(JPEG-Daten)...
endstream
Die Bedeutung der Schlüssel:
| Schlüssel | Bedeutung |
|---|---|
| /Width, /Height | Die Maße in Pixeln |
| /ColorSpace | Der Farbraum (DeviceRGB, DeviceCMYK, DeviceGray, Indexed) |
| /BitsPerComponent | Bits pro Kanal (meist 8) |
| /Filter | Wie die Daten kodiert sind |
| /SMask | Sofern vorhanden, ein Verweis auf das Transparenzmaskenobjekt |
| /Decode | Ob die Farbwerte invertiert werden |
Der entscheidende Punkt: Dieses Wörterbuch sagt nicht, wo das Bild auf der Seite liegt. Die Angaben zu Position und Skalierung stehen im Inhaltsstrom der Seite:
q
400 0 0 300 100 500 cm % Skalierungs- und Positionsmatrix
/Im1 Do % Bild Im1 zeichnen
Q
Diese Matrix bedeutet: "Zeichne dieses Bild mit 400 Punkt Breite und 300 Punkt Höhe an der Position (100,500)."
Diese Trennung erklärt das Verhalten des Rohextrahierens: Das Extrahieren nimmt das Bildobjekt, nicht seine Platzierung auf der Seite. Ein Bild, das auf der Seite gedreht, beschnitten oder verkleinert erscheint, kommt beim Extrahieren in seinem ursprünglichen Zustand heraus.
Filter: wie die Daten kodiert sind
Der Schlüssel /Filter gibt an, mit welcher Komprimierung die Daten im Strom kodiert sind. Die verbreitetsten sind:
/DCTDecode – JPEG-Komprimierung. Die Daten im Strom sind eine echte JPEG-Datei. Das ist eine kluge Entwurfsentscheidung von PDF: Statt ein JPEG beim Einfügen zu dekodieren und neu zu komprimieren, speichert es dieses unverändert. Das Ergebnis: Die Datei bleibt klein, und es entsteht kein zusätzlicher Qualitätsverlust.
Beim Rohextrahieren können Sie diese Daten unmittelbar als .jpg speichern – es ist keine Umwandlung nötig.
/FlateDecode – Verlustfreie zlib-/deflate-Komprimierung. Werden die Daten im Strom entpackt, entsteht ein rohes Pixelarray. Beim Extrahieren muss man diese Daten in ein nutzbares Format (meist PNG) verpacken – denn ein rohes Pixelarray allein ist keine Bilddatei.
/JPXDecode – JPEG 2000. Selten, wird aber in manchen Scansystemen verwendet. Lässt sich unmittelbar als .jp2 extrahieren, doch viele Programme können dieses Format nicht öffnen.
/CCITTFaxDecode – Faxkomprimierung für gescannte Schwarzweißdokumente. Sehr effizient; der Scan einer A4-Seite kann nur wenige Zehner-Kilobyte umfassen. Beim Extrahieren wird sie üblicherweise in ein TIFF verpackt.
/JBIG2Decode – Fortgeschrittene Schwarzweißkomprimierung. Effizienter als CCITT, aber weniger breit unterstützt.
/LZWDecode – Eine ältere verlustfreie Komprimierung, die auch in TIFF und GIF verwendet wird.
Das Ausgabeformat des Extraktionswerkzeugs hängt von diesem Filter ab: DCTDecode → JPEG, FlateDecode → PNG, CCITTFaxDecode → TIFF. Deshalb können aus demselben PDF Dateien in verschiedenen Formaten kommen.
Farbräume und Probleme beim Extrahieren
Der Schlüssel /ColorSpace bestimmt die Farbauslegung des Bildes:
/DeviceRGB – Standard-Bildschirmfarben. Kommt problemlos heraus.
/DeviceGray – Graustufen. Problemlos.
/DeviceCMYK – Druckfarben. Hier beginnen die Probleme: Viele Betrachter und Browser können CMYK-JPEGs nicht sauber öffnen oder zeigen die Farben invertiert. Zudem verwenden manche CMYK-JPEGs Adobes Konvention der invertierten Kodierung und sind mit dem Array /Decode [1 0 1 0 1 0 1 0] gekennzeichnet – diese Information steckt im Bildobjekt, nicht in der extrahierten JPEG-Datei. Das Ergebnis: Die entstehende Datei kann als Negativ erscheinen.
/Indexed – Palettenbasierte Farbe. Die Bilddaten enthalten Palettenindizes, und die tatsächlichen Farben liegen in einem separaten Palettenarray. Wird die Palette beim Extrahieren nicht angewendet, kommt das Bild in sinnlosen Farben heraus.
/ICCBased – Eingebettetes Farbprofil. Für korrekte Farben muss auch das Profil übertragen werden.
Deshalb können beim Rohextrahieren die Farben mancher Bilder "falsch" aussehen. Das ist kein Fehler, sondern die Folge davon, dass die Farbauslegungsinformation außerhalb der Bilddatei liegt.
Transparenz: der SMask-Mechanismus
In PDF ist die Transparenz eines Bildes nicht im Bild selbst eingebettet. Sie wird in einem separaten Objekt, der weichen Maske (Soft Mask), gespeichert:
/SMask 15 0 R
Objekt Nummer 15 ist ein Graustufenbild in denselben Maßen wie das Hauptbild. Der Wert jedes Pixels gibt die Deckkraft an dieser Stelle an: 0 bedeutet vollständig transparent, 255 vollständig deckend.
Beim Rohextrahieren werden diese beiden Objekte einzeln gefunden und als getrennte Dateien ausgegeben. Das Ergebnis:
- Das Hauptbild kommt ohne Transparenzinformation, also deckend, heraus. Ein im PDF transparenter Hintergrund kann nun schwarz oder weiß erscheinen.
- Die Maskendatei wirkt für sich genommen wie eine schwarzweiße Silhouette. Sie ist keine beschädigte Datei; sie ist die Maske selbst.
Um die Transparenz zurückzugewinnen, müssen Sie beide in einem Bildeditor zusammenführen: das Hauptbild öffnen, die Maske als Alphakanal anwenden und als PNG speichern.
Es gibt außerdem den Schlüssel /Mask – dieser wird für binäre (1-Bit-)Schablonenmasken oder Farbschlüsselmaskierung verwendet und funktioniert anders als SMask, erzeugt aber ein ähnliches Trennungsproblem.
Warum Bilder zerlegt werden
Ein beim Rohextrahieren häufiger Fall: Auf der Seite liegt ein Foto, doch es kommen zehn einzelne Streifendateien heraus.
Der Grund ist die Speicherverwaltung des PDF-Erzeugers. Statt ein sehr großes Bild in einem Stück zu verarbeiten, liest er es in waagerechten Streifen und schreibt es so in die Datei. Jeder Streifen wird zu einem eigenen Image XObject.
Auf der Seite erscheinen sie zusammenhängend, weil der Inhaltsstrom jeden Streifen exakt aneinandergrenzend platziert:
q 612 80 0 0 0 712 cm /Im1 Do Q
q 612 80 0 0 0 632 cm /Im2 Do Q
q 612 80 0 0 0 552 cm /Im3 Do Q
Dieses Verhalten zeigt sich besonders bei Scannersoftware und in den PDF-Ausgaben mancher Büroprogramme.
Zum Zusammenfügen müssen Sie die Teile in einem Editor aneinandersetzen. Die Reihenfolge lässt sich aus den Nummern in den Dateinamen erraten, ist aber nicht garantiert; ein optischer Abgleich ist zuverlässiger.
Der Begriff der effektiven Auflösung
In PDF ist die "Auflösung" eines Bildes keine feste Eigenschaft. Sie berechnet sich aus dem Verhältnis zweier Werte:
Effektive DPI = Pixelbreite / physische Breite auf der Seite (in Zoll)
Wird ein Bild mit 2400 Pixeln auf der Seite in 8 Zoll Breite gezeichnet, sind das 300 DPI. Passt dasselbe Bild in 4 Zoll, sind es 600 DPI.
Das erklärt, warum das Rohextrahieren mitunter überraschend hochwertige Bilder liefert: Ein Foto, das auf der Seite klein erscheint, kann im Original sehr hoch aufgelöst sein. Beim Erzeugen des PDFs wurde das Bild nicht verkleinert, sondern nur auf einer kleinen Fläche platziert.
Auch das Gegenteil trifft zu: Hat das PDF eine Komprimierung durchlaufen, können die Bilder tatsächlich auf eine niedrige Auflösung reduziert worden sein, und das Rohextrahieren liefert genau diese niedrige Auflösung. Verlorene Pixel kehren nicht zurück.
Unsichtbare Bilder
Das Rohextrahieren liefert mitunter auch Bilder, die Sie auf der Seite nie gesehen haben. Die Gründe:
- Bereiche außerhalb des Beschneidungspfades. Von einem Bild wird womöglich nur ein Ausschnitt gezeigt; das Objekt trägt das Ganze.
- Überdeckte Bilder. Ein später gezeichnetes Element kann das darunterliegende verborgen haben.
- Außerhalb der Seite platzierte Elemente. Inhalt außerhalb der MediaBox bleibt in der Datei.
- Ungenutzte Objekte. Nach einer Bearbeitung können Bilder in der Datei verbleiben, auf die keine Seite mehr verweist.
Der letzte Punkt ist für den Datenschutz wichtig: Um ein Bild aus einem PDF zu "löschen", genügt es nicht, etwas darüberzulegen; das Objekt bleibt in der Datei, und das Rohextrahieren findet es.
Warum sich Vektorgrafiken nicht extrahieren lassen
Das Rohextrahieren findet ausschließlich Image-XObject-Objekte. Logos, Schaubilder und Diagramme in PDFs sind meist vektorbasiert – sie sind durch Zeichenbefehle im Inhaltsstrom der Seite definiert und kein eigenständiges Objekt.
Um ein Vektorlogo zu "extrahieren", braucht es einen anderen Ansatz: die Seite nach SVG umwandeln und das Logo dort herauslösen.
Ein einfacher Test zur Unterscheidung: Zoomen Sie im PDF stark auf das Element. Wird es pixelig, ist es ein Rasterbild (extrahierbar); bleibt es scharf, ist es ein Vektor (nicht extrahierbar).
Zusammengefasst
In PDF ist jedes Bild ein Image-XObject-Objekt mit eigenem Wörterbuch und eigenem Datenstrom; die Angaben zu Position und Skalierung stehen dagegen im Inhaltsstrom der Seite. Diese Trennung ist der Grund dafür, dass das Rohextrahieren das Originalbild liefert und nicht dessen Zustand auf der Seite. Die Daten liegen je nach Filter als echtes JPEG (DCTDecode) oder als rohe Pixel (FlateDecode) vor – davon hängt das Ausgabeformat ab. Weil die Transparenz in einem separaten SMask-Objekt liegt, geht sie beim Extrahieren verloren, und es entstehen zwei Dateien. Weil manche Erzeuger große Bilder in Streifen zerlegen, kann ein einzelnes Foto als viele Dateien herauskommen. Und Vektorgrafiken stehen außerhalb dieses Mechanismus; für sie ist eine SVG-Umwandlung nötig.
Häufig gestellte Fragen
Liegt ein JPEG in einem PDF wirklich als JPEG vor?
Ja, mit dem Filter DCTDecode kodierte Bilder sind echte JPEG-Daten und lassen sich nach dem Extrahieren unmittelbar als .jpg verwenden. Das ist eine kluge Entwurfsentscheidung von PDF: Statt ein JPEG zu dekodieren und neu zu komprimieren, speichert es das Bild unverändert, sodass die Datei klein bleibt und kein zusätzlicher Qualitätsverlust entsteht. Mit FlateDecode gespeicherte Bilder sind dagegen rohe Pixeldaten und müssen beim Extrahieren in ein Format wie PNG verpackt werden.
Wie bestimmt sich die Auflösung eines Bildes im PDF?
Sie ergibt sich aus dem Verhältnis zwischen den Pixelmaßen des Bildobjekts (Width/Height) und der Fläche, die es auf der Seite einnimmt. Wird ein 2400 Pixel breites Bild auf der Seite in einer Breite von 8 Zoll gezeichnet, beträgt die effektive Auflösung 300 DPI. Passt dasselbe Bild in 4 Zoll, sind es 600 DPI. Die 'Auflösung' eines Bildes ist im PDF also keine feste Eigenschaft, sondern ein von der Platzierungsskalierung abhängiges Ergebnis.
Warum sind manche Bilder in waagerechte Streifen zerlegt?
Meist aus Gründen der Speichereffizienz. Scannersoftware und manche PDF-Erzeuger verarbeiten sehr große Bilder streifenweise, statt sie vollständig in den Speicher zu laden, und schreiben sie auch so in die Datei. Auf der Seite erscheinen sie zusammenhängend, weil die Streifen exakt aneinandergrenzend platziert werden. Das Rohextrahieren findet jeden Streifen als eigenes Objekt und liefert ihn als eigene Datei.
Was ist eine SMask und warum kommt sie als eigene Datei heraus?
Eine SMask (Soft Mask) ist ein separates Graustufenbild, das die Transparenzinformation eines Bildes trägt. Es gibt mit einem Wert zwischen 0 und 255 an, wie transparent jedes Pixel ist. Weil die Transparenz in PDF nicht im Bild selbst, sondern in diesem separaten Objekt gespeichert wird, liefert das Rohextrahieren beide als getrennte Dateien, und die Transparenz geht verloren. Um sie zurückzugewinnen, müssen beide in einem Bildeditor zusammengeführt werden.
Probieren Sie es gleich mit PDF'ten Görsel Çıkar (Ham) aus.
PDF'ten Görsel Çıkar (Ham) ausprobieren