3 Punkte von GN⁺ 2024-02-01 | 1 Kommentare | Auf WhatsApp teilen
  • Die im Internet verbreitete Angabe „maximale PDF-Größe 381 km × 381 km“ stammt nicht von einer Grenze des PDF-Formats selbst, sondern von einer Implementierungsbeschränkung in Adobe Acrobat 7.0
  • Seit PDF 1.6 lässt sich mit /UserUnit die Basiseinheit von 1/72 Zoll vergrößern, und der Maximalwert 75.000 in Acrobat 7.0 erzeugt eine Obergrenze von 15.000.000 Zoll
  • Ein von Hand erstelltes PDF besteht aus %PDF-1.6, einer Objektliste, xref, trailer, startxref und %%EOF; die Seitengröße wird durch die Kombination aus /MediaBox und /UserUnit bestimmt
  • Acrobat zeigt auch dann 15.000.000 Zoll an, wenn /MediaBox 14.400 oder /UserUnit 75.000 überschreitet; Werte über /UserUnit hinaus werden ohne Warnung ignoriert
  • macOS Preview.app ignoriert /UserUnit, setzt aber im Gegensatz zu Acrobat keine vergleichbare Obergrenze für /MediaBox, sodass sich sogar Dateien erzeugen lassen, die wie ein PDF größer als das Universum erscheinen

Woher kommt die Grenze von 381 km?

  • Die Behauptung, ein PDF-Dokument könne maximal 381 km × 381 km groß sein, kursiert seit Langem immer wieder im Internet
  • Diese Zahl ist keine Grenze des PDF-Formats, sondern geht auf eine Implementierungsbeschränkung von Adobe Acrobat zurück
  • Laut der PDF-1.7-Spezifikation lassen sich die Beschränkungen der Seitengröße so zusammenfassen
    • Vor PDF 1.6 war die Basiseinheit des User Space fest auf 1/72 Zoll gesetzt
    • Seit Acrobat 5.0 beträgt der maximale Standard-Seitenwert 14.400 × 14.400 Einheiten, also 200 × 200 Zoll
    • Ab PDF 1.6 kann die Größe der Basiseinheit des User Space über /UserUnit im Seitenverzeichnis festgelegt werden
    • Acrobat 7.0 unterstützt für /UserUnit den Maximalwert 75.000, wodurch eine maximale Seitenabmessung von 15.000.000 Zoll möglich wird
  • 15.000.000 Zoll entsprechen etwa 381 km, und die Formulierung „PDF version 7“ bezog sich offenbar nicht auf die PDF-Version, sondern auf Adobe Acrobat 7.0

Grundstruktur eines von Hand erstellten PDFs

  • Eine PDF-Datei hat am Anfang eine Versionsnummer und am Ende eine EOF-Markierung
    • Beispiel: %PDF-1.6
    • Endmarkierung: %%EOF
  • Auf die Versionsnummer folgt eine Objektliste, die Seiten, Text, Grafiken usw. beschreibt
  • xref ist eine Querverweistabelle, die die Positionen der Objekte angibt
    • Ein PDF-Reader prüft, wie viele Bytes jedes Objekt vom Dateianfang entfernt ist
  • trailer enthält Metadaten für das gesamte Dokument
    • Anzahl der Seiten
    • Ob das Dokument verschlüsselt ist
    • Das Root-Objekt des Dokuments
  • startxref zeigt auf die Startposition der xref-Tabelle
    • Ein PDF-Reader sucht am Dateiende nach dem Wert von startxref und springt dann zur xref-Tabelle
  • Mit Bezug auf den Artikel How to create a simple PDF file lässt sich ein PDF mit einem roten Rechteck von Hand erstellen

Objekte und Seitendefinition

  • Das Beispiel-PDF besteht aus vier zentralen Objekten
    • Objekt 1: ein stream-Objekt, das ein rotes Rechteck zeichnet
    • Objekt 2: ein Page-Objekt, das eine einzelne Seite definiert
    • Objekt 3: ein Pages-Objekt mit Informationen über mehrere Seiten
    • Objekt 4: ein Catalog-Objekt, das die grundlegende Struktur des Dokuments bereitstellt
  • Das Page-Objekt verknüpft den Seiteninhalt über Verweise auf andere Objekte
    • 1 0 R verweist auf Objekt Nummer 1, Generation 0
    • 3 0 R verweist auf das Pages-Objekt, also die Seitensammlung
  • Wenn man ein PDF von Hand schreibt, ist es sehr mühsam, bei jeder Änderung der Objektpositionen die Werte in der xref-Tabelle neu anzupassen
  • In einem Update vom 16. April 2025 wurde der Beispielcode korrigiert, weil xref 0 4 falsch war
    • Da die tatsächliche Querverweistabelle 5 Einträge enthält, muss es xref 0 5 heißen

Eine Seite mit /MediaBox und /UserUnit vergrößern

  • Die Seitengröße eines PDFs wird in jedem Page-Objekt festgelegt
  • /MediaBox [0 0 300 300] erzeugt eine Seite mit 300 Einheiten Breite und Höhe
    • Die Basiseinheit ist 1/72 Zoll
    • 300 Einheiten entsprechen etwa 4,17 Zoll
  • Wenn /MediaBox auf 600 600 geändert wird, zeigt Acrobat die Seite als 8.33 x 8.33 in an
  • Der in Acrobat erlaubte Maximalwert für /MediaBox von 14400 14400 wird als 200 × 200 Zoll angezeigt
    • Wird dieser Wert überschritten, erzeugt Acrobat eine Warnung
  • Mit zusätzlichem /UserUnit lässt sich die Basiseinheit des User Space vergrößern
    • /UserUnit 2 verdoppelt beide Seitenabmessungen
    • Werden /MediaBox [0 0 14400 14400] und /UserUnit 2 kombiniert, zeigt Acrobat 400.00 x 400.00 in an
  • Mit /UserUnit 75000 zeigt Acrobat die Seite als 15.000.000,00 × 15.000.000,00 Zoll an
    • Das sind etwa 381 km × 381 km und entspricht damit genau der ursprünglichen Behauptung
    • Beispieldatei: biggest.pdf

Unterschiede zwischen Acrobat und Preview

  • Acrobat zeigt weiterhin 15.000.000 Zoll an, auch wenn /MediaBox oder /UserUnit noch größer gesetzt werden
  • Wird /UserUnit größer als 75000 gesetzt, wird der Wert ohne Warnung oder Fehlermeldung begrenzt
  • /UserUnit scheint in der Praxis nicht besonders häufig verwendet zu werden
    • Eine Stack-Overflow-Antwort sagt ebenfalls, dass dieser Wert nicht weit verbreitet ist
    • Online waren kaum Beispiele dafür zu finden
  • macOS Preview.app unterstützt /UserUnit nicht
    • Alle PDFs werden mit der Standard-Basiseinheit 1/72 Zoll behandelt
  • Dafür setzt Preview.app im Gegensatz zu Acrobat keine strenge Obergrenze für /MediaBox
    • Selbst eine Breite aus einer 1 mit 12 nachfolgenden Nullen wird akzeptiert
    • Diese Breite liegt ungefähr in der Größenordnung der Entfernung zwischen Erde und Mond
  • Mit noch größeren /MediaBox-Werten lassen sich Dateien erzeugen, die Preview als PDF mit einer Fläche von etwa 37 Billionen Quadratlichtjahren anzeigt
    • Beispieldatei: universe.pdf
    • Der Großteil des Dokuments ist leerer Raum, und es enthält eine Warnung, es nicht auszudrucken

1 Kommentare

 
GN⁺ 2024-02-01
Hacker-News-Kommentare
  • PDF ist technisch in vielerlei Hinsicht schrecklich, aber die Eigenschaft als in sich geschlossene statische Datei, die ich in meiner Hand behalten kann, ist großartig im Kontrast zu nutzerfeindlichen dynamischen/SaaS-Websites, die jederzeit verschwinden können
    PDF/A kommt dem eigentlichen PDF näher und entfernt den Großteil des gefährlichen Sammelsuriums
    Wenn man seltsame PDF-Spielereien mag: Es gibt eine Polyglot-Datei, die PDF/A ist, zugleich CSV und außerdem ein Amiga-Soundtracker-MOD-Soundtrack: https://www.lab6.com/6

    • Sobald Amazon anfängt, Bücher aus Konten zurückzuholen, wird der Teil mit dem in der eigenen Hand behalten wichtig
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • PDF ist eine ausführbare Datei
      Viele machen sich Sorgen über die Ausführung von JavaScript, benutzen PDF-Dateien aber ganz ohne größere Bedenken
    • Bis vor Kurzem gab es bei PDF/A keine einfache Möglichkeit zu prüfen, ob eine Datei wirklich PDF/A ist; inzwischen gibt es veraPDF, aber das ist ziemlich komplexe Software
      Um ein beliebiges PDF mit Open-Source-Software in PDF/A umzuwandeln, scheint es nur den Weg über Ghostscript nach PostScript und dann wieder zurück zu geben, und Ghostscript steht unter der Affero-Lizenz, was verschiedene Probleme nach sich ziehen kann
      Es gibt auch alte GPL-Versionen, und die funktionieren bei den meisten PDFs, aber sie sind etwa 15 Jahre alt
      In einem früheren Job musste ich mit PDF/A arbeiten, und das hat überhaupt keinen Spaß gemacht
    • Wegen der Schmerzen aus einem Projekt, in dem ich Millionen von PDFs aus verschiedenen Quellen parsen musste, ist die Aussage „PDF ist ein großartiges Format“ nur schwer zu verzeihen
      Allein das Rekonstruieren von Absätzen war ein enormer Aufwand, von Tabellen-Parsing ganz zu schweigen
      Für etwas, das de facto Standard ist, sollte es besser sein, und das PDF-Handbuch ist ebenfalls wirklich schlecht
    • Aus Sicht von jemandem aus der Grafikbranche ist das eigentliche PDF eher PDF/X
  • Zum Vergleich kann man sich PNG ansehen: Die maximale Breite und Höhe beträgt 2147483647, also 2^31 - 1
    Die kleinste Dichte, die sich mit dem pHYs-Chunk angeben lässt, ist 1 Pixel pro Meter, also sind 2 Milliarden Meter größer als der Sonnendurchmesser von 1,39 Gigametern: https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
    Da der sCAL-Chunk ASCII-Gleitkommazahlen verwendet, lassen sich damit noch viel größere physische Größen ausdrücken

    • sCAL bezieht sich eher auf die Größe des dargestellten Objekts als auf das Bild selbst
      Eine Weltkarte im Maßstab 1:10.000.000 wäre nach pHYs weniger als 10 m breit, nach sCAL aber etwa 40.000 km
  • In dem Moment, in dem man PDF-Breiten in Kilometern misst, weiß man, dass man einen guten Technikartikel liest

    • microSD-Karten können Millionen von Meilen auf sehr kleinem Raum speichern
  • Das erinnert mich an ein PDF, das ich vor mehr als zehn Jahren mit einer PostScript-Implementierung von Game of Life erstellt habe
    Es scheint noch zu funktionieren, bringt aber macOS Preview zum Absturz: https://andrewcutler.net/docs/joke/life.pdf

    • Unter Sonoma stürzt Preview nicht ab
      Die Animation ist allerdings nicht sichtbar; angezeigt wird nur der Endzustand, und im PDF-Viewer von Firefox sieht man ein wenig Animation
      Skim ist Preview ähnlich, zeigt aber das Raster nicht an
    • Unter Monterey auf Mac OS stürzt es nicht ab und zeigt nur ein statisches Game-of-Life-Rendering
  • Dieser Artikel erinnert an das intellektuelle Spiel von Umberto Eco
    Insbesondere denke ich an „On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1“: https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...

  • Preview hat anders als Acrobat keine Obergrenze für Werte, die sich in die MediaBox einsetzen lassen, und akzeptiert sogar eine Breite mit 12 Nullen hinter der 1
    Im Dokumentinspektor wird die Seitengröße als 352777777777.78 x 10.59 cm angezeigt, und diese Breite entspricht ungefähr der Entfernung zwischen Erde und Mond
    Selbst wenn man alle Planeten des Sonnensystems nebeneinanderstellt, würden sie noch bequem in dieses Dokument passen

    • Nachgerechnet ist das Dokument nur etwa 373 km² groß und damit viel kleiner als Deutschland
      Am Ende brauchte man also doch ein Lineal
    • Da ist eine 7 zu viel
      352777777777.78 cm sind 3.527.777,7777778 km
    • Wenn man es nicht mit Leerraum, sondern mit tatsächlichem Inhalt füllen würde, fragt man sich, wie groß die Dateigröße eines solchen PDFs wäre
  • Lustiges Experiment, alexwlchan
    Im Artikel sind zwei kleine Fehler: Bei „15,000,000,000.00 in“ und „die Seitengröße beträgt 15 Milliarden Zoll“ müssten es 15 Millionen Zoll sein
    Es hieß, Textformatierung sei schwierig, aber bei einem PDF-Beispiel mit nur den zwei Wörtern „Hello World“ muss man nur ein Schriftobjekt definieren, im Stream mit Tf die Schrift verwenden, mit Td die Position festlegen und mit Tj den Text schreiben

    • Ich wusste, dass ich mich irgendwo bei den Zahlen vertun würde, und werde das bald korrigieren
      Danke auch für das Textbeispiel; es sieht ähnlich aus wie das, was ich versucht hatte, also hatte ich offenbar irgendwo einen Fehler
    • Ich frage mich, ob das xref am Ende des PDFs Pflicht ist
      Laut Spezifikation scheint es nötig zu sein
    • Kann mir jemand beim Zählen der Nullen helfen, warum „15,000,000,000.00 in“ nicht 15 Milliarden, sondern 15 Millionen ist?
    • Wenn dort „Bitte nicht drucken“ steht, woher soll man dann wissen, ob man es mehr als siebenmal falten kann?
  • An diesem Punkt möchte man Steven Wright frei nacherzählen
    „Ich habe eine Karte der USA. In Originalgröße.“

    • Ich habe eine Karte der USA auf meinem Handy, aber die Navigation ist etwas verwirrend.
      Ich weiß nicht, ob die Oberseite der Karte die Richtung ist, in die ich mich bewege, oder Norden; früher war bei Karten immer Norden oben, aber bei Google Maps scheint das nicht so zu sein, was mich verwirrt.
      Wenn ich mich um 90 Grad drehe, dreht sich die Karte mit, und ich bin nicht sicher, ob sich die Karte gedreht hat oder ich.
      Wenn ich stillstehe, kann die Karte offenbar nicht wissen, wohin ich unterwegs bin, also scheint man sich erst bewegen zu müssen, um eine Richtung angezeigt zu bekommen.
      Wenn ich das Smartphone vor meine Augen halte, zeigt die Oberseite der Karte zum Himmel, daher weiß ich nicht, ob man auf die Karte von oben herabschauen soll.
      Ich würde gern wissen, wie man Google Maps auf dem Handy richtig benutzt.
    • Umberto Eco hat zum selben Thema ebenfalls „On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1“ geschrieben.
      https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
    • Unter den passenden Witzen mochte ich immer diesen: „Ich möchte meinen ganzen Körper mit einem Tattoo von mir selbst bedecken. Nur 2 Zoll größer.“
      https://scomedy.com/quotes/10779
  • „Nicht drucken“ klingt wie eine Formulierung, die nur darauf wartet, zu einer Drucker-Bombe zu werden.
    Als ich zuletzt einen Drucker benutzt habe, war es unter Windows fast unmöglich, einen Druckauftrag abzubrechen.
    Die Zeiten, als Wi‑Fi-Drucker offen oder schlecht abgesichert waren, waren unterhaltsam.

    • Unter Windows ist es immer noch unmöglich, einen Druckauftrag abzubrechen.
      Die einzige halbwegs verlässliche Methode, die ich gefunden habe, ist, den Drucker auszuschalten und den Druckauftrag aus der Warteschlange zu löschen.
      Wenn der Drucker nicht direkt neben einem steht, geht das nicht, und ich verstehe nicht, warum das so schwierig ist.
    • Eine etwas zuverlässigere Methode ist, den Stecker des Druckers zu ziehen und den Computer aus dem Fenster zu werfen.
    • Meine erste Reaktion beim Lesen von „Nicht drucken“ war: „Du bist nicht meine Mutter.“
  • Vor etwa 30 Jahren hat ein Interviewer in einem Bewerbungsgespräch für ein Microsoft-Sommerpraktikum eine sehr ähnliche Frage zu Excel gestellt.
    Solche Themen eignen sich immer gut, um die Neugier einer Person und ihre Fähigkeit zu sehen, potenzielle Probleme in Teilprobleme zu zerlegen.