Par simple curiosité, après avoir vu le plus petit GIF , quel est le plus petit fichier PDF valide possible?
Par simple curiosité, après avoir vu le plus petit GIF , quel est le plus petit fichier PDF valide possible?
Réponses:
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.
minimum allowed by the spec
, puis va au-delà. Excellente réponse, merci! :)
\n
intégrée, et lorsque décodée en base64 ne donne pas le contenu de fichier correct.
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
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
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;
}