{
 "_licence": "CC BY 4.0 — ODERSA · https://letabli.odersa.org",
 "_note": "LA MATRICE DE COMPATIBILITÉ (fiche §4.6, ordre Mael : « checker massivement le web »). Fichier COMMUN à toutes les langues : les libellés portent leurs traductions en objet, il n'y a donc qu'UN domicile pour chaque fait. Chaque ligne a été vérifiée à une source publique le 2026-07-30, sources listées en bas de ce fichier et publiées sur la page méthode. Une ligne sans source n'entre pas ici.",
 "verifieLe": "2026-07-30",
 "colonnes": [
  {
   "cle": "chromium",
   "label": {
    "fr": "Chrome, Edge",
    "en": "Chrome, Edge"
   }
  },
  {
   "cle": "firefox",
   "label": {
    "fr": "Firefox",
    "en": "Firefox"
   }
  },
  {
   "cle": "safari",
   "label": {
    "fr": "Safari (macOS, iOS)",
    "en": "Safari (macOS, iOS)"
   }
  }
 ],
 "sections": [
  {
   "cle": "decode",
   "titre": {
    "fr": "Formats d'image que le navigateur sait OUVRIR",
    "en": "Image formats the browser can OPEN"
   },
   "chapeau": {
    "fr": "C'est ce qui décide si un outil peut afficher votre fichier et travailler dessus. Un format absent d'ici n'est pas « bientôt » : il n'est pas là.",
    "en": "This decides whether a tool can display your file and work on it. A format missing here is not “coming soon”: it is not there."
   },
   "lignes": [
    {
     "cle": "jpeg",
     "label": {
      "fr": "JPEG (.jpg)",
      "en": "JPEG (.jpg)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "png",
     "label": {
      "fr": "PNG (.png), y compris animé",
      "en": "PNG (.png), including animated"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "webp",
     "label": {
      "fr": "WebP (.webp)",
      "en": "WebP (.webp)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Safari depuis la version 14, sur macOS Big Sur et au-delà.",
      "en": "Safari from version 14, on macOS Big Sur and later."
     }
    },
    {
     "cle": "avif",
     "label": {
      "fr": "AVIF (.avif)",
      "en": "AVIF (.avif)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Chrome 85, Firefox 93, Safari 16.1.",
      "en": "Chrome 85, Firefox 93, Safari 16.1."
     }
    },
    {
     "cle": "gif",
     "label": {
      "fr": "GIF (.gif)",
      "en": "GIF (.gif)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "bmp",
     "label": {
      "fr": "BMP (.bmp)",
      "en": "BMP (.bmp)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "svg",
     "label": {
      "fr": "SVG (.svg)",
      "en": "SVG (.svg)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "ico",
     "label": {
      "fr": "ICO (.ico)",
      "en": "ICO (.ico)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "tiff",
     "label": {
      "fr": "TIFF (.tif, .tiff)",
      "en": "TIFF (.tif, .tiff)"
     },
     "v": [
      "non",
      "non",
      "oui"
     ],
     "note": {
      "fr": "Safari est le SEUL navigateur qui affiche un TIFF. Les métadonnées d'un TIFF, elles, se lisent partout : elles sont dans l'en-tête du fichier, pas dans l'image.",
      "en": "Safari is the ONLY browser that displays a TIFF. TIFF metadata, however, can be read everywhere: it lives in the file header, not in the image."
     }
    },
    {
     "cle": "heic",
     "label": {
      "fr": "HEIC, HEIF (photos d'iPhone)",
      "en": "HEIC, HEIF (iPhone photos)"
     },
     "v": [
      "non",
      "non",
      "oui"
     ],
     "note": {
      "fr": "Safari 17 et iOS 17 les affichent. Chrome, Firefox et Edge ne les ont jamais décodés, pour une raison de brevets sur le codec. Le décodeur logiciel pèse plus de dix mégaoctets : écarté, et écrit.",
      "en": "Safari 17 and iOS 17 display them. Chrome, Firefox and Edge have never decoded them, because of codec patents. A software decoder weighs over ten megabytes: ruled out, and stated."
     }
    },
    {
     "cle": "jxl",
     "label": {
      "fr": "JPEG XL (.jxl)",
      "en": "JPEG XL (.jxl)"
     },
     "v": [
      "partiel",
      "partiel",
      "oui"
     ],
     "note": {
      "fr": "Mise à jour le 30/07/2026. Le format le plus instable du lot : retiré de Chromium en 2022, puis un décodeur écrit en Rust est revenu dans Chrome 145 en février 2026 et dans Firefox 152 en juin 2026, mais DÉSACTIVÉ par défaut dans les deux, derrière un drapeau. Safari l'affiche par défaut depuis sa version 17. Aucun navigateur ne sait l'ÉCRIRE. Aucun outil de ce site ne s'appuie dessus tant que la situation bouge.",
      "en": "Updated 2026-07-30. The least stable format of the lot: dropped from Chromium in 2022, then a decoder written in Rust returned in Chrome 145 in February 2026 and in Firefox 152 in June 2026, but DISABLED by default in both, behind a flag. Safari has displayed it by default since version 17. No browser can WRITE it. No tool on this site relies on it while the situation keeps moving."
     }
    }
   ]
  },
  {
   "cle": "encode",
   "titre": {
    "fr": "Formats que le navigateur sait ÉCRIRE",
    "en": "Formats the browser can WRITE"
   },
   "chapeau": {
    "fr": "C'est ce qui décide en quoi un outil peut convertir votre image. Le piège est silencieux : quand un navigateur ne sait pas écrire le format demandé, il rend un PNG sans prévenir. Nos outils vérifient donc le type du résultat au lieu de faire confiance.",
    "en": "This decides what a tool can convert your image into. The trap is silent: when a browser cannot write the requested format, it returns a PNG without warning. Our tools therefore check the type of the result instead of trusting it."
   },
   "lignes": [
    {
     "cle": "png-out",
     "label": {
      "fr": "Écrire un PNG",
      "en": "Write a PNG"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Le seul format que la spécification RENDE obligatoire : c'est aussi le repli universel.",
      "en": "The only format the specification makes mandatory: it is also the universal fallback."
     }
    },
    {
     "cle": "jpeg-out",
     "label": {
      "fr": "Écrire un JPEG",
      "en": "Write a JPEG"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ]
    },
    {
     "cle": "webp-out",
     "label": {
      "fr": "Écrire un WebP",
      "en": "Write a WebP"
     },
     "v": [
      "oui",
      "oui",
      "non"
     ],
     "note": {
      "fr": "Chrome 50, Edge 79, Firefox 96. AUCUNE version de Safari, ni sur Mac ni sur iPhone, ne sait écrire un WebP depuis un canevas. C'est la ligne la plus utile de toute cette matrice : un convertisseur qui annonce « WebP » sans le dire mentirait à un visiteur sur deux d'iPhone.",
      "en": "Chrome 50, Edge 79, Firefox 96. NO version of Safari, on Mac or iPhone, can write a WebP from a canvas. This is the most useful line in the whole matrix: a converter announcing “WebP” without saying this would lie to every other iPhone visitor."
     }
    },
    {
     "cle": "avif-out",
     "label": {
      "fr": "Écrire un AVIF",
      "en": "Write an AVIF"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Ligne CORRIGÉE le 30/07/2026. L'affirmation selon laquelle Chrome saurait écrire un AVIF depuis un canevas à partir de sa version 124 circule partout, recopiée de site en site, et nous n'avons trouvé AUCUNE source de première main : ni entrée au registre des fonctionnalités de Chrome, ni note de version, ni page de compatibilité dédiée. Nos outils ne s'y appuient donc pas : ils MESURENT à l'exécution ce que le navigateur sait écrire au lieu de le supposer. Si un navigateur l'expose demain, l'outil de conversion le proposera sans qu'une ligne de code change.",
      "en": "Line CORRECTED on 2026-07-30. The claim that Chrome can write an AVIF from a canvas from version 124 onwards is everywhere, copied from site to site, and we found NO first-hand source for it: no entry in the Chrome feature register, no release note, no dedicated compatibility page. Our tools therefore do not rely on it: they MEASURE at run time what the browser can write instead of assuming. If a browser exposes it tomorrow, the conversion tool will offer it without a line of code changing."
     }
    }
   ]
  },
  {
   "cle": "apis",
   "titre": {
    "fr": "Les capacités du navigateur dont les outils dépendent",
    "en": "The browser capabilities the tools depend on"
   },
   "lignes": [
    {
     "cle": "crypto",
     "label": {
      "fr": "Chiffrement natif (AES-GCM, clé dérivée d'un mot de passe, SHA-256)",
      "en": "Native cryptography (AES-GCM, password-derived key, SHA-256)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Disponible partout depuis 2017, mais UNIQUEMENT sur une page servie en HTTPS. C'est le cas de ce site.",
      "en": "Available everywhere since 2017, but ONLY on a page served over HTTPS. This site is."
     }
    },
    {
     "cle": "compression",
     "label": {
      "fr": "Compression et décompression natives (gzip, deflate)",
      "en": "Native compression and decompression (gzip, deflate)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Disponible dans tous les navigateurs. Précision utile ajoutée le 30/07/2026 : la variante de deflate BRUT, la seule qui serve à fabriquer un zip, est arrivée plus tard que le reste (Chrome 103, Firefox 113, Safari 16.4). Un code de zip écrit entre 2020 et 2022 pouvait donc échouer sur un Chrome qui annonçait pourtant savoir compresser.",
      "en": "Available in every browser. Useful precision added 2026-07-30: the RAW deflate variant, the only one that serves to build a zip, arrived later than the rest (Chrome 103, Firefox 113, Safari 16.4). Zip code written between 2020 and 2022 could therefore fail on a Chrome that nonetheless claimed it could compress."
     }
    },
    {
     "cle": "offscreen",
     "label": {
      "fr": "Traitement d'image hors écran (dans un fil séparé)",
      "en": "Off-screen image processing (in a separate thread)"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Chrome 69, Firefox 105, Safari 16.4. C'est ce qui évite de figer la page sur un gros fichier.",
      "en": "Chrome 69, Firefox 105, Safari 16.4. This is what avoids freezing the page on a big file."
     }
    },
    {
     "cle": "barcode",
     "label": {
      "fr": "Lecture de codes-barres et de QR codes par le système",
      "en": "Barcode and QR reading by the operating system"
     },
     "v": [
      "partiel",
      "non",
      "non"
     ],
     "note": {
      "fr": "Durcie le 30/07/2026, et c'est plus sévère que ce que nous écrivions. Cette fonction n'est pas une norme du web : elle s'appuie sur le système d'exploitation, et elle n'existe donc QUE sur Chromium à macOS, ChromeOS et Android. Elle est ABSENTE de Windows et de Linux, c'est-à-dire de la majorité des ordinateurs de bureau. Firefox ne l'a jamais implémentée. Safari en a une version expérimentale derrière un drapeau depuis la 17, et elle est CASSÉE depuis iOS 18. Un outil de QR code ne peut donc pas s'appuyer dessus : il faudrait embarquer sa propre lecture.",
      "en": "Hardened 2026-07-30, and it is stricter than what we had written. This is not a web standard: it leans on the operating system, so it exists ONLY on Chromium on macOS, ChromeOS and Android. It is ABSENT from Windows and Linux, which is to say from most desktop computers. Firefox never implemented it. Safari has an experimental version behind a flag since 17, and it has been BROKEN since iOS 18. A QR tool therefore cannot lean on it: it would have to carry its own reader."
     }
    },
    {
     "cle": "fichier",
     "label": {
      "fr": "Enregistrer via la vraie fenêtre « Enregistrer sous »",
      "en": "Saving through the real “Save as” dialog"
     },
     "v": [
      "oui",
      "non",
      "non"
     ],
     "note": {
      "fr": "Chromium seulement ; Firefox et Safari ont refusé cette interface. Le repli est le téléchargement classique, qui marche partout : c'est donc lui que nos outils utilisent par défaut.",
      "en": "Chromium only; Firefox and Safari declined this interface. The fallback is the ordinary download, which works everywhere: that is what our tools use by default."
     }
    },
    {
     "cle": "hachage-progressif",
     "label": {
      "fr": "Hacher un fichier morceau par morceau",
      "en": "Hashing a file piece by piece"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Le navigateur calcule très bien une empreinte SHA-256, mais SEULEMENT sur un fichier entier remis d'un coup : il n'existe aucune fonction pour l'alimenter progressivement. C'est ce qui impose une limite de poids à l'outil d'empreinte, et cette limite porte ce pourquoi.",
      "en": "The browser computes a SHA-256 fingerprint perfectly well, but ONLY on a whole file handed over at once: there is no function for feeding it progressively. That is what forces a weight limit on the fingerprint tool, and that limit carries this reason."
     }
    },
    {
     "cle": "chiffrement-flux",
     "label": {
      "fr": "Chiffrer un fichier en flux, sans le charger entier",
      "en": "Encrypting a file as a stream, without loading it whole"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Même limite que pour le hachage : le chiffrement du navigateur travaille sur un bloc complet, et la demande d'une version en flux est ouverte depuis 2016 sans réponse. Découper soi-même est possible, mais chaque morceau doit alors être lié à sa position, sinon on peut en retirer ou en réordonner sans que le sceau s'en aperçoive. Notre outil de chiffrement préfère annoncer une limite de poids honnête plutôt que d'improviser une construction de ce genre.",
      "en": "Same limit as for hashing: the browser's cipher works on one complete block, and the request for a streaming version has been open since 2016 with no answer. Splitting it yourself is possible, but each chunk must then be bound to its position, otherwise chunks can be removed or reordered without the seal noticing. Our encryption tool would rather state an honest weight limit than improvise a construction of that kind."
     }
    },
    {
     "cle": "argon2",
     "label": {
      "fr": "Fabrication de clé moderne (Argon2) dans le navigateur",
      "en": "Modern key derivation (Argon2) in the browser"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Argon2 est aujourd'hui le premier choix recommandé pour fabriquer une clé à partir d'un mot de passe, et il n'existe dans AUCUN navigateur : il faudrait embarquer un moteur WebAssembly. Notre outil de chiffrement emploie donc PBKDF2 avec SHA-256 et 600 000 passages, la valeur publiée en 2026 par la référence du domaine, et il l'AFFICHE à l'écran au lieu de laisser croire mieux.",
      "en": "Argon2 is today the first recommended choice for building a key from a password, and it exists in NO browser: it would take an embedded WebAssembly engine. Our encryption tool therefore uses PBKDF2 with SHA-256 and 600,000 rounds, the value published in 2026 by the reference in the field, and it SHOWS that on screen instead of implying better."
     }
    },
    {
     "cle": "ico",
     "label": {
      "fr": "Écrire un fichier d'icône ICO depuis un canevas",
      "en": "Writing an ICO icon file from a canvas"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Aucun navigateur ne sait écrire un ICO : il faut assembler le conteneur à la main autour d'images PNG. Le PNG dans un ICO est accepté depuis Windows Vista et depuis Firefox 9 ; pour Chrome, Edge et Safari, nous n'avons trouvé que des preuves d'usage, pas de source d'ingénierie. À savoir avant de promettre un générateur d'icônes.",
      "en": "No browser can write an ICO: the container has to be assembled by hand around PNG images. PNG inside an ICO has been accepted since Windows Vista and since Firefox 9; for Chrome, Edge and Safari we found only evidence of practice, not engineering sources. Worth knowing before promising an icon generator."
     }
    },
    {
     "cle": "crc32",
     "label": {
      "fr": "Calculer un CRC-32, obligatoire dans un zip",
      "en": "Computing a CRC-32, mandatory inside a zip"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Le navigateur ne propose que des empreintes cryptographiques (SHA-1 et SHA-2). Le CRC-32 qu'un fichier zip exige dans chacun de ses en-têtes doit donc être écrit à la main, en JavaScript ordinaire. C'est faisable en une trentaine de lignes, et c'est la seule brique qui manque pour fabriquer un zip sans bibliothèque.",
      "en": "The browser offers only cryptographic digests (SHA-1 and SHA-2). The CRC-32 that a zip file requires in each of its headers therefore has to be written by hand, in ordinary JavaScript. It takes about thirty lines, and it is the only brick missing to build a zip with no library."
     }
    }
   ]
  },
  {
   "cle": "memoire",
   "titre": {
    "fr": "Les limites de mémoire, celles qui font vraiment planter un onglet",
    "en": "Memory limits, the ones that actually crash a tab"
   },
   "chapeau": {
    "fr": "Elles ne sont écrites dans aucune norme, et c'est pour ça que tant de convertisseurs plantent en silence sur téléphone. Chaque outil de ce site annonce SA limite, et refuse proprement au-delà.",
    "en": "They are written in no standard, which is why so many converters fail silently on phones. Every tool on this site states ITS limit, and refuses cleanly beyond it."
   },
   "lignes": [
    {
     "cle": "surface",
     "label": {
      "fr": "Surface maximale d'un canevas",
      "en": "Maximum canvas area"
     },
     "v": [
      "oui",
      "oui",
      "partiel"
     ],
     "note": {
      "fr": "Sur iPhone et iPad, la surface d'un canevas a longtemps été plafonnée à 16,7 millions de pixels (soit 4096 sur 4096) ; iOS 18 l'a portée à 67,1 millions. Une photo de 50 mégapixels dépasse encore l'ancienne limite : un outil qui redessine l'image doit réduire avant, ou dire non.",
      "en": "On iPhone and iPad, canvas area was long capped at 16.7 million pixels (4096 by 4096); iOS 18 raised it to 67.1 million. A 50-megapixel photo still exceeds the old limit: a tool that redraws the image must scale down first, or say no."
     }
    },
    {
     "cle": "total",
     "label": {
      "fr": "Mémoire totale allouable aux canevas",
      "en": "Total memory allocatable to canvases"
     },
     "v": [
      "oui",
      "oui",
      "partiel"
     ],
     "note": {
      "fr": "Safari sur iOS plafonne l'ensemble des canevas d'un onglet, autour de quelques centaines de mégaoctets selon l'appareil. Un traitement par lot doit donc libérer chaque image avant de passer à la suivante, et pas seulement à la fin.",
      "en": "Safari on iOS caps the total canvas memory of a tab, around a few hundred megabytes depending on the device. Batch processing must therefore release each image before moving to the next, not only at the end."
     }
    }
   ]
  },
  {
   "cle": "pdf",
   "titre": {
    "fr": "Le PDF dans un navigateur, et l'état réel des bibliothèques",
    "en": "PDF in a browser, and the real state of the libraries"
   },
   "chapeau": {
    "fr": "Le navigateur ne sait RIEN faire d'un PDF, sinon l'afficher. Toute manipulation demande du code embarqué, et c'est la seule exception que la doctrine de ce site autorise. Voici ce que la vérification du 30 juillet 2026 a établi, et pourquoi le coin PDF attend une décision au lieu d'être ouvert à moitié.",
    "en": "The browser can do NOTHING with a PDF except display it. Any manipulation needs embedded code, and that is the only exception this site's doctrine allows. Here is what the check of 30 July 2026 established, and why the PDF corner is waiting on a decision rather than being half opened."
   },
   "lignes": [
    {
     "cle": "pdf-natif",
     "label": {
      "fr": "Fusionner, découper ou modifier un PDF sans aucune bibliothèque",
      "en": "Merging, splitting or editing a PDF with no library at all"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Rien dans un navigateur ne lit la structure d'un PDF. Afficher n'est pas lire : la visionneuse intégrée ne prête aucune de ses capacités à une page web.",
      "en": "Nothing in a browser reads the structure of a PDF. Displaying is not reading: the built-in viewer lends none of its capabilities to a web page."
     }
    },
    {
     "cle": "pdf-lib-etat",
     "label": {
      "fr": "La bibliothèque de manipulation que la fiche du projet avait prévue",
      "en": "The manipulation library the project brief had planned for"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "FAIT NEUF, ET IL CHANGE LA DÉCISION. Cette bibliothèque est en licence MIT et sait beaucoup de choses : fusionner, découper, pivoter, dessiner, remplir des formulaires, écrire les métadonnées. Mais sa dernière version publiée date de NOVEMBRE 2021, et son auteur est injoignable depuis mai 2024 : le code que le projet comptait embarquer n'a plus reçu la moindre correction depuis plus de quatre ans. Elle ne sait NI chiffrer NI déchiffrer un PDF, exactement comme sa propre documentation le dit.",
      "en": "NEW FACT, AND IT CHANGES THE DECISION. This library is MIT licensed and knows how to do a great deal: merge, split, rotate, draw, fill forms, write metadata. But its last published version dates from NOVEMBER 2021, and its author has been unreachable since May 2024: the code the project intended to embed has not had a single fix in over four years. It can NEITHER encrypt NOR decrypt a PDF, exactly as its own documentation says."
     }
    },
    {
     "cle": "pdf-mot-de-passe",
     "label": {
      "fr": "Poser ou retirer un mot de passe sur un PDF",
      "en": "Setting or removing a password on a PDF"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "Techniquement POSSIBLE en local, ce que nous ne pensions pas. Un prolongement maintenu de cette bibliothèque, en licence MIT lui aussi, implémente le chiffrement d'un PDF jusqu'à l'AES-256 et sait ouvrir un document protégé. Ce n'est donc plus une impossibilité technique : c'est devenu une décision, celle d'embarquer un prolongement jeune plutôt que le code nommé dans la doctrine, et d'en faire la seule dépendance de ce site pour des années. Elle appartient à l'association, pas à l'atelier.",
      "en": "Technically POSSIBLE locally, which we did not think. A maintained continuation of that library, MIT licensed as well, implements PDF encryption up to AES-256 and can open a protected document. So this is no longer a technical impossibility: it has become a decision, the decision to embed a young continuation rather than the code named in the doctrine, and to make it this site's only dependency for years. That decision belongs to the association, not to the workshop."
     }
    },
    {
     "cle": "pdf-images",
     "label": {
      "fr": "Transformer les pages d'un PDF en images",
      "en": "Turning the pages of a PDF into images"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "Impossible avec une bibliothèque de manipulation, qui n'est pas un moteur de rendu. Il faudrait embarquer le moteur de la visionneuse de Firefox, soit environ 1,7 mégaoctet de code avant compression, pour un seul outil : le poids d'un site entier. À réexaminer séparément, jamais en douce.",
      "en": "Impossible with a manipulation library, which is not a rendering engine. It would take the engine behind Firefox's viewer, about 1.7 megabytes of code before compression, for a single tool: the weight of an entire site. To be reconsidered separately, never quietly."
     }
    },
    {
     "cle": "pdf-alleger",
     "label": {
      "fr": "Alléger vraiment un PDF",
      "en": "Really making a PDF lighter"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "Une bibliothèque de manipulation peut regrouper les objets internes d'un document, ce qui gagne un peu sur un PDF riche en formulaires. Elle ne recompresse NI les images NI les polices, qui font la très grande majorité du poids d'un PDF ordinaire. Sur un document scanné, il n'y a donc à peu près rien à gagner, et un outil qui promettrait le contraire mentirait.",
      "en": "A manipulation library can pack a document's internal objects together, which gains a little on a form-heavy PDF. It recompresses NEITHER the images NOR the fonts, which make up the vast majority of an ordinary PDF's weight. On a scanned document there is therefore almost nothing to gain, and a tool promising otherwise would be lying."
     }
    },
    {
     "cle": "pdf-metadonnees",
     "label": {
      "fr": "Nettoyer VRAIMENT les métadonnées d'un PDF",
      "en": "REALLY cleaning the metadata of a PDF"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "Deux pièges que seule une lecture du code révèle. D'abord la bibliothèque réécrit d'elle-même un producteur et une date de modification à chaque ouverture, même quand personne ne l'a demandé. Ensuite elle ne touche JAMAIS au bloc de métadonnées moderne d'un PDF, celui qui peut contenir le même titre et le même auteur que le reste : un nettoyage qui s'arrêterait au premier serait faux, et il faudrait le prouver en relisant le fichier produit.",
      "en": "Two traps that only reading the code reveals. First, the library rewrites a producer and a modification date of its own on every open, even when nobody asked. Second, it NEVER touches a PDF's modern metadata block, the one that can hold the same title and the same author as the rest: a cleanup stopping at the first would be false, and it would have to be proven by reading the produced file back."
     }
    },
    {
     "cle": "pdf-rendu",
     "label": {
      "fr": "Dessiner une page de PDF en image (rastériser) avec la bibliothèque embarquée",
      "en": "Drawing a PDF page as an image (rasterising) with the embedded library"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "La bibliothèque du coin PDF FABRIQUE des PDF, elle n'en peint pas les pages : son interface publique n'exporte aucun symbole de rendu. Rastériser demande un second moteur, dont le poids réel mesuré sur ses fichiers publiés est de 1,72 Mo minifié (454 669 o pour l'interface, 1 262 398 o pour le travailleur), environ 502 Ko compressé. « PDF vers images » est donc écarté et écrit.",
      "en": "The PDF corner's library BUILDS PDFs, it does not paint their pages: its public interface exports no rendering symbol at all. Rasterising needs a second engine whose real weight, measured on its published files, is 1.72 MB minified (454,669 B for the interface, 1,262,398 B for the worker), around 502 KB compressed. So “PDF to images” is ruled out, and written down."
     }
    },
    {
     "cle": "pdf-aes",
     "label": {
      "fr": "Chiffrer un PDF en AES-256 dans le navigateur, et l'ouvrir",
      "en": "Encrypting a PDF with AES-256 in the browser, and opening one"
     },
     "v": [
      "oui",
      "oui",
      "oui"
     ],
     "note": {
      "fr": "Possible avec la bibliothèque embarquée, MAIS en révision 5 seulement (extension Adobe de 2008), pas en révision 6 de la norme PDF 2.0. La révision 5 vérifie le mot de passe par un SEUL passage de SHA-256 ; la 6 emploie un hachage itéré, et les benchmarks publics d'outils d'attaque donnent quatre à cinq ordres de grandeur d'écart en vitesse d'essai. La révision 5 est la seule que la norme PDF 2.0 déprécie. L'algorithme dépend de l'EN-TÊTE du fichier : mesuré, seule la chaîne « 1.7ext3 » déclenche l'AES-256, sans quoi on obtient du RC4 ou de l'AES-128.",
      "en": "Possible with the embedded library, BUT at revision 5 only (Adobe's 2008 extension), not revision 6 of the PDF 2.0 standard. Revision 5 verifies the password with a SINGLE pass of SHA-256; revision 6 uses an iterated hash, and published benchmarks from attack tools show four to five orders of magnitude difference in trial speed. Revision 5 is the only one the PDF 2.0 standard deprecates. The algorithm depends on the file HEADER: measured, only the string “1.7ext3” triggers AES-256, otherwise you get RC4 or AES-128."
     }
    },
    {
     "cle": "pdf-r5-lecteurs",
     "label": {
      "fr": "Ouvrir un PDF chiffré en AES-256 révision 5 dans le lecteur intégré du navigateur",
      "en": "Opening an AES-256 revision 5 encrypted PDF in the browser's built-in reader"
     },
     "v": [
      "oui",
      "oui",
      "partiel"
     ],
     "note": {
      "fr": "Vérifié dans le CODE SOURCE des moteurs : PDFium (Chrome, Edge) traite la révision 5 dès son contrôle de mot de passe, et pdf.js (Firefox) porte une classe dédiée à la révision 5 distincte de celle de la révision 6. Adobe Acrobat l'ouvre depuis la version 9. Pour l'Aperçu de macOS et d'iOS, et pour les lecteurs d'Android, AUCUNE source de première main n'a été trouvée : la colonne Safari est donc « en partie », et le site n'affirme rien de plus.",
      "en": "Verified in the SOURCE CODE of the engines: PDFium (Chrome, Edge) handles revision 5 right at its password check, and pdf.js (Firefox) carries a dedicated revision 5 class, distinct from the revision 6 one. Adobe Acrobat has opened it since version 9. For macOS and iOS Preview, and for Android readers, NO first-hand source was found: so the Safari column says “partly”, and the site claims nothing more."
     }
    },
    {
     "cle": "pdf-polices",
     "label": {
      "fr": "Écrire du texte accentué ou non latin dans un PDF sans embarquer un moteur de polices",
      "en": "Writing accented or non-Latin text into a PDF without embedding a font engine"
     },
     "v": [
      "partiel",
      "partiel",
      "partiel"
     ],
     "note": {
      "fr": "Sans le moteur de polices que la bibliothèque réclame pour toute police personnalisée (et que nous n'embarquons pas), seules les 14 polices standard du PDF existent, en Windows-1252 : environ 218 caractères latins. Un caractère hors de ce jeu ne lève PAS d'erreur dans la version livrée : le code attrape l'exception et écrit un point d'interrogation. Un outil qui écrit du texte doit donc valider l'entrée et NOMMER ce qu'il ne sait pas écrire.",
      "en": "Without the font engine the library requires for any custom font (which we do not embed), only PDF's 14 standard fonts exist, in Windows-1252: about 218 Latin characters. A character outside that set does NOT raise an error in the shipped version: the code catches the exception and writes a question mark. So a tool that writes text has to validate the input and NAME what it cannot write."
     }
    },
    {
     "cle": "pdf-restrictions",
     "label": {
      "fr": "Empêcher réellement l'impression ou la copie d'un PDF",
      "en": "Really preventing a PDF from being printed or copied"
     },
     "v": [
      "non",
      "non",
      "non"
     ],
     "note": {
      "fr": "Le format permet d'écrire ces interdictions dans le fichier, mais ce ne sont que des demandes faites au lecteur : le contenu est déchiffré dès l'ouverture, et un lecteur qui ignore la demande imprime quand même. Aucun outil, local ou distant, ne peut faire mieux. Le site ne propose donc pas ces cases.",
      "en": "The format lets you write those restrictions into the file, but they are only requests made to the reader: the content is decrypted the moment it opens, and a reader that ignores the request prints anyway. No tool, local or remote, can do better. So the site does not offer those checkboxes."
     }
    }
   ]
  }
 ],
 "sources": [
  {
   "titre": {
    "fr": "Guide des formats d'image (MDN)",
    "en": "Image file type and format guide (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Formats/Image_types"
  },
  {
   "titre": {
    "fr": "Écrire un WebP depuis un canevas : tableau de support",
    "en": "Writing WebP from a canvas: support table"
   },
   "url": "https://caniuse.com/mdn-api_htmlcanvaselement_toblob_type_parameter_webp"
  },
  {
   "titre": {
    "fr": "canvas.toBlob (MDN)",
    "en": "canvas.toBlob (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob"
  },
  {
   "titre": {
    "fr": "Compression natives : disponibles partout (web.dev)",
    "en": "Compression Streams now supported on all browsers (web.dev)"
   },
   "url": "https://web.dev/blog/compressionstreams"
  },
  {
   "titre": {
    "fr": "Chiffrement natif (MDN)",
    "en": "SubtleCrypto (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto"
  },
  {
   "titre": {
    "fr": "Lecture de codes-barres (MDN)",
    "en": "Barcode Detection API (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/Barcode_Detection_API"
  },
  {
   "titre": {
    "fr": "Fenêtre « Enregistrer sous » (MDN)",
    "en": "showSaveFilePicker (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker"
  },
  {
   "titre": {
    "fr": "Traitement hors écran (MDN)",
    "en": "OffscreenCanvas (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas"
  },
  {
   "titre": {
    "fr": "L'orientation EXIF selon les formats",
    "en": "EXIF orientation in different formats"
   },
   "url": "https://zpl.fi/exif-orientation-in-different-formats/"
  },
  {
   "titre": {
    "fr": "Le conteneur WebP (spécification)",
    "en": "WebP container specification"
   },
   "url": "https://developers.google.com/speed/webp/docs/riff_container"
  },
  {
   "titre": {
    "fr": "pdf-lib : ce que la bibliothèque sait faire",
    "en": "pdf-lib: what the library can do"
   },
   "url": "https://github.com/Hopding/pdf-lib"
  },
  {
   "titre": {
    "fr": "Surface maximale d'un canevas sur iOS",
    "en": "Canvas area limit on iOS"
   },
   "url": "https://pqina.nl/blog/canvas-area-exceeds-the-maximum-limit/"
  },
  {
   "titre": {
    "fr": "Sérialiser un canevas en fichier (norme HTML)",
    "en": "Serialising bitmaps to a file (HTML Standard)"
   },
   "url": "https://html.spec.whatwg.org/multipage/canvas.html"
  },
  {
   "titre": {
    "fr": "Stockage des mots de passe : les paramètres recommandés",
    "en": "Password Storage Cheat Sheet (OWASP)"
   },
   "url": "https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html"
  },
  {
   "titre": {
    "fr": "Fabriquer une clé à partir d'un mot de passe (NIST SP 800-132)",
    "en": "Password-based key derivation (NIST SP 800-132)"
   },
   "url": "https://csrc.nist.gov/pubs/sp/800/132/final"
  },
  {
   "titre": {
    "fr": "Chiffrer avec l'interface du navigateur",
    "en": "SubtleCrypto.encrypt (MDN)"
   },
   "url": "https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt"
  },
  {
   "titre": {
    "fr": "Chiffrer en flux : la demande restée ouverte",
    "en": "Using the Web Crypto interface with streams (W3C issue)"
   },
   "url": "https://github.com/w3c/webcrypto/issues/73"
  },
  {
   "titre": {
    "fr": "Compression native : le tableau de support",
    "en": "CompressionStream: support table"
   },
   "url": "https://caniuse.com/mdn-api_compressionstream_compressionstream"
  },
  {
   "titre": {
    "fr": "Le format de fichier ZIP (spécification)",
    "en": "The ZIP file format (PKWARE specification)"
   },
   "url": "https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.2.TXT"
  },
  {
   "titre": {
    "fr": "Le format d'icône ICO, et le PNG dedans",
    "en": "The ICO format, and PNG inside it"
   },
   "url": "https://devblogs.microsoft.com/oldnewthing/20101022-00/?p=12473"
  },
  {
   "titre": {
    "fr": "La bibliothèque PDF est-elle encore active ? (discussion)",
    "en": "Is the PDF library still active? (discussion)"
   },
   "url": "https://github.com/Hopding/pdf-lib/discussions/1631"
  },
  {
   "titre": {
    "fr": "Le prolongement maintenu de la bibliothèque PDF",
    "en": "The maintained continuation of the PDF library"
   },
   "url": "https://github.com/cantoo-scribe/pdf-lib"
  },
  {
   "titre": {
    "fr": "Lecture de codes-barres : ce que le support réel signifie",
    "en": "Barcode detection: what the real support means"
   },
   "url": "https://developer.chrome.com/docs/capabilities/shape-detection"
  },
  {
   "titre": {
    "fr": "Le supplément d'Adobe à la norme ISO 32000 : le chiffrement AESV3 de l'extension 3",
    "en": "Adobe's supplement to ISO 32000: the AESV3 encryption of extension level 3"
   },
   "url": "https://www.loc.gov/preservation/digital/formats/fdd/fdd000313.shtml"
  },
  {
   "titre": {
    "fr": "pdf.js : le code des deux révisions du chiffrement AES-256 d'un PDF",
    "en": "pdf.js: the code of both revisions of a PDF's AES-256 encryption"
   },
   "url": "https://github.com/mozilla/pdf.js/blob/master/src/core/crypto.js"
  },
  {
   "titre": {
    "fr": "PDFium : le contrôle de mot de passe AES-256 du moteur de Chrome",
    "en": "PDFium: the AES-256 password check of Chrome's engine"
   },
   "url": "https://github.com/chromium/pdfium/blob/main/core/fpdfapi/parser/cpdf_security_handler.cpp"
  },
  {
   "titre": {
    "fr": "La norme ISO 32000-1 : les flux d'objets (§7.5.7) et les images (§8.9.5)",
    "en": "The ISO 32000-1 standard: object streams (§7.5.7) and images (§8.9.5)"
   },
   "url": "https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf"
  },
  {
   "titre": {
    "fr": "qpdf : pourquoi la révision 5 ne devrait servir qu'à tester la compatibilité",
    "en": "qpdf: why revision 5 should only be used to test format compatibility"
   },
   "url": "https://qpdf.readthedocs.io/en/stable/encryption.html"
  }
 ]
}