Zum Inhalt springen

Ein getaggtes PDF aus HTML für Barrierefreiheit erstellen

Dieses Recipe erstellt aus semantischem HTML ein getaggtes PDF. NextPDF gibt einen logischen Strukturbaum, die Catalog-Sprache und die PDF/UA-2-Marker aus. Über die Konformität entscheidet ein Checker. Das Recipe folgt examples/31-pdfua2-tagged.php.

  • Core ist installiert: composer require nextpdf/core:^3.
  • Für den Prüfschritt ist ein PDF/UA-Validator vorhanden. Das Beispiel verwendet veraPDF.
  1. Erstellen Sie das Dokument.
  2. Rufen Sie enableTaggedPdf() mit einem BCP-47-Sprach-Tag vor writeHtml() auf. Die HTML-Pipeline erkennt beim Aufbau des Parsers den getaggten Modus und bindet den Emitter für getaggten Content ein.
  3. Setzen Sie die Dokument-Metadaten (Titel, Sprache). setLanguage() ist idempotent zu enableTaggedPdf().
  4. Schreiben Sie semantisches HTML. Der Parser bildet jedes Block-Element auf ein Strukturelement ab: h1 auf H1, p auf P, ul/li auf L/LI, table auf Table/TR/TD.
  5. Speichern Sie und validieren Sie anschließend mit einem PDF/UA-Checker.
<?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

Die Ausgabe enthält einen Strukturbaum, /MarkInfo << /Marked true >>, den Catalog-Eintrag /Lang und den pdfuaid:part-XMP-Marker. Führen Sie den Checker aus, um zu bestätigen, dass diese vorhanden und in sich konsistent sind.

  • Aufrufreihenfolge. enableTaggedPdf() nach writeHtml() taggt bereits geschriebenen Content nicht nachträglich. Aktivieren Sie zuerst den getaggten Modus.
  • Sprach-Tag. Übergeben Sie ConformancePolicy::strictUa2() als zweites Argument, um ein fehlerhaftes BCP-47-Tag bereits an der API-Grenze abzulehnen, statt es zur Schreibzeit stillschweigend zu verwerfen.
  • Idempotentes erneutes Aktivieren. Ein zweiter Aufruf von enableTaggedPdf() aktualisiert die Sprache, ohne den bereits befüllten Strukturbaum neu aufzubauen.
  • Manuelles Taggen. Umschließen Sie bei Nicht-HTML-Content die Elemente mit beginTag() / endTag(). Container-Typen (Table, TR, L, LI) werden zu Gruppierungselementen ohne markierten Content; Leaf-Typen (P, H1H6, TD) erhalten MCIDs.
  • Unterstützung ist keine Konformität. NextPDF gibt die strukturellen Metadaten aus, die PDF/UA-2 benötigt. Zusätzlich gibt es eine Warnung zu eingeschränkter Parität aus: Für die Produktionsfreigabe liegt die externe Oracle-Validierung in der Verantwortung des Aufrufers. Führen Sie einen Checker aus, bevor Sie erklären, dass eine Datei konform ist.
AussageSpezifikationAbschnittreference_id
Echter Content erfordert eine logische Struktur.ISO 14289-2§8.2.2
Strukturelemente folgen einer definierten Verschachtelung und Lesereihenfolge.ISO 14289-2§8.2.3

Dieses Recipe zeigt, wie Sie die getaggte Struktur erzeugen, die barrierefreies Erstellen unterstützt. Es sichert keine PDF/UA-2-Konformität zu; darüber entscheidet ein Checker.