Was ist aus einfacher Neugier die kleinstmögliche gültige PDF-Datei , nachdem Sie das kleinste GIF gesehen haben ?
Was ist aus einfacher Neugier die kleinstmögliche gültige PDF-Datei , nachdem Sie das kleinste GIF gesehen haben ?
Antworten:
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.
minimum allowed by the spec
und dann darüber hinausgeht. Tolle Antwort, danke! :)
\n
s eingebettet, und wenn base64-decodiert ist, wird nicht der richtige Dateiinhalt angezeigt.
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
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
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;
}