Was ist das kleinstmögliche gültige PDF?

139

Was ist aus einfacher Neugier die kleinstmögliche gültige PDF-Datei , nachdem Sie das kleinste GIF gesehen haben ?

meshy
quelle
Kommt darauf an, wie du es erstellst. Es besteht die Möglichkeit, dass Sie selbst (in einem Editor) eine kleinere schreiben können, als eine Anwendung generieren würde.
devnull
Versuchen Sie, "showpage" (ohne Anführungszeichen) an Ghostscript oder ps2pdf zu senden.
devnull

Antworten:

194

Dies ist ein interessantes Problem. Wenn Sie es nach dem Buch nehmen, können Sie damit beginnen:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000053 00000 n
0000000102 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
149
%EOF

Das sind 291 Bytes PDF-Freude. Acrobat öffnet es, aber es beschwert sich etwas. Es gibt eine Seite darin und es ist 3/72 "Quadrat, das Minimum, das von der Spezifikation erlaubt wird.

Acrobat X kümmert sich jedoch nicht einmal mehr um die Querverweistabelle, sodass wir Folgendes herausnehmen können:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Size 4/Root 1 0 R>>

Acrobat beschwert sich, öffnet es aber. Jetzt sind wir bei 178 Bytes. Es stellt sich heraus, dass Sie das / Größe im Trailer nicht brauchen. Jetzt sind wir bei 172:

%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

Es stellt sich heraus, dass Sie nicht alle diese lästigen / Typ-Elemente in Ihren Wörterbüchern benötigen:

%PDF-1.0
1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</MediaBox[0 0 3 3]>>endobj
trailer<</Root 1 0 R>>

Jetzt sind wir bei 138 Bytes.

Es stellt sich auch heraus, dass, wenn in der Spezifikation "soll eine indirekte Referenz sein" und / Count erforderlich ist und der Header "muss"% PDF-1.0 sein muss, sie lose Vorschläge machen. Dies ist das kleinste, das ich machen und in Acrobat X öffnen kann:

%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>

70 Bytes.

Jetzt verwendet mein Editor die Windows-Newline-Disziplin, aber Acrobat akzeptiert Windows-, Mac- oder Unix-Konventionen. Durch die Verwendung eines Hex-Editors habe ich das \ r \ n durch \ r ersetzt und die letzte Newline insgesamt entfernt, sodass ich 67 Bytes habe

25 50 44 46 2D 31 2E 0D 74 72 61 69 6C 65 72 3C 
3C 2F 52 6F 6F 74 3C 3C 2F 50 61 67 65 73 3C 3C 
2F 4B 69 64 73 5B 3C 3C 2F 4D 65 64 69 61 42 6F 
78 5B 30 20 30 20 33 20 33 5D 3E 3E 5D 3E 3E 3E 
3E 3E 3E 

Ich habe versucht, das letzte Endwörterbuch (>>) abzunehmen, aber Acrobat hätte das nicht. Das in Google Chrome (FoxIt) integrierte PDF-Lesen wird nicht geöffnet.

Wenn Sie als PostScript (HA! Sehen Sie, was ich dort getan habe?) Einwilligen, dass Acrobat die Datei "repariert", werden bis zu 3550 Bytes, die meisten davon optionale Metadaten, angezeigt, aber es bleiben eine Reihe eindeutiger Verstöße gegen die Spezifikationen zurück.

Sockel
quelle
25
Es stellt sich auch heraus, dass, wenn in der Spezifikation "soll eine indirekte Referenz sein" und / Count erforderlich ist und der Header "muss"% PDF-1.0 sein muss, sie lose Vorschläge machen. Nein, das sind keine losen Vorschläge, das sind Voraussetzungen für die Gültigkeit. Selbst wenn einige PDF-Viewer sie nicht erzwingen, bedeutet die Nichtbeachtung, dass sie ungültig sind, und das OP hat nach einem gültigen PDF gefragt.
mkl
23
Akzeptiert, weil die Antwort mit dem beginnt minimum allowed by the specund dann darüber hinausgeht. Tolle Antwort, danke! :)
meshy
Plith, das ist eine großartige Antwort. Wie wäre es nun mit dem kleinsten gültigen PDF mit einer Textzeile wie "Hallo Welt". Ich dachte, es wäre so einfach wie das Hinzufügen von {stream BT ("Hello World") ET endstream}, aber bisher konnte Acrobat nicht glücklich machen.
Neonzeon
1
Das ist die Spezifikation. Das Diagramm der Objekte in PDF hat Zyklen.
Sockel
1
@towi In Ihre base64-codierte Version ist \ns eingebettet, und wenn base64-decodiert ist, wird nicht der richtige Dateiinhalt angezeigt.
Christopher Schultz
19

Ich konnte das Hallo-Welt-Beispiel nicht öffnen.

Für eine kleine Datei mit Textinhalt:

%PDF-1.2 
9 0 obj
<<
>>
stream
BT/ 9 Tf(Test)' ET
endstream
endobj
4 0 obj
<<
/Type /Page
/Parent 5 0 R
/Contents 9 0 R
>>
endobj
5 0 obj
<<
/Kids [4 0 R ]
/Count 1
/Type /Pages
/MediaBox [ 0 0 99 9 ]
>>
endobj
3 0 obj
<<
/Pages 5 0 R
/Type /Catalog
>>
endobj
trailer
<<
/Root 3 0 R
>>
%%EOF
Alan Riddell
quelle
2
Dies funktioniert nicht. Sie müssen eine Schriftartressource definieren und sie im Seiteninhalt auswählen, damit der Text angezeigt wird.
Yms
2
Diese Datei wird tatsächlich unter Mac OS X El Capitan geöffnet, während die am besten bewertete Antwort mit PDF1.0 dies nicht tat.
Devy
12
Auch öffnet sich unter Chrom, Daten: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luke Rehmann
8

Ich dachte, ich würde ein kleinstes PDF erstellen, das "Hello World" anzeigt. Der Text befindet sich in der unteren linken Ecke. Entschuldigung für die 9-Punkt-Schrift, jede größere Schrift würde ein zusätzliches Byte kosten :)

172 Bytes für Adobe Reader X (wenn mit Zeilenvorschub-Zeilenumbrüchen und ohne nachfolgende Zeilenumbrüche oder Null-Bytes gespeichert):

%PDF-1.
1 0 obj<</Kids[<</Parent 1 0 R/Resources<<>>/Contents 2 0 R>>]>>endobj 2 0 obj<<>>stream
BT/ 9 Tf(Hello World)' ET
endstream
endobj trailer<</Root<</Pages 1 0 R>>>>

120 Bytes für den integrierten PDF-Viewer von Chrome:

%PDF 1 0 obj<</Pages<</Kids[<</Contents<<>>stream
BT 9 Tf(Hello World)' ET endstream>>]>>>>endobj trailer<</Root 1 0 R>>

Um dies in Chrome einfach zu sehen, fügen Sie diesen URI in die Adressleiste ein (SO kann ich keinen Link dazu erstellen und es funktioniert in anderen Browsern überhaupt nicht):

data:application/pdf,%25PDF%201%200%20obj%3C%3C%2FPages%3C%3C%2FKids%5B%3C%3C%2FContents%3C%3C%3E%3Estream%0ABT%209%20Tf(Hello%20World)'%20ET%20endstream%3E%3E%5D%3E%3E%3E%3Eendobj%20trailer%3C%3C%2FRoot%201%200%20R%3E%3E
Hugh Allen
quelle
2
Ziemlich klein. ;) Nicht gültig gemäß Spezifikation.
mkl
8
Wird für mich nicht in Chrome geöffnet.
Luke Rehmann
0

Verwenden Sie in Java Folgendes:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

und dann

byte[] bytes = hexStringToByteArray(samplepdf);

...

public byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i + 1), 16));
    }
    return data;
}
Martin Šimon
quelle
Das OP bat um die kleinstmögliche gültige PDF-Datei ; Ihre ist nicht gemäß der Spezifikation gültig.
mkl