web-dev-qa-db-fra.com

Quel est le plus petit PDF valide possible?

Par simple curiosité, ayant vu le plus petit GIF , quel est le plus petit fichier valide PDF PDF?

133
meshy

C'est un problème intéressant. En le 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 fait 291 octets de PDF joie. Acrobat l'ouvre, mais il se plaint quelque 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érence croisée, 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/Taille dans la bande-annonce. Nous sommes maintenant au 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 j'ai pu faire et l'avoir ouvert 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 de 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é la dernière nouvelle ligne, ce qui me laisse avec 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 n'aurait pas ça. La lecture PDF intégrée à Google Chrome (FoxIt) ne l'ouvrira pas).

En tant que PostScript (HA! Vous 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 des métadonnées facultatives, mais il laisse derrière lui un certain nombre de violations claires des spécifications.

184
plinth

Je n'ai pas pu ouvrir l'exemple du bonjour au monde.

Pour un fichier de petite taille avec un contenu 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
15
Alan Riddell

J'ai pensé que je ferais un plus petit pdf qui affiche "Hello World". Le texte est dans le coin inférieur gauche. Désolé pour la police à 9 points, une 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 retour à la ligne ni 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 fonction intégrée de Chrome PDF viewer:

%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 (donc je ne vais pas me lier à lui, 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
8
Hugh Allen