Par simple curiosité, après avoir vu le plus petit GIF Quel est le plus petit fichier PDF valide possible ?
Réponses
Trop de publicités?C'est un problème intéressant. En suivant les règles, 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 quelque peu. Il y a une page dans le document et elle est de 3/72" de côté, le minimum autorisé par la spécification.
Cependant, Acrobat X ne s'embarrasse même plus de la table de référence croisée, nous pouvons donc la supprimer :
%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. Maintenant, nous sommes à 178 octets. Il s'avère que tu n'as pas besoin de ce /Size dans le trailer. Maintenant on est à 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 /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>>
Maintenant, nous sommes à 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 format que j'ai pu créer pour qu'il puisse être ouvert dans Acrobat X :
%PDF-1.
trailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>
70 octets.
Maintenant, mon éditeur utilise la discipline des nouvelles lignes de Windows, mais Acrobat accepte les conventions Windows, Mac ou Unix, donc en utilisant un éditeur hexadécimal, j'ai remplacé l'élément \r\n avec \r et j'ai supprimé 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é d'enlever le dernier dictionnaire de fin (>>), mais Acrobat ne l'a pas accepté. La lecture de PDF intégrée à Google Chrome (FoxIt) ne l'ouvre pas.
En tant que PostScript (HA ! Vous voyez ce que j'ai fait là ?), si vous acceptez qu'Acrobat "répare" le fichier, il passe à 3550 octets, dont la plupart sont des métadonnées facultatives, mais il laisse derrière lui un certain nombre de violations claires des spécifications.
Je n'ai pas réussi à ouvrir l'exemple de hello world.
Pour un fichier de taille réduite contenant 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
En fonction de toutes les réponses données ici, voici le plus petit PDF avec du texte :
SMALL_PDF = (
b"%PDF-1.2 \n"
b"9 0 obj\n<<\n>>\nstream\nBT/ 32 Tf( YOUR TEXT HERE )' ET\nendstream\nendobj\n"
b"4 0 obj\n<<\n/Type /Page\n/Parent 5 0 R\n/Contents 9 0 R\n>>\nendobj\n"
b"5 0 obj\n<<\n/Kids [4 0 R ]\n/Count 1\n/Type /Pages\n/MediaBox [ 0 0 250 50 ]\n>>\nendobj\n"
b"3 0 obj\n<<\n/Pages 5 0 R\n/Type /Catalog\n>>\nendobj\n"
b"trailer\n<<\n/Root 3 0 R\n>>\n"
b"%%EOF"
)
En base64. Copiez ceci et testez dans Chrome :
données : application/pdf ; base64, JVBERi0xLjIgCjkgMCBvYmoKPDwKPj4Kc3RyZWFtCkJULyAzMiBUZiggIFlPVVIgVEVYVCBIRVJFICAgKScgRVQKZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9QYXJlbnQgNSAwIFIKL0NvbnRlbnRzIDkgMCBSCj4+CmVuZG9iago1IDAgb2JqCjw8Ci9LaWRzIFs0IDAgUiBdCi9Db3VudCAxCi9UeXBlIC9QYWdlcwovTWVkaWFCb3ggWyAwIDAgMjUwIDUwIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1BhZ2VzIDUgMCBSCi9UeXBlIC9DYXRhbG9nCj4+CmVuZG9iagp0cmFpbGVyCjw8Ci9Sb290IDMgMCBSCj4+CiUlRU9G
Pour agrandir la page, ajustez les dimensions de la MediaBox :)
/MediaBox [ 0 0 250 50 ]
J'ai pensé faire un petit pdf qui affiche "Hello World". Le texte est dans le coin inférieur gauche. Désolé pour la police de 9 points, toute police plus grande coûterait un octet supplémentaire :)
172 octets pour Adobe Reader X (s'il est enregistré avec des retours à la 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 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 le voir facilement dans Chrome, collez cette URI dans la barre d'adresse (SO ne me permet pas d'établir un lien avec elle, et elle ne fonctionne 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
J'allais donner un exemple de ce que je pensais être le PDF "universel" le plus petit et le plus valide, jusqu'à ce que je remarque que toute l'éthique de l'utilisation d'un PDF est de s'assurer qu'il aura exactement le même rendu sur tous les appareils et leurs lecteurs de PDF. Cependant, en vérifiant mon "PDF parfaitement petit et bien formé", j'ai remarqué ceci.
Donc la règle de base était "le plus petit PDF valide possible" mais je considère que cette pénurie devrait être considérée comme un PDF invalide puisqu'elle n'adhère pas au concept de "Fit for Purpose" ; ainsi, le PDF minimum doit lui-même contenir au minimum un moyen de fixer une police fonctionnelle.
Pour expliquer la solution que je propose et les raisons pour lesquelles elle n'est pas parfaite, la voici sous une forme grossière en raison du copier-coller.
%PDF-1.0
%µ¶
1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj
2 0 obj
<</Kids[3 0 R]/Count 1/Type/Pages/MediaBox[0 0 595 792]>>
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Contents 4 0 R/Resources<<>>>>
endobj
4 0 obj
<</Length 58>>
stream
q
BT
/ 96 Tf
1 0 0 1 36 684 Tm
(Hello World!) Tj
ET
Q
endstream
endobj
xref
0 5
0000000000 65536 f
0000000016 00000 n
0000000062 00000 n
0000000136 00000 n
0000000209 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
316
%%EOF
Bien qu'il ne soit pas défini par les règles de l question J'ai inclus quelques expériences passées de problèmes d'utilisateurs.
La première différence que vous pouvez noter est que la boîte de médias dans la deuxième obj est un hybride. MediaBox[0 0 595 792]
qui est une largeur minimale A4 et une hauteur minimale US Letter, car sinon la "page universelle" dans la plupart des pays forcerait l'impression d'une deuxième feuille à l'échelle de 100%, soit parce que la définition de la page est trop large, soit parce qu'elle est trop haute pour les paramètres locaux par défaut.
Et le problème actuel est mis en évidence dans le 3e objectif, car aucune police n'a été définie pour les ressources, donc dans l'objectif de minimal le PDF, je concours sans une police définie, sera Invalide.
Ainsi, aucune des réponses données jusqu'à présent, y compris la mienne, ne semble produire un PDF qui sera "WORK"
comme un moyen "VALIDE" de produire la même impression, quelle que soit la plate-forme ou le visualiseur.
En me tournant vers les bibliothèques, j'ai trouvé un zip de 3MB avec un Windows.exe exceptionnellement polyvalent (un seul fichier qui peut faire la plupart des fonctions pdf comme diviser, fusionner, importer, tamponner, exporter des pièces jointes, etc.) qui peut prendre "Hello World ! dans une ligne de commande et produire un bon fichier de travail, voici la page centrale agrandie
il utilise un flux pour le texte et son positionnement, et a d'autres données conformes comme le producteur, donc je propose ceci comme un minimum potentiellement bon à réduire
%PDF-1.7
%µ¶
1 0 obj
<</Pages 2 0 R/Type/Catalog>>
endobj
2 0 obj
<</Count 1/Kids[5 0 R]/MediaBox[0 0 595 792]/Type/Pages>>
endobj
3 0 obj
<</BaseFont/Helvetica/Encoding/WinAnsiEncoding/Subtype/Type1/Type/Font>>
endobj
4 0 obj
<</Filter/FlateDecode/Length 101>>
stream
xœ*Tp
QÐw3P04Ò30PISp
Q01
à˜kdf¢ga¬`bhâ%ç‚ô(„”#©Aîè"EéÚlA
HW‘‚†GjNN¾Bx~QNŠ¢¦BHÈÞ@@ ÿÿFå
endstream
endobj
5 0 obj
<</Contents 4 0 R/CropBox[0 0 595 792]/MediaBox[0 0 595 792]/Parent 2 0 R/Resources<</Font<</F0 3 0 R>>>>/Type/Page>>
endobj
6 0 obj
<</CreationDate(D:20220600600709+01'00')/ModDate(D:20220600600709+01'00')/Producer(me 2)>>
endobj
xref
0 7
0000000000 65536 f
0000000016 00000 n
0000000062 00000 n
0000000136 00000 n
0000000225 00000 n
0000000395 00000 n
0000000529 00000 n
trailer
<</Size 7/Info 6 0 R/Root 1 0 R/ID[<A2A0CE5CCD9D0DABD5845AD574BF0A5C><09BF9D281BE12CB5B5933BB2B62B0D4D>]>>
startxref
636
%%EOF
P.S. J'ai délibérément ajouté un élément non valide, ce n'est donc pas la réponse minimale, voyez si vous pouvez trouver ce qui est clairement faux :-)
@mkl êtes-vous prêt à produire votre meilleur coup ?
- Réponses précédentes
- Plus de réponses