Créer un PDF plus grand que l’Allemagne
(alexwlchan.net)- L’affirmation répandue sur Internet selon laquelle « la taille maximale d’un PDF est de 381 km × 381 km » ne vient pas d’une limite du format PDF lui-même, mais d’une limite d’implémentation d’Adobe Acrobat 7.0
- Depuis PDF 1.6,
/UserUnitpermet d’agrandir l’unité de base, qui est de 1/72 de pouce, et la valeur maximale75,000d’Acrobat 7.0 crée une limite supérieure de15,000,000 pouces - Un PDF fabriqué à la main se compose de
%PDF-1.6, d’une liste d’objets, dexref,trailer,startxrefet%%EOF, et la taille de page est déterminée par la combinaison de/MediaBoxet/UserUnit - Acrobat affiche 15,000,000 pouces même si
/MediaBoxdépasse 14 400 ou/UserUnitdépasse 75 000, et ignore les dépassements de/UserUnitsans avertissement - macOS Preview.app ignore
/UserUnit, mais n’impose pas à/MediaBoxla même limite supérieure qu’Acrobat ; on peut donc créer des fichiers affichés comme des PDF plus grands que l’univers
D’où vient la limite de 381 km ?
- L’affirmation selon laquelle la taille maximale d’un document PDF serait de 381 km × 381 km circule depuis longtemps sur Internet
- Ce nombre ne correspond pas à une limite du format PDF, mais à une limite d’implémentation d’Adobe Acrobat
- Selon la spécification PDF 1.7, les limites de taille de page se résument ainsi
- Avant PDF 1.6, l’unité de base de l’espace utilisateur était fixée à 1/72 de pouce
- Depuis Acrobat 5.0, la taille de page maximale par défaut est de
14,400 × 14,400unités, soit 200 × 200 pouces - Depuis PDF 1.6,
/UserUnitdans le dictionnaire de page permet de définir la taille de l’unité de base de l’espace utilisateur - Acrobat 7.0 prend en charge une valeur maximale de
/UserUnitde75,000, ce qui permet d’obtenir une dimension de page maximale de 15,000,000 pouces
15,000,000 poucescorrespondent à environ 381 km, et l’expression « PDF version 7 » semble venir non pas d’une version de PDF, mais d’Adobe Acrobat 7.0
Structure de base d’un PDF écrit à la main
- Un fichier PDF comporte un numéro de version au début et un marqueur EOF à la fin
- Exemple :
%PDF-1.6 - Marqueur de fin :
%%EOF
- Exemple :
- Après le numéro de version vient une liste d’objets représentant les pages, le texte, les graphiques, etc.
xrefest la table de références croisées qui indique l’emplacement des objets- Le lecteur PDF vérifie à combien d’octets chaque objet se trouve depuis le début du fichier
trailercontient les métadonnées du document entier- Nombre de pages
- Présence ou non d’un chiffrement
- Objet racine du document
startxrefindique la position de début de la tablexref- Le lecteur PDF cherche la valeur
startxrefà la fin du fichier, puis se rend à la tablexref
- Le lecteur PDF cherche la valeur
- En suivant un article expliquant comment créer un fichier PDF simple, on peut fabriquer à la main un PDF contenant un rectangle rouge
Définition des objets et des pages
- Le PDF d’exemple se compose de quatre objets essentiels
- Objet 1 : un objet stream qui dessine un rectangle rouge
- Objet 2 : un objet
Pagequi définit une page unique - Objet 3 : un objet
Pagesqui contient les informations de plusieurs pages - Objet 4 : un objet
Catalogqui fournit la structure principale du document
- L’objet
Pagerelie le contenu de la page via des références à d’autres objets1 0 Rfait référence à l’objet numéro 1, génération 03 0 Rfait référence à l’objetPages, qui est l’ensemble de pages
- Quand on écrit un PDF à la main, il faut réajuster les valeurs de la table
xrefà chaque changement de position d’un objet, ce qui est très fastidieux - Dans une mise à jour du 16 avril 2025,
xref 0 4dans le code d’exemple a été corrigé comme valeur erronée- Comme la table de références croisées contient en réalité 5 entrées, la bonne valeur est
xref 0 5
- Comme la table de références croisées contient en réalité 5 entrées, la bonne valeur est
Agrandir une page avec /MediaBox et /UserUnit
- La taille de page d’un PDF est définie dans chaque objet
Page /MediaBox [0 0 300 300]crée une page dont la largeur et la hauteur sont chacune de 300 unités- L’unité par défaut est 1/72 de pouce
- 300 unités correspondent à environ 4,17 pouces
- Si l’on remplace
/MediaBoxpar600 600, Acrobat affiche la page comme8.33 x 8.33 in - La valeur maximale de
/MediaBoxacceptée par Acrobat,14400 14400, est affichée comme 200 × 200 pouces- Au-delà de cette valeur, Acrobat émet un avertissement
- Ajouter
/UserUnitpermet d’agrandir l’unité de base de l’espace utilisateur/UserUnit 2double les dimensions de la page dans les deux directions- Avec
/MediaBox [0 0 14400 14400]et/UserUnit 2, Acrobat affiche400.00 x 400.00 in
- En appliquant
/UserUnit 75000, Acrobat affiche la page comme 15,000,000.00 × 15,000,000.00 pouces- Cela correspond à environ 381 km × 381 km, ce qui concorde avec l’affirmation initiale
- Fichier d’exemple : biggest.pdf
Différences de traitement entre Acrobat et Preview
- Acrobat continue d’afficher une taille de page de 15,000,000 pouces même si
/MediaBoxou/UserUnitest défini à une valeur plus élevée - Si
/UserUnitest défini à une valeur supérieure à75000, la valeur est plafonnée sans avertissement ni erreur /UserUnitne semble pas avoir beaucoup de cas d’usage réels- Une réponse Stack Overflow indique aussi que cette valeur n’est pas largement utilisée
- Il a été difficile de trouver des exemples en ligne
- macOS Preview.app ne prend pas en charge
/UserUnit- Il traite tous les PDF avec l’unité par défaut de 1/72 de pouce
- En revanche, contrairement à Acrobat, Preview.app n’impose pas de grande limite supérieure à
/MediaBox- Il accepte même une largeur composée d’un
1suivi de 12 zéros - Cette largeur est approximativement de l’ordre de la distance entre la Terre et la Lune
- Il accepte même une largeur composée d’un
- En utilisant une valeur de
/MediaBoxencore plus grande, on peut même créer un fichier que Preview affiche comme un PDF d’environ 37 billions d’années-lumière carrées- Fichier d’exemple : universe.pdf
- La majeure partie du document est vide, avec un avertissement indiquant de ne pas l’imprimer
1 commentaires
Avis Hacker News
PDF est techniquement affreux à bien des égards, mais le fait qu’il s’agisse d’un fichier statique autonome que l’on peut garder entre ses mains est excellent, surtout par contraste avec les sites web dynamiques/SaaS hostiles à l’utilisateur, qui peuvent disparaître à tout moment
PDF/A est plus proche du vrai PDF et élimine la plupart des cochonneries dangereuses
Si vous aimez les bizarreries PDF, il existe un fichier polyglotte qui est à la fois PDF/A, CSV et bande-son Amiga soundtracker mod : https://www.lab6.com/6
https://www.nytimes.com/2009/07/18/technology/companies/18am...
Beaucoup de gens s’inquiètent de l’exécution de JavaScript, mais utilisent des fichiers PDF sans trop se poser de questions
Pour convertir un PDF arbitraire en PDF/A avec du logiciel open source, la seule méthode semble être de passer par PostScript avec Ghostscript puis de revenir, mais Ghostscript est sous licence Affero, ce qui peut entraîner divers problèmes
Il existe aussi d’anciennes versions GPL, qui fonctionnent avec la plupart des PDF, mais elles datent d’environ 15 ans
Dans un ancien travail, j’ai dû m’occuper de PDF/A, et ce n’était pas du tout agréable
Rien que reconstruire les paragraphes demandait beaucoup d’efforts, sans même parler du parsing des tableaux
Pour un format de facto standard, il devrait être meilleur, et le manuel PDF est vraiment mauvais
À titre de comparaison, si l’on analyse PNG, la largeur et la hauteur maximales sont de 2147483647, soit 2^31 - 1
La densité minimale que l’on peut indiquer avec un chunk pHYs est de 1 pixel par mètre ; 2 milliards de mètres, c’est donc plus grand que le diamètre du Soleil, 1,39 gigamètre : https://en.wikipedia.org/wiki/Orders_of_magnitude_(length)#g...
Le chunk sCAL utilisant des nombres à virgule flottante en ASCII, il permet de représenter des dimensions physiques bien plus grandes
Une carte du monde à l’échelle 1:10 000 000 ferait moins de 10 m de large selon pHYs, mais environ 40 000 km selon sCAL
Dès qu’on mesure la largeur d’un PDF en kilomètres, on sait qu’on est en train de lire un bon article technique
Cela me rappelle un PDF que j’avais créé il y a plus de dix ans avec une implémentation PostScript du Game of Life
Il semble toujours fonctionner, mais il fait planter macOS Preview : https://andrewcutler.net/docs/joke/life.pdf
En revanche, on ne voit pas l’animation, seulement l’état final ; le lecteur PDF de Firefox affiche un peu d’animation
Skim se comporte à peu près comme Preview, mais n’affiche pas la grille
Cet article me fait penser aux jeux intellectuels d’Umberto Eco
En particulier à « On the Impossibility of Drawing a Map of the Empire on a Scale of 1 to 1 » : https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://en.wikipedia.org/wiki/On_Exactitude_in_Science
Preview n’a pas, contrairement à Acrobat, de limite supérieure pour les valeurs que l’on peut mettre dans MediaBox, et accepte même une largeur de 1 suivi de 12 zéros
L’inspecteur de document affiche une taille de page de 352777777777,78 x 10,59 cm, et cette largeur correspond à peu près à la distance entre la Terre et la Lune
Même en alignant toutes les planètes du Système solaire, elles tiendraient largement dans ce document
Finalement, il fallait bien une règle
352777777777,78 cm, cela fait 3 527 777,7777778 km
Expérience amusante, alexwlchan
Il y a deux petites erreurs dans l’article : les passages où il est écrit « 15,000,000,000.00 in » et « la taille de page est de 15 milliards de pouces » devraient en fait dire 15 millions de pouces
Tu dis que la mise en forme du texte est difficile, mais pour l’exemple de PDF qui ne contient que les deux mots « Hello World », il suffit de définir un objet de police, puis d’utiliser la police avec
Tfdans le flux, de positionner avecTdet d’écrire le texte avecTjMerci aussi pour l’exemple de texte ; il ressemble à ce que j’essayais de faire, mais j’avais forcément fait une erreur quelque part
D’après la spécification, on dirait que oui
À ce stade, j’ai envie de paraphraser Steven Wright
« J’ai une carte des États-Unis. Elle est grandeur nature »
Je ne sais pas si le haut de la carte correspond à la direction dans laquelle je me déplace ou au nord ; les anciennes cartes avaient toujours le nord en haut, mais Google Maps ne semble pas fonctionner ainsi, ce qui prête à confusion
Quand je tourne de 90 degrés, la carte tourne aussi, et je ne sais plus si c’est la carte ou moi qui ai tourné
Si je suis à l’arrêt, la carte ne peut pas savoir où je vais ; il semble donc qu’il faille d’abord bouger pour connaître la direction
Quand je tiens le smartphone devant mes yeux, le haut de la carte pointe vers le ciel, et je ne sais pas non plus si je suis censé regarder la carte d’en haut
J’aimerais bien savoir comment utiliser correctement Google Maps sur un téléphone
https://s3.amazonaws.com/arena-attachments/881694/cb6119367b...
https://scomedy.com/quotes/10779
« Ne l’imprimez pas » sonne comme une phrase prête à devenir une bombe d’impression
La dernière fois que j’ai utilisé une imprimante, il était quasiment impossible d’annuler une tâche d’impression sous Windows
L’époque où les imprimantes Wi-Fi étaient ouvertes ou mal sécurisées était amusante
La seule méthode fiable que j’ai trouvée consiste à éteindre l’imprimante puis à supprimer la tâche de la file d’attente
Il faut que l’imprimante soit juste à côté, et je ne comprends pas pourquoi c’est si difficile
Il y a environ 30 ans, lors d’un entretien pour un stage d’été chez Microsoft, l’intervieweur m’a posé une question très similaire à propos d’Excel
Ce genre de sujet est toujours un bon moyen d’évaluer la curiosité de quelqu’un et sa capacité à décomposer des problèmes potentiels