Document Format Conformance · PDF · OOXML · ODF · Factur-X
Overview
Boîte à outils experte pour les spécifications des formats documentaires et
leur conformité. Deux modes complémentaires :
- Mode FICHIER — inspecter, valider, réparer et modifier des fichiers réels
(.pdf, .docx, .xlsx, .pptx, .odt, .ods, .odp, Factur-X) en garantissant qu'ils
restent conformes à leur spec après modification.
- Mode CODE — auditer une bibliothèque / un moteur qui produit ces formats
(couverture de la spec, écarts, vecteurs de test). Voir
references/audit-methodology.md.
Principe directeur : on n'implémente aucun parseur maison. Les scripts sont de
fins wrappers autour des validateurs de référence (qpdf, veraPDF, lxml/xmllint,
factur-x/saxonche, pikepdf/pypdf). La conformité affichée est donc celle d'outils
faisant autorité, pas d'heuristiques.
Setup (une seule fois)
Le skill installe lui-même ses dépendances (venv Python + CLI + veraPDF) :
bash scripts/setup.sh # idempotent : relançable sans risque
python3 scripts/doctor.py # diagnostic : que manque-t-il ?
setup.sh crée ./.venv (pikepdf, pypdf, factur-x, python-docx, python-pptx,
openpyxl, lxml), installe qpdf + xmllint (apt) et veraPDF (headless dans
~/.local). Les scripts Python détectent ./.venv et s'y ré-exécutent seuls —
les lancer avec python3 scripts/<x>.py … suffit. Si un validateur manque, le
script le signale et renvoie vers setup.sh (jamais d'échec silencieux).
Ajouter ~/.local/bin au PATH si verapdf n'est pas trouvé.
Choix du format (router)
detect_format() reconnaît le format par magic bytes (%PDF, PK + mimetype/
parts). En général, lancer directement le script : il route seul.
| Si le fichier est… |
Famille |
Spec |
Référence à lire |
.pdf |
pdf |
ISO 32000-2 (+ ISO 19005 PDF/A) |
references/pdf.md |
.docx .xlsx .pptx |
ooxml |
ECMA-376 / ISO 29500 (OPC) |
references/ooxml.md |
.odt .ods .odp |
odf |
ISO 26300 (ODF) |
references/odf.md |
| Factur-X / ZUGFeRD |
pdf (PDF/A-3) |
ISO 19005-3 + Factur-X |
references/facturx-pdfa3.md |
Workflow standard (mode FICHIER)
- Inspecter la structure réelle avant tout :
python3 scripts/inspect_doc.py <fichier>
- Valider la conformité (rapport JSON, exit 0/1/2) :
python3 scripts/validate.py <fichier> [--pdfa 3b] [--xsd DIR] [--rng SCHEMA]
- Modifier en restant conforme, puis la modif est revalidée automatiquement :
- PDF :
python3 scripts/pdf_modify.py <set-meta|attach|repair|decrypt> …
- OOXML/ODF :
python3 scripts/opc_modify.py <list|get|set> …
- Factur-X :
python3 scripts/facturx_tool.py <check|extract|embed> …
Gate de conformité (NON-NÉGOCIABLE) : toute modification est rejetée ou
signalée non conforme si elle casse la spec — un opc_modify set refuse un XML
non well-formed (aucun fichier produit) ; un pdf_modify/facturx embed relance
qpdf/veraPDF sur la sortie. Ne jamais livrer un fichier dont la post-validation
n'est pas verte.
Scripts (cheat-sheet)
| Script |
Rôle |
Outils sous-jacents |
inspect_doc.py <f> |
dump structurel JSON (lecture seule) |
pikepdf, zipfile, lxml |
validate.py <f> [--pdfa] [--xsd] [--rng] |
rapport de conformité |
qpdf, veraPDF, lxml, xmllint |
pdf_modify.py … |
set-meta / attach / repair / decrypt |
pikepdf, pypdf (incremental), qpdf |
opc_modify.py … |
list / get / set d'une part OOXML/ODF |
zipfile, lxml + revalidation |
facturx_tool.py … |
check / extract / embed Factur-X |
factur-x, pikepdf, veraPDF |
doctor.py |
diagnostic des validateurs |
— |
setup.sh |
bootstrap idempotent |
venv, apt, veraPDF |
Points de conformité clés (mémo)
- PDF : modifier sans casser = incremental update (
pdf_modify set-meta --incremental : append d'une révision, octets d'origine préservés → signatures
intactes). Un fichier « réparé » par qpdf (xref reconstruit) est signalé
non byte-clean (≠ warning bénin /Size).
- OOXML : 3 invariants OPC =
[Content_Types].xml déclare chaque part, les
*.rels pointent vers des parts existantes, parts XML well-formed.
- ODF :
mimetype doit être la 1ère entrée du ZIP, STORED (non compressée),
valeur exacte — opc_modify le re-garantit à chaque repackage.
- Factur-X : PDF/A-3b (veraPDF) + XML embarqué nommé
factur-x.xml +
/AFRelationship + /AF document-level + XMP Factur-X. La sémantique fiscale
du XML (Schematron EN16931, business terms, réforme FR 2026) relève du skill
isca-nf525-facturation-electronique — ne pas la dupliquer ici.
Mode CODE (audit d'un générateur)
Pour auditer une codebase qui produit ces formats (ex : un moteur PDF maison, un
exporteur docx), suivre references/audit-methodology.md :
inventaire des features de la spec → matrice de couverture → génération de fixtures
→ validation des sorties avec les mêmes scripts → table d'écarts priorisée.
Obtenir les schémas officiels (validation sémantique forte)
La validation XSD ECMA-376 et RelaxNG ODF nécessite les schémas officiels (non
redistribués ici). Procédure d'obtention + commandes xmllint --schema/--relaxng
dans references/ooxml.md et references/odf.md.
1---2name: document-format-conformance3description: Expert des spécifications de formats documentaires — PDF (ISO 32000), PDF/A (ISO 19005), OOXML/Office (ECMA-376 / ISO 29500 : .docx .xlsx .pptx), ODF/ OpenOffice (ISO 26300 : .odt .ods .odp) et Factur-X/PDF-A3 (conteneur). Permet d'INSPECTER la structure réelle d'un fichier, de VALIDER sa conformité structurelle ET sémantique (qpdf, veraPDF, lxml/xmllint, factur-x), de MODIFIER un fichier « à la volée » en garantissant qu'il reste conforme (incremental update PDF signature-safe, patch de part OPC/ODF avec repackage valide), et d'AUDITER une codebase/un moteur qui produit ces formats contre la spec. À utiliser dès qu'apparaissent : conformité PDF, PDF/A, PDF/UA, ISO 32000, veraPDF, xref/trailer, incremental update, OOXML, ECMA-376, ISO 29500, OPC, [Content_Types].xml, docx/xlsx/pptx, ODF, ISO 26300, manifest.xml, mimetype, Factur-X, ZUGFeRD, PDF/A-3, AFRelationship, valider/réparer/modifier un PDF ou un document Office/OpenOffice, auditer un générateur de PDF/Office.4---56# Document Format Conformance · PDF · OOXML · ODF · Factur-X78## Overview910Boîte à outils experte pour les **spécifications** des formats documentaires et11leur **conformité**. Deux modes complémentaires :1213- **Mode FICHIER** — inspecter, valider, réparer et modifier des fichiers réels14 (.pdf, .docx, .xlsx, .pptx, .odt, .ods, .odp, Factur-X) en garantissant qu'ils15 restent conformes à leur spec après modification.16- **Mode CODE** — auditer une bibliothèque / un moteur qui *produit* ces formats17 (couverture de la spec, écarts, vecteurs de test). Voir18 [references/audit-methodology.md](references/audit-methodology.md).1920Principe directeur : **on n'implémente aucun parseur maison**. Les scripts sont de21fins wrappers autour des validateurs de référence (qpdf, veraPDF, lxml/xmllint,22factur-x/saxonche, pikepdf/pypdf). La conformité affichée est donc celle d'outils23faisant autorité, pas d'heuristiques.2425## Setup (une seule fois)2627Le skill **installe lui-même ses dépendances** (venv Python + CLI + veraPDF) :2829```bash30bash scripts/setup.sh # idempotent : relançable sans risque31python3 scripts/doctor.py # diagnostic : que manque-t-il ?32```3334`setup.sh` crée `./.venv` (pikepdf, pypdf, factur-x, python-docx, python-pptx,35openpyxl, lxml), installe `qpdf` + `xmllint` (apt) et **veraPDF** (headless dans36`~/.local`). Les scripts Python détectent `./.venv` et s'y **ré-exécutent** seuls —37les lancer avec `python3 scripts/<x>.py …` suffit. Si un validateur manque, le38script le signale et renvoie vers `setup.sh` (jamais d'échec silencieux).3940> Ajouter `~/.local/bin` au `PATH` si `verapdf` n'est pas trouvé.4142## Choix du format (router)4344`detect_format()` reconnaît le format par magic bytes (`%PDF`, `PK` + mimetype/45parts). En général, **lancer directement le script** : il route seul.4647| Si le fichier est… | Famille | Spec | Référence à lire |48|---|---|---|---|49| `.pdf` | `pdf` | ISO 32000-2 (+ ISO 19005 PDF/A) | [references/pdf.md](references/pdf.md) |50| `.docx` `.xlsx` `.pptx` | `ooxml` | ECMA-376 / ISO 29500 (OPC) | [references/ooxml.md](references/ooxml.md) |51| `.odt` `.ods` `.odp` | `odf` | ISO 26300 (ODF) | [references/odf.md](references/odf.md) |52| Factur-X / ZUGFeRD | `pdf` (PDF/A-3) | ISO 19005-3 + Factur-X | [references/facturx-pdfa3.md](references/facturx-pdfa3.md) |5354## Workflow standard (mode FICHIER)55561. **Inspecter** la structure réelle avant tout :57 `python3 scripts/inspect_doc.py <fichier>`582. **Valider** la conformité (rapport JSON, exit 0/1/2) :59 `python3 scripts/validate.py <fichier> [--pdfa 3b] [--xsd DIR] [--rng SCHEMA]`603. **Modifier** en restant conforme, puis la modif est **revalidée** automatiquement :61 - PDF : `python3 scripts/pdf_modify.py <set-meta|attach|repair|decrypt> …`62 - OOXML/ODF : `python3 scripts/opc_modify.py <list|get|set> …`63 - Factur-X : `python3 scripts/facturx_tool.py <check|extract|embed> …`6465**Gate de conformité (NON-NÉGOCIABLE)** : toute modification est rejetée ou66signalée non conforme si elle casse la spec — un `opc_modify set` refuse un XML67non well-formed (aucun fichier produit) ; un `pdf_modify`/`facturx embed` relance68qpdf/veraPDF sur la sortie. Ne jamais livrer un fichier dont la post-validation69n'est pas verte.7071## Scripts (cheat-sheet)7273| Script | Rôle | Outils sous-jacents |74|---|---|---|75| `inspect_doc.py <f>` | dump structurel JSON (lecture seule) | pikepdf, zipfile, lxml |76| `validate.py <f> [--pdfa] [--xsd] [--rng]` | rapport de conformité | qpdf, veraPDF, lxml, xmllint |77| `pdf_modify.py …` | set-meta / attach / repair / decrypt | pikepdf, pypdf (incremental), qpdf |78| `opc_modify.py …` | list / get / set d'une part OOXML/ODF | zipfile, lxml + revalidation |79| `facturx_tool.py …` | check / extract / embed Factur-X | factur-x, pikepdf, veraPDF |80| `doctor.py` | diagnostic des validateurs | — |81| `setup.sh` | bootstrap idempotent | venv, apt, veraPDF |8283### Points de conformité clés (mémo)8485- **PDF** : modifier sans casser = **incremental update** (`pdf_modify set-meta86 --incremental` : append d'une révision, octets d'origine préservés → signatures87 intactes). Un fichier « réparé » par qpdf (xref reconstruit) est signalé88 **non byte-clean** (≠ warning bénin `/Size`).89- **OOXML** : 3 invariants OPC = `[Content_Types].xml` déclare chaque part, les90 `*.rels` pointent vers des parts existantes, parts XML well-formed.91- **ODF** : `mimetype` doit être la **1ère entrée du ZIP, STORED (non compressée)**,92 valeur exacte — `opc_modify` le re-garantit à chaque repackage.93- **Factur-X** : PDF/A-3b (veraPDF) + XML embarqué nommé `factur-x.xml` +94 `/AFRelationship` + `/AF` document-level + XMP Factur-X. La **sémantique fiscale**95 du XML (Schematron EN16931, business terms, réforme FR 2026) relève du skill96 `isca-nf525-facturation-electronique` — ne pas la dupliquer ici.9798## Mode CODE (audit d'un générateur)99100Pour auditer une codebase qui produit ces formats (ex : un moteur PDF maison, un101exporteur docx), suivre [references/audit-methodology.md](references/audit-methodology.md) :102inventaire des features de la spec → matrice de couverture → génération de fixtures103→ validation des sorties avec les mêmes scripts → table d'écarts priorisée.104105## Obtenir les schémas officiels (validation sémantique forte)106107La validation XSD ECMA-376 et RelaxNG ODF nécessite les schémas officiels (non108redistribués ici). Procédure d'obtention + commandes `xmllint --schema/--relaxng`109dans [references/ooxml.md](references/ooxml.md) et [references/odf.md](references/odf.md).