Conformité PDF/UA-2 : structure balisée émise par NextPDF pour ISO 14289-2
Énoncé de la limite. NextPDF émet la structure balisée qui prend en charge un contenu créé de manière accessible ; il ne déclare pas la conformité PDF/UA-2 : c’est un vérificateur qui en décide.
PDF/UA-2 correspond à ISO 14289-2:2024, le profil d’accessibilité qui s’ajoute au PDF 2.0 balisé. NextPDF Core émet l’arbre de structure, le contenu marqué, la langue du catalogue/de la structure et le marqueur pdfuaid via Document::enableTaggedPdf(). La bibliothèque produit la structure accessible ; un vérificateur PDF/UA (par exemple verapdf --flavour ua2) décide de la conformité. ISO 14289-2 §8.1 présente la conformité comme un ensemble d’exigences de format de fichier qu’un document doit satisfaire, évaluées par un vérificateur, et non comme quelque chose qu’un producteur déclare.
Installation
Section intitulée « Installation »composer require nextpdf/core:^3Le balisage PDF/UA-2 est une fonctionnalité de Core (security.tagged_pdf). Aucun paquet Premium n’est requis pour la structure balisée elle-même.
Vue d’ensemble conceptuelle
Section intitulée « Vue d’ensemble conceptuelle »Document::enableTaggedPdf(string $lang = 'en', ?ConformancePolicy $policy = null) définit ConformanceMode::PdfUa2 et raccorde TaggedContentEmitter. Le mode est la source unique de vérité pour savoir si le document est balisé selon la spécification ; le writer répond ensuite aux obligations structurelles imposées par ISO 14289-2 :
- Le contenu réel est balisé — §8.2.2 : chaque élément de contenu réel (non-artefact) est inclus dans la structure logique ; les artefacts sont marqués comme tels. Cela s’appuie sur la structure PDF balisé du §14.7 d’ISO 32000-2 (
StructTreeRoot, éléments de structure, MCID). - La langue naturelle est déclarée — §8.4.4 : le document et les changements de langue portent un
Lang. AvecConformancePolicy::strictUa2(), une balise BCP-47 mal formée est rejetée à la frontière de l’API (fail-fast), au lieu d’être ignorée silencieusement au moment de l’écriture. - Les figures portent des alternatives — §8.5.1 : chaque élément de structure
Figurepossède une description alternative. - Les tableaux associent en-têtes et données — §8.2.5.26 : l’association entre les cellules header/data d’un tableau est exprimée structurellement.
NextPDF émet ces éléments. Elle n’exécute pas l’évaluation de conformité du §8.1 : c’est le rôle du vérificateur, et la norme le lui réserve.
Surface de l’API
Section intitulée « Surface de l’API »| Méthode | Effet |
|---|---|
enableTaggedPdf(string $lang = 'en', ?ConformancePolicy $policy = null): static | Définit ConformanceMode::PdfUa2, branche TaggedContentEmitter, valide $lang selon la politique. Lève InvalidConfigException lorsque la politique impose la validation de Lang et que $lang est invalide. |
beginTag()/endTag() | Structure manuelle du contenu non-HTML ; les types conteneurs deviennent des éléments de regroupement, les types feuilles reçoivent des MCID. |
ConformanceMode::requiresPdfUa2PageTabs(): bool | Vrai pour PdfUa2 — déclenche l’application de /Tabs /S sur la page. |
Exemple de code — Démarrage rapide
Section intitulée « Exemple de code — Démarrage rapide »<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Conformance\ConformancePolicy;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/accessible.pdf';
$doc = Document::createStandalone();$doc->enableTaggedPdf('en', ConformancePolicy::strictUa2()); // fail-fast Lang$doc->setTitle('Accessible report 2026');$doc->writeHtml('<h1>Quarterly report</h1><p>Body text.</p>' . '<img src="chart.png" alt="Revenue rose 12% quarter on quarter">');$doc->save($out);
echo "Wrote {$out} — validate: verapdf --flavour ua2 {$out}\n";Exemple de code — Production
Section intitulée « Exemple de code — Production »Le gate de production exécute verapdf --flavour ua2 out.pdf et fait échouer le build en cas de violations signalées. Le test d’intégration tests/Integration/Accessibility/VeraPdfUa2GoldenTest.php vérifie que la fixture de référence HTML→PDF balisé passe veraPDF UA-2 (ignoré quand veraPDF est absent). Le verdict du vérificateur constitue le gate ; la sortie de l’émetteur en est l’entrée.
Cas limites & pièges
Section intitulée « Cas limites & pièges »- Active-le d’abord. Appeler
enableTaggedPdf()aprèswriteHtml()ne balise pas rétroactivement le contenu déjà écrit. - Langue stricte. Passe
ConformancePolicy::strictUa2()pour rejeter une balise BCP-47 mal formée à la frontière de l’API, au lieu d’attendre un échec lors de la validation veraPDF a posteriori. - Réactivation idempotente. Un second appel met à jour la langue sans reconstruire un arbre de structure déjà rempli.
- Document balisé vide. Un document balisé vide n’annonce pas PDF/UA-2 (
EmptyTaggedPdfDoesNotAdvertisePdfUa2Test) — le marqueur n’est pas émis pour un document sans contenu réel, si bien que le fichier ne surestime pas sa conformité.
Performance
Section intitulée « Performance »L’émission de l’arbre de structure est proportionnelle au nombre d’éléments. Budget fixé à un temps écoulé ≤ 1500 ms et à un pic ≤ 64 Mo pour un rapport typique.
Notes de sécurité
Section intitulée « Notes de sécurité »Le balisage d’accessibilité est structurel : ce n’est pas un contrôle de sécurité. Il expose la structure logique du document aux technologies d’assistance, par conception ; il n’y a aucune dimension de confidentialité dans l’arbre de balises.
Correspondance PDF/UA-2
Section intitulée « Correspondance PDF/UA-2 »| Obligation PDF/UA-2 | Clause ISO 14289-2 | Émission NextPDF |
|---|---|---|
| Contenu réel balisé dans la structure logique | §8.2.2 | TaggedContentEmitter + StructureTree |
| Langue du document/de la structure déclarée | §8.4.4 | catalogue /Lang, validé via Bcp47Validator |
| Description alternative de figure | §8.5.1 | alt → /Alt sur l’élément Figure |
| Association header/data dans les tableaux | §8.2.5.26 | Structure TR/TH/TD dérivée des tableaux HTML |
Référence croisée balise → ISO 32000-2 §14.9
Section intitulée « Référence croisée balise → ISO 32000-2 §14.9 »PDF/UA-2 s’ajoute au modèle de PDF balisé d’ISO 32000-2. Les éléments de structure que NextPDF émet se résolvent par rapport à la structure logique du §14.7 d’ISO 32000-2 (StructTreeRoot, éléments de structure, MCID) — chunk — ainsi qu’à l’espace de noms de structure standard défini pour PDF 2.0. La table de correspondance des rôles relie les éléments HTML (h1, p, table) aux types de structure standard, afin qu’un vérificateur UA-2 les reconnaisse.
Correspondance WCAG 2.2
Section intitulée « Correspondance WCAG 2.2 »La structure balisée est le socle technique des critères de succès WCAG 2.2 — 1.1.1 (alternatives non textuelles, via la Figure /Alt du §8.5.1), 1.3.1 (information et relations, via l’arbre de structure) et 1.3.2 (séquence significative, via l’ordre de lecture). Émettre la structure est nécessaire, mais pas suffisant pour la conformité WCAG ; c’est un audit d’accessibilité, et non la bibliothèque, qui en décide.
Comportement en mode FIPS
Section intitulée « Comportement en mode FIPS »L’émission PDF/UA-2 n’effectue aucune cryptographie. Le mode FIPS n’a aucun effet sur le chemin d’émission de la structure balisée.
Conformité
Section intitulée « Conformité »| Affirmation | Spécification | Clause | reference_id |
|---|---|---|---|
La version PDF/UA est identifiée par l’espace de noms de schéma pdfuaid (Table 1). | ISO 14289-2 | §5 | |
| La conformité à PDF/UA-2 impose des exigences de format de fichier qu’un document doit satisfaire (un vérificateur évalue la conformité ; le producteur ne la déclare pas). | ISO 14289-2 | §8.1 | |
| Le contenu réel doit être balisé dans la structure logique. | ISO 14289-2 | §8.2.2 | |
| La langue naturelle du document doit être déclarée. | ISO 14289-2 | §8.4.4 | |
| Les éléments Figure requièrent une description alternative. | ISO 14289-2 | §8.5.1 | |
| La structure du tableau doit associer les cellules d’en-tête et de données. | ISO 14289-2 | §8.2.5.26 | |
| La structure accessible repose sur la structure logique de PDF balisé d’ISO 32000-2. | ISO 32000-2 | §14.7.2 |
Les citations sont des pointeurs clause-id + reference_id vers le corpus de vérification. Aucun texte normatif n’est reproduit.