Wie das kleinstmögliche GIF muss auch das kleinstmögliche PDF mit leeren Seiten von Hand ausgearbeitet werden, da es so klein ist, dass unnötige, aber harmlose Metadaten einen erheblichen Anteil an der Dateigröße haben und die Komprimierung die Sache tatsächlich vergrößert . Es erfordert auch sorgfältige Beachtung der Regeln in der PDF-Spezifikation darüber, welche Bits der Dateistruktur erforderlich sind und welche nicht. (Wissen Sie , dass Seitenobjekte einen enthalten muss /Resources
Wörterbuch, auch wenn es leer ist, sind aber nicht eine enthalten erforderlich /Contents
Strom?)
Wenn Sie keine PDF 1.5-Objekt- und Querverweis-Streams verwenden (was den Vorteil hat, dass die Datei vollständig in ASCII-Format gedruckt werden kann), sind 317 Byte das Beste, was Sie tun können. Wenn das Kopieren und Einfügen, zur Kenntnis nehmen , dass es einen hinteren Raum auf allen vier der Querverweistabelleneinträge werden muss (die Linien zwischen 0 4
und trailer<<...
), und dass es nicht eine endgültige Newline nach dem sein soll %%EOF
.
%PDF-1.4
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
xref
0 4
0000000000 65535 f
0000000009 00000 n
0000000052 00000 n
0000000101 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
178
%%EOF
Durch Ersetzen der Querverweistabelle durch einen manuell erstellten Querverweisdatenstrom der Version 1.5 wird die Datei geringfügig kleiner, da sie nicht mehr druckbar ist (ASCII: 294 Byte). (Der Lesbarkeit halber, ganz zu schweigen von der Möglichkeit, es überhaupt einzugeben, wurde der folgende XRef-Stream hexadezimal ausgegeben, dies wird jedoch nicht im Stream-Wörterbuch wiedergegeben. Um eine gültige PDF-Datei wiederherzustellen, müssen Sie entweder den Hexadezimalauszug durch den folgenden ersetzen entsprechende unformatierte binäre Bytes oder ändern /Length 15
zu /Length 30/Filter/ASCIIHexDecode
und übernehmen eine Datei , die 328 Bytes lang ist.)
%PDF-1.5
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
4 0 obj<</Type/XRef/Size 5/W[1 1 1]/Root 1 0 R/Length 15>>stream
0000ff01090001340001650001b200endstream endobj
startxref
178
%%EOF
Ich habe auch versucht, die Objekte 1 bis 3 in einen Objekt-Stream zu packen, aber dies fügt mehr Overhead hinzu, als es spart, selbst wenn der Stream komprimiert ist.
Eine mögliche alternative Formulierung des XRef-Stroms ist
4 0 obj<</Type/XRef/Size 4/W[0 1 0]/Index[1 4]/Root 1 0 R/Length 4>>stream
091365b2endstream endobj
Trotz der erheblichen Einsparungen bei der Länge der eigentlichen Stream-Daten /Index[1 4]
verschlingt der zusätzliche Strom bis auf ein Byte alle Einsparungen. Außerdem ist mir unklar, ob Sie das Objekt 0 vollständig aus der Datei entfernen dürfen. (Mir ist auch unklar, ob Objekt 0 die Generationsnummer -1 haben muss. Wenn das nicht erforderlich ist, sparen Sie tatsächlich mehr Bytes mit
4 0 obj<</Type/XRef/Size 5/W[1 1 0]/Root 1 0 R/Length 10>>stream
000001090134016501b2endstream endobj
.)
Um das Papierformat zu ändern, ersetzen Sie es 612 792
durch die entsprechende Breite und Höhe, ausgedrückt in PostScript-Punkten (72 PostScript-Punkte = 1 US-Zoll oder 25,4 Millimeter). Zum Beispiel 595 842
für A4. Sie können dies in ein Shell-Skript einbetten, das eine leere PDF-Datei in der gewünschten Papiergröße ausgibt. Der einzige schwierige Teil wäre, sicherzustellen, dass der startxref
Versatz auch dann genau bleibt, wenn sich die Größe von Objekt 3 ändert.