Créer un PDF balisé et accessible à partir de HTML
Cette recipe crée un PDF balisé à partir de HTML sémantique. NextPDF génère un arbre de structure logique, renseigne la langue du catalogue et ajoute les marqueurs PDF/UA-2. La conformité est déterminée par un vérificateur. Elle suit examples/31-pdfua2-tagged.php.
Prérequis
Section intitulée « Prérequis »- Core installé :
composer require nextpdf/core:^3. - Un vérificateur PDF/UA pour l’étape de vérification. Cet exemple utilise veraPDF.
- Crée le document.
- Appelle
enableTaggedPdf()avec une étiquette de langue BCP-47 avantwriteHtml(). Le pipeline HTML détecte le mode balisé lorsqu’il construit le parseur et branche l’émetteur de contenu balisé. - Définis les métadonnées du document (titre, langue).
setLanguage()reste idempotent par rapport àenableTaggedPdf(). - Écris du HTML sémantique. Le parseur associe chaque élément de bloc à un élément de structure :
h1àH1,pàP,ul/liàL/LI,tableàTable/TR/TD. - Enregistre, puis valide avec un vérificateur PDF/UA.
Exemple complet
Section intitulée « Exemple complet »<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
// Step 2 — enable tagged mode BEFORE writeHtml(). The lang argument// drives the catalog /Lang entry and the structure tree root language.$doc->enableTaggedPdf(lang: 'en');
// Step 3 — metadata. setLanguage() restates intent; it is idempotent here.$doc->setTitle('Accessible Report');$doc->setLanguage('en');
$doc->addPage();
// Step 4 — semantic HTML. Each block element becomes a StructElem; text// runs are wrapped in BDC/EMC operators with stable MCIDs.$html = <<<'HTML'<h1>Quarterly Accessibility Report</h1><p>This document opts into tagged PDF so assistive technology can exposea meaningful reading order.</p><h2>Findings</h2><ul> <li>Headings carry semantic roles.</li> <li>Lists keep their item structure.</li></ul>HTML;
$doc->writeHtml($html);
$doc->save(__DIR__ . '/accessible.pdf');
echo "Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf\n";Sortie attendue
Section intitulée « Sortie attendue »Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdfLe fichier produit contient un arbre de structure, /MarkInfo << /Marked true >>, l’entrée /Lang du catalogue et le marqueur XMP pdfuaid:part. Exécute le vérificateur pour confirmer qu’ils sont présents et cohérents entre eux.
Cas limites
Section intitulée « Cas limites »- Ordre des appels.
enableTaggedPdf()aprèswriteHtml()ne balise pas a posteriori le contenu déjà écrit. Active d’abord le mode balisé. - Étiquette de langue. Passe
ConformancePolicy::strictUa2()comme deuxième argument pour rejeter une étiquette BCP-47 mal formée à l’entrée de l’API, plutôt que de la supprimer silencieusement au moment de l’écriture. - Réactivation idempotente. Appeler
enableTaggedPdf()deux fois met à jour la langue sans reconstruire l’arbre de structure que tu as déjà rempli. - Balisage manuel. Pour du contenu non-HTML, encadre les éléments avec
beginTag()/endTag(). Les types conteneurs (Table,TR,L,LI) deviennent des éléments de regroupement sans contenu marqué ; les types feuilles (P,H1–H6,TD) reçoivent des MCID. - La prise en charge n’est pas la conformité. NextPDF émet les métadonnées structurelles dont PDF/UA-2 a besoin. Il remonte aussi un avertissement lorsque la parité est dégradée : pour une validation de production, le recours à un oracle externe relève de la responsabilité de l’appelant. Exécute un vérificateur avant d’affirmer qu’un fichier est conforme.
Conformité
Section intitulée « Conformité »| Énoncé | Spécification | Article | reference_id |
|---|---|---|---|
| Le contenu réel requiert une structure logique. | ISO 14289-2 | §8.2.2 | |
| Les éléments de structure suivent un ordre d’imbrication et de lecture défini. | ISO 14289-2 | §8.2.3 |
Cette recipe montre comment produire la structure balisée qui sert de base à la création de documents accessibles. Elle n’affirme pas la conformité PDF/UA-2 ; seul un vérificateur la détermine.