3 points par GN⁺ 2024-02-01 | 1 commentaires | Partager sur WhatsApp
  • 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, /UserUnit permet d’agrandir l’unité de base, qui est de 1/72 de pouce, et la valeur maximale 75,000 d’Acrobat 7.0 crée une limite supérieure de 15,000,000 pouces
  • Un PDF fabriqué à la main se compose de %PDF-1.6, d’une liste d’objets, de xref, trailer, startxref et %%EOF, et la taille de page est déterminée par la combinaison de /MediaBox et /UserUnit
  • Acrobat affiche 15,000,000 pouces même si /MediaBox dépasse 14 400 ou /UserUnit dépasse 75 000, et ignore les dépassements de /UserUnit sans avertissement
  • macOS Preview.app ignore /UserUnit, mais n’impose pas à /MediaBox la 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,400 unités, soit 200 × 200 pouces
    • Depuis PDF 1.6, /UserUnit dans 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 /UserUnit de 75,000, ce qui permet d’obtenir une dimension de page maximale de 15,000,000 pouces
  • 15,000,000 pouces correspondent à 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
  • Après le numéro de version vient une liste d’objets représentant les pages, le texte, les graphiques, etc.
  • xref est 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
  • trailer contient les métadonnées du document entier
    • Nombre de pages
    • Présence ou non d’un chiffrement
    • Objet racine du document
  • startxref indique la position de début de la table xref
    • Le lecteur PDF cherche la valeur startxref à la fin du fichier, puis se rend à la table xref
  • 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 Page qui définit une page unique
    • Objet 3 : un objet Pages qui contient les informations de plusieurs pages
    • Objet 4 : un objet Catalog qui fournit la structure principale du document
  • L’objet Page relie le contenu de la page via des références à d’autres objets
    • 1 0 R fait référence à l’objet numéro 1, génération 0
    • 3 0 R fait référence à l’objet Pages, 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 4 dans 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

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 /MediaBox par 600 600, Acrobat affiche la page comme 8.33 x 8.33 in
  • La valeur maximale de /MediaBox acceptée par Acrobat, 14400 14400, est affichée comme 200 × 200 pouces
    • Au-delà de cette valeur, Acrobat émet un avertissement
  • Ajouter /UserUnit permet d’agrandir l’unité de base de l’espace utilisateur
    • /UserUnit 2 double les dimensions de la page dans les deux directions
    • Avec /MediaBox [0 0 14400 14400] et /UserUnit 2, Acrobat affiche 400.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 /MediaBox ou /UserUnit est défini à une valeur plus élevée
  • Si /UserUnit est défini à une valeur supérieure à 75000, la valeur est plafonnée sans avertissement ni erreur
  • /UserUnit ne 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 1 suivi de 12 zéros
    • Cette largeur est approximativement de l’ordre de la distance entre la Terre et la Lune
  • En utilisant une valeur de /MediaBox encore 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

 
GN⁺ 2024-02-01
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

    • Si Amazon commence à reprendre des livres dans les comptes, la partie garder entre ses mains devient importante
      https://www.nytimes.com/2009/07/18/technology/companies/18am...
    • Un PDF est un fichier exécutable
      Beaucoup de gens s’inquiètent de l’exécution de JavaScript, mais utilisent des fichiers PDF sans trop se poser de questions
    • Jusqu’à récemment, il n’existait pas de moyen simple de vérifier qu’un fichier était réellement PDF/A ; il y a désormais veraPDF, mais c’est un logiciel assez complexe
      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
    • Après la douleur subie sur un projet qui consistait à parser des millions de PDF provenant de multiples sources, j’ai du mal à pardonner l’affirmation selon laquelle « PDF est un excellent format »
      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
    • Du point de vue de quelqu’un qui travaille dans l’industrie graphique, le vrai PDF, c’est PDF/X
  • À 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

    • sCAL concerne davantage la taille de l’objet représenté par l’image que celle de l’image elle-même
      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

    • Une carte microSD peut contenir des millions de miles dans un espace minuscule
  • 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

    • Sous Sonoma, Preview ne plante pas
      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
    • Sous Mac OS Monterey, il ne plante pas et affiche seulement un rendu statique du Game of Life
  • 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...

  • 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

    • En faisant le calcul, ce document fait environ 373 km², donc il est beaucoup plus petit que l’Allemagne
      Finalement, il fallait bien une règle
    • Il y a un 7 de trop
      352777777777,78 cm, cela fait 3 527 777,7777778 km
    • Si l’on remplissait ce PDF avec du vrai contenu plutôt qu’avec du vide, je me demande quelle serait sa taille de fichier
  • 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 Tf dans le flux, de positionner avec Td et d’écrire le texte avec Tj

    • Je savais que je ferais une erreur de chiffres quelque part, et je vais corriger ça bientôt
      Merci aussi pour l’exemple de texte ; il ressemble à ce que j’essayais de faire, mais j’avais forcément fait une erreur quelque part
    • Je me demande si le xref à la fin d’un PDF est obligatoire
      D’après la spécification, on dirait que oui
    • Peux-tu m’aider à compter les zéros pour comprendre pourquoi « 15,000,000,000.00 in » correspond à 15 millions et non à 15 milliards ?
    • Si on dit « ne l’imprimez pas », comment savoir si on peut le plier plus de 7 fois ?
  • À ce stade, j’ai envie de paraphraser Steven Wright
    « J’ai une carte des États-Unis. Elle est grandeur nature »

    • J’ai une carte des États-Unis sur mon téléphone, mais le guidage est un peu déroutant
      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
    • Umberto Eco a aussi écrit sur le même thème, « 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...
    • Parmi les blagues liées, j’ai toujours aimé celle-ci : « Je veux me faire tatouer moi-même sur tout le corps. Mais 5 cm plus grand »
      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

    • Sous Windows, annuler une tâche d’impression reste impossible
      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
    • Une méthode un peu plus sûre consiste à débrancher l’imprimante et à jeter l’ordinateur par la fenêtre
    • Ma première réaction en lisant « Ne l’imprimez pas » a été : « Tu n’es pas ma mère »
  • 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