ASKLERA PDF — Feuille de route

01 — État des lieux (mesuré, 2026-09-14, HEAD 782f231)

1. Ce qui existe et est prouvé

Mesure Valeur
Crates sur Kellnr (chaque .crate retéléchargé et comparé octet à octet) 16 : apdf 0.1.0 (façade), apdf-cli 0.1.0, apdf-object 0.2.0, apdf-parse 0.2.0, apdf-filter 0.1.1, apdf-crypt 0.2.0, apdf-font/-write/-layout/-doc/-content/-conform/-render/-sign 0.1.0, apdf-fonts-std14 0.1.1, apdf-icc-profiles 0.1.1
Registre de couverture ISO 32000-2 (docs/COUVERTURE-ISO32000.toml) 293 lignes : 252 implémentées, 30 partielles, 11 hors périmètre ; aucune ligne à verified = false — chaque clause relue dans le texte sponsorisé ISO 32000-2:2020 EC3, 21 numéros de clause corrigés
Porte de preuve cargo xtask prove all --include-ignored : 1 295 tests, 1 295 prouvés, 0 SKIPPED, sans variable d'environnement (le corpus se résout par défaut sur tests/corpus), depuis un worktree propre, ≈3 h à opt-level 3
Preuve de consommation projet neuf ~/apdf-smoke sur big-1 : apdf = { registry = "kellnr" } seul, zéro path, 172 paquets résolus depuis Kellnr ; ouvre, extrait (= pdftotext), rend, valide le PDF/A (règles = veraPDF)
Textes de référence enregistrés (docs/REFERENCES.toml, 124 entrées, 0 défaut) ISO 32000-1:2008, ISO 32000-2:2020 + Errata Collection 3, ISO/TS 32001–32005, ISO 14289-1/-2, ISO/IEC 14496-22:2019, XFA 3.3, ITU-T T.4/T.6/T.81/T.88/T.800, ICC.1:2022, RFC 1951/7932, Adobe TN 5014/5099/5176/5177/5411, suppléments Adobe ExtLevel 3/5, PDF 2.0 AN 001–003, TechNotes PDF/A 0001–0010, Matterhorn 1.1, WTPDF 1.0, PDF Declarations, EA-PDF 1.0, extension Brotli, PRC WD (SC2 N570), ECMA-363, XFDF 3.0 + XSD, FDF, OGC GeoPDF, Arlington PDF Model, profils + sources veraPDF, aperçus iTeh des 19005-1..4, 15930-1..9, 16612-2/3, 24517-1, 19444-1, 16684-1/2/4, 14739-1, IEC 61966-2-1, 12647-2
Corpus de test (hors dépôt, jamais publiés) épinglé 1 949 (qpdf, pdfium, pdf.js, mutool) + PDFBox 193 + pdfcpu 511 + veraPDF 2 908 + Isartor 205 + Ghent Output Suite 98 + Cal Poly PDF/VT 12 + PDF/UA Reference Suite 16 + conformité OpenJPEG + UBC JBIG2 + vecteurs ITU T.88 + PngSuite + zlib infcover + UCD BidiTest
Oracles indépendants branchés qpdf 12.4, mutool 1.28, poppler 26.08 (pdftotext/pdftoppm/pdfimages/pdfinfo/pdffonts/pdfsig/pdfdetach), pdf.js 6.3 (pdfjs-dist épinglé), veraPDF 1.30.2, Ghostscript 10.08, LittleCMS transicc, OpenJPEG 2.5, libjpeg-turbo, jbig2dec, libtiff, fontTools/ttx, CPython (zlib, stringprep, xml), OpenSSL 3.6 (cms/ts/pkcs12), pyHanko 0.37, pypdfium2 5.13, Arlington TestGrammar, fribidi, brotli(1), pdftk 3.3.3, xmllint
Amont corrigé par ce programme (Kellnr) russl-codec-jpeg2000 0.9.3 (23/23 ISO/IEC 15444-4), russl-codec-jbig2 0.9.3 (96/96 fixtures pdf.js, UBC 65/65), russl-entropy-mq 0.9.1, russl-pkcs12 0.1.3 (lecture RC2-40/3DES), russl-rsa 0.1.7 (*_allow_legacy), russl-pades 0.1.2 (FieldMDP, mises à jour de flux xref), russl-pdf 0.1.1, russl-cades 0.1.4 (attributs non signés), russl-brotli 0.9.0 consommé

2. Où l'on dépasse déjà une référence (mesuré, nommé)

  • JBIG2 : poppler faux sur 10 des 96 fixtures pdf.js bitmap-*, jbig2dec faux sur 1 ; nous 96/96 (le PBM de l'auteur comme vérité terrain, jbig2.wasm de pdf.js comme second témoin).
  • CCITT G4 testfax4 : poppler et mupdf échouent à la même ligne ; nous bit-exact (libtiff d'accord).
  • JPEG 2000 : 23/23 codestreams de conformité ISO/IEC 15444-4 (15 bit-exacts, 8 dans les tables C.6/C.7) ; aucun visualiseur ne revendique cela.
  • Brotli : le prototype pdf.js dont les flux xref et d'objets sont eux-mêmes en Brotli s'ouvre chez nous ; qpdf, poppler et mutool le refusent.
  • Bidi : UAX #9 BidiCharacterTest 91 707/91 707, BidiTest 770 241/770 241 (UCD 17.0) ; fribidi 442/442 sur les lignes du corpus. Aucun extracteur de texte concurrent n'a cette preuve.
  • PDF/UA au niveau glyphe : 8 règles que veraPDF ne peut pas déclencher (ex. 8.10.3.5-1 — son analyseur ne construit jamais d'éléments sémantiques pour les apparences d'annotation) sont vérifiées avec des contrôles négatifs.
  • ISO/TS 32005 : Table 5 générée depuis le texte (1 190 paires, errata pdf-issues #440/#336 appliqués) ; 59 paires où veraPDF diverge du texte, listées.
  • Pages géantes : page de 12 608×16 806 pt rendue en 936 Mo / 30 s (pdftoppm 5,0 Go, mutool 6,9 Go).
  • Prépresse : PDF/X-5g, X-5pg, PDF/VT-2 écrits et vérifiés ; suite Cal Poly PDF/VT 12/12 ; XObjects de référence (§8.10.4) rendus avec substitution (poppler et mupdf ignorent /Ref).
  • Chiffrement : R2–R6, AES-GCM (TS 32003), clé publique avec coffres PKCS#12 RC2-40/3DES lus et dégradation nommée (KeyStrength::Legacy{bits}) là où les autres lecteurs restent silencieux ; TS 32004 /AttachedToSig vérifié (pyHanko d'accord).
  • Couleur : espaces /Default* et intentions de sortie appliqués (poppler n'applique jamais l'intention ; gs -dUsePDFX3Profile d'accord avec nous au pixel près) ; DeviceCMYK→RVB selon §10.4.2.5 (1−min(1,c+k)) là où le code porté avait (1−c)(1−k) ; 67 profils ICC libres livrés, 804 conversions à Δ1 maximum face à LittleCMS.

3. Ce qui manque (honnête)

  • Lignes du registre à absent : fdf, xfdf, pdf-declarations, pdfraster, ea-pdf ; partial (30) : pdfa-2/3/4, pdfx-1a/3/4/5/6, pdfvt-1-2/3, crypt-public-key (ECDH, contenu 3DES/RC2), filter-brotli (fenêtre large RFC 9841), associated-files, transparency-colour-issues, ts-32001/32002/32004 (écriture, bloquée sur russl-pades), conformance-processors, damaged-file-recovery, filter-predictors, layout-hyphenation, xfa-forms.
  • Aucune liaison hors Rust. Aucun chiffre de performance publié (lane interrompue). Pas encore de fuzzing guidé par la couverture (lane interrompue). CJK sans police incorporée non dessiné (décision Noto/Source Han en attente). DCT tronqué non peint (poppler/mupdf peignent le préfixe). Pas d'OCR. Pas de conversion Office. Aucun chemin de signature par carte à puce/jeton exposé dans apdf-sign (RUSSL/libcps-rs existent en amont ; rien de générique ici).
  • Textes ISO payants non acquis (≈18 documents, ~150–260 € chacun) : 19005-1/2/3/4, 15930-1/3/4/6/7/8/9, 16612-2/3, 24517-1, 19444-1, 16684-1/2, 14739-1, IEC 61966-2-1, 12647-2 — voir 06-decisions.md D-2.
  • Branches amont non fusionnées (arbres partagés occupés par d'autres sessions) : RUSSL fix/cms-interop-and-crl-signing (lane G), lane-r-pkcs12-rsa (lane R) ; CODECS laneM-jbig2-2026-09-13, laneY-jpx-2026-09-13, commits jpeg2000 de la lane F sur argon-full-corpus-2026-08-16.
  • Checkout partagé sur big-1 : assaini le 2026-09-14 (index périmé remis sur HEAD, 59 fichiers périmés restaurés, 9 fichiers de churn rustfmt restaurés) ; 34 fichiers de travail non commité mêlés à d'anciennes bases subsistent — les worktrees des lanes font foi (voir 05-battle-order.md Phase 0), pas l'arbre partagé.
  • L'arbre n'est pas propre au sens rustfmt à HEAD (3 774 blocs) : à formater en un seul commit quand aucune lane n'est active.
Source: docs/roadmap-fr/01-baseline.md · big-1 · 2026-09-14 19:07 UTC