Quel est le plus petit PDF valide possible?


139

Par simple curiosité, après avoir vu le plus petit GIF , quel est le plus petit fichier PDF valide possible?


Cela dépend de la façon dont vous le créez. Il y a de fortes chances que vous puissiez en écrire un plus petit (dans un éditeur) que ce que générerait une application.
devnull

Essayez d'alimenter "showpage" (sans guillemets) en ghostscript ou ps2pdf.
devnull

Réponses:


195

C'est un problème intéressant. Prenant par le livre, vous pouvez commencer par ceci:

%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

ce qui représente 291 octets de joie PDF. Acrobat l'ouvre, mais il se plaint un peu. Il y a une page dedans et c'est 3/72 "carré, le minimum autorisé par la spécification.

Cependant, Acrobat X ne se soucie même plus de la table de références croisées, nous pouvons donc supprimer cela:

%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 se plaint, mais l'ouvre. Nous sommes maintenant à 178 octets. Il s'avère que vous n'avez pas besoin de cela / Size dans la remorque. Nous sommes maintenant à 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>>

Il s'avère que vous n'avez pas besoin de tous ces éléments embêtants / Type dans vos dictionnaires:

%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>>

Nous sommes maintenant à 138 octets.

Il s'avère également que lorsque la spécification dit "doit être une référence indirecte" et que / Count est requis, et que l'en-tête "doit" être% PDF-1.0, ils font des suggestions vagues. C'est le plus petit que je pourrais le faire et le faire ouvrir dans Acrobat X:

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

70 octets.

Maintenant, mon éditeur utilise la discipline de nouvelle ligne Windows, mais Acrobat accepte les conventions Windows, Mac ou Unix, donc en utilisant un éditeur hexadécimal, j'ai remplacé le \ r \ n par \ r et supprimé complètement le dernier saut de ligne, ce qui me laisse 67 octets

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 

J'ai essayé de retirer le dernier dictionnaire de fin (>>), mais Acrobat ne l'aurait pas. La lecture PDF intégrée à Google Chrome (FoxIt) ne l'ouvrira pas.

En tant que PostScript (HA! Voyez ce que j'ai fait là-bas?), Si vous consentez à ce qu'Acrobat "répare" le fichier, il augmente jusqu'à 3550 octets, la plupart étant des métadonnées facultatives, mais il laisse derrière lui un certain nombre de violations de spécifications claires.


25
Il s'avère également que lorsque la spécification dit "doit être une référence indirecte" et que / Count est requis, et que l'en-tête "doit" être% PDF-1.0, ils font des suggestions vagues. Non, ce ne sont pas des suggestions vagues, ce sont des conditions de validité. Même si certains lecteurs de PDF ne les appliquent pas, ne pas les suivre implique une invalidité, et l'OP a demandé un PDF valide.
mkl

23
Accepté car la réponse commence par le minimum allowed by the spec, puis va au-delà. Excellente réponse, merci! :)
meshy

plith, c'est une réponse géniale. Maintenant, que diriez-vous du plus petit pdf valide avec une ligne de texte dedans, comme "Hello World". Je pensais que ce serait aussi simple que d'ajouter {stream BT ("Hello World") ET endstream} mais jusqu'à présent, cela ne pouvait pas rendre Acrobat heureux.
neonzeon

1
C'est la spécification. Le graphique des objets en PDF a des cycles.
socle

1
@towi Votre version encodée en base64 est \nintégrée, et lorsque décodée en base64 ne donne pas le contenu de fichier correct.
Christopher Schultz

19

Je n'ai pas pu ouvrir l'exemple de Hello World.

Pour un petit fichier avec du texte:

%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

2
Cela ne fonctionnera pas, vous devez définir une ressource de police et la sélectionner dans le contenu de la page pour que le texte s'affiche.
yms

2
ce fichier s'ouvre en fait sous Mac OS X El Capitan, contrairement à la réponse la plus notée avec PDF1.0.
Devy

12
Ouvre également en chrome, des données: application / pdf; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyA5IFRmKFRlc3QpJyBFVAplbmRzdHJlYW0KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA1IDAgUgovQ29udGVudHMgOSAwIFIKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0tpZHMgWzQgMCBSIF0KL0NvdW50IDEKL1R5cGUgL1BhZ2VzCi9NZWRpYUJveCBbIDAgMCA5OSA5IF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4 + CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4 + CiUlRU9G
Luc Rehmann

8

J'ai pensé faire un plus petit pdf qui affiche "Hello World". Le texte est dans le coin inférieur gauche. Désolé pour la police à 9 points, toute police plus grande coûterait un octet supplémentaire :)

172 octets pour Adobe Reader X (s'il est enregistré avec des sauts de ligne uniquement et sans saut de ligne à la fin ou octet nul):

%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 octets pour la visionneuse PDF intégrée de Chrome:

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

Pour voir facilement cela dans Chrome, collez cet URI dans la barre d'adresse (SO ne me laisse pas le lien, et cela ne fonctionnera pas du tout dans les autres navigateurs):

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

2
Assez petit. ;) Non valide, cependant, selon la spécification.
mkl

8
Ne s'ouvre pas sous Chrome pour moi.
Luke Rehmann

0

En Java, utilisez ceci:

 private static String samplepdf = "255044462D312E0D747261696C65723C3C2F526F6F743C3C2F50616765733C3C2F4B6964735B3C3C2F4D65646961426F785B302030203320335D3E3E5D3E3E3E3E3E3E";

puis

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;
}

Le PO a demandé le plus petit fichier PDF valide possible ; le vôtre n'est pas valide selon les spécifications.
mkl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.