Salta ai contenuti

Creare da HTML un PDF taggato per l'accessibilità

Questa ricetta crea un PDF taggato da HTML semantico. NextPDF genera l’albero della struttura logica, la lingua del catalogo e i marcatori PDF/UA-2. La conformità viene stabilita da un checker. La ricetta segue examples/31-pdfua2-tagged.php.

  • Core installato: composer require nextpdf/core:^3.
  • Un validatore PDF/UA per la verifica. L’esempio usa veraPDF.
  1. Creare il documento.
  2. Chiamare enableTaggedPdf() con un tag di lingua BCP-47 prima di writeHtml(). La pipeline HTML rileva la modalità taggata durante la costruzione del parser e aggancia l’emettitore del contenuto taggato.
  3. Impostare i metadati del documento (titolo, lingua). setLanguage() è idempotente rispetto a enableTaggedPdf().
  4. Scrivere HTML semantico. Il parser associa ciascun elemento di blocco a un elemento di struttura: h1 a H1, p a P, ul/li a L/LI, table a Table/TR/TD.
  5. Salvare e quindi convalidare con un checker PDF/UA.
<?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 expose
a 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";
Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf

L’output contiene un albero della struttura, /MarkInfo << /Marked true >>, la voce /Lang del catalogo e il marcatore XMP pdfuaid:part. Eseguire il checker per confermare che tali elementi siano presenti e coerenti internamente.

  • Ordine delle chiamate. enableTaggedPdf() dopo writeHtml() non tagga retroattivamente il contenuto già scritto. Abilitare prima la modalità taggata.
  • Tag di lingua. Passare ConformancePolicy::strictUa2() come secondo argomento per rifiutare un tag BCP-47 malformato al perimetro dell’API, anziché scartarlo silenziosamente in fase di scrittura.
  • Ri-abilitazione idempotente. Chiamare enableTaggedPdf() due volte aggiorna la lingua senza ricostruire l’albero della struttura già popolato.
  • Tagging manuale. Per i contenuti non HTML, delimitare gli elementi con beginTag() / endTag(). I tipi contenitore (Table, TR, L, LI) diventano elementi di raggruppamento privi di contenuto marcato; i tipi foglia (P, H1H6, TD) ottengono gli MCID.
  • Il supporto non è conformità. NextPDF emette i metadati strutturali richiesti da PDF/UA-2. Espone inoltre un avviso di parità ridotta: ai fini dell’approvazione in produzione, la convalida tramite un oracolo esterno resta responsabilità del chiamante. Eseguire un checker prima di dichiarare che un file è conforme.
DichiarazioneSpecificaClausolareference_id
Il contenuto reale richiede una struttura logica.ISO 14289-2§8.2.2
Gli elementi della struttura seguono un annidamento e un ordine di lettura definiti.ISO 14289-2§8.2.3

Questa ricetta mostra come produrre la struttura taggata a supporto della creazione accessibile. Non dichiara la conformità PDF/UA-2; tale decisione spetta a un checker.