Barrierefreiheit / getaggtes PDF
Was ist tagged PDF?
Tagged PDF ist eine Erweiterung der PDF Datei um eine logische Struktur der Inhalte. Mit den Tags wird bestimmt, was das auszugebende Objekt für eine Rolle hat, z.B. Überschrift der Ebene 1, ein Absatz oder eine Abbildung. Das dient hauptsächlich dazu, barrierefreie PDFs zu erzeugen, also PDFs die für Screenreader oder ähnliche Ausgabegeräte optimiert sind.
Für barrierefreie PDFs muss man nicht nur die technische Seite beachten (dafür ist der speedata Publisher da), sondern auch die logische Struktur sinnvoll erzeugen. Beispielsweise müssen Bilder mit einem alternativen Text ausgegeben werden, sonst ist die Nutzung eingeschränkt.
Beispiel
Im folgenden Beispiel wird das Dokument nicht weiter unterteilt. Es wird eine Überschrift (H1) und ein Bild (Figure) ausgegeben.
<Layout xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<PDFOptions format="PDF/UA" />
<StructureElement role="Document" id="doc" />
<Record element="data">
<PlaceObject>
<Textblock>
<Bookmark level="1" select="'My image collection'"/>
<Paragraph role="H1" parent="doc">
<Value>My image collection</Value>
</Paragraph>
</Textblock>
</PlaceObject>
<PlaceObject>
<Image parent="doc"
description="an ocean"
file="ocean.pdf"
width="4cm" />
</PlaceObject>
</Record>
</Layout>
Hierarchische Struktur
Als Voreinstellung ist die Rolle »Document« definiert mit der ID doc. Dies entspricht der folgenden Struktur:
<StructureElement role="Document" id="doc" />
Um weitergehende Strukturen zu definieren, gibt es zwei Möglichkeiten. Entweder werden diese geschachtelt definiert (beide Beispiele definieren die identische Struktur):
<StructureElement role="Document">
<StructureElement role="Art">
<StructureElement role="Sect" id="sect1a1"/>
<StructureElement role="Sect" id="sect2a1"/>
</StructureElement>
<StructureElement role="Art">
<StructureElement role="Sect" id="sect1a2"/>
<StructureElement role="Sect" id="sect2a2"/>
</StructureElement>
</StructureElement>
oder man nutzt das parent-Attribut:
<StructureElement role="Document" id="doc" />
<StructureElement role="Art" id="art1" parent="doc" />
<StructureElement role="Art" id="art2" parent="doc" />
<StructureElement role="Sect" id="sect1a1" parent="art1"/>
<StructureElement role="Sect" id="sect2a1" parent="art1"/>
<StructureElement role="Sect" id="sect1a2" parent="art2"/>
<StructureElement role="Sect" id="sect2a2" parent="art2"/>
Das erlaubt die dynamische Strukturierung des Dokuments aufgrund der Daten.
Das Attribut id ist notwendig, um bei Absätzen (Paragraph) und Bildern die Elternstruktur vorzugeben. Im Beispiel oben werden beide Elemente im Abschnitt Sect ausgegeben.
Rollen (Tagnamen)
Folgende Rollennamen (Tags) sind im speedata Publisher definiert. Weitere werden auf Wunsch eingebaut:
Art, Artifact, Div, Document, Figure, H1, H2, H3, H4, H5, H6, Lbl, Link, P, Part, Sect, Span, Table, TD, TH, TOC, TOCI, TR.
Reihenfolge der Strukturelemente
Die hierarchische Struktur wird in der Reihenfolge aufgebaut, wie sie auch im Publisher ausgegeben werden. D.h. zuerst ausgegebene Objekte erscheinen höher in der Struktur. Möchte man aber beispielsweise eine H1 Überschrift erst nach anderen Objekten ausgeben, so erscheint sie in der Dokumentstruktur weiter unten. Um die Reihenfolge zu ändern, kann man bei dem Befehl die Position angeben (Attribut structpos). Die Angabe top (oder äquivalent 1) fügt den Absatz an die erste Stelle in der Struktur ein, unterhalb der angegebenen Eltern-ID (section im Beispiel unten). Alternativ kann auch eine andere Position angegeben werden, die aber kleiner sein muss als die Anzahl der aktuellen Kindelemente.
»Unwichtige« Texte und Bilder
Texte und Bilder, die nicht in der Hierarchie auftreten sollen, können als Artifact (Rolle) markiert werden.
Sprache
Bildschirmlesegeräte wählen die Stimme nach der Sprache des Textes. Die Hauptsprache des Layouts (<Options mainlanguage="...">) wird zur Sprache des Dokuments. Ein Absatz in einer anderen Sprache bekommt seine Sprache mit dem Attribut language, zum Beispiel <Paragraph role="P" language="Arabic">; im PDF/UA-Modus schreibt der Publisher sie in das Strukturelement des Absatzes. Als Hauptsprache eignet sich die Sprache des größten Teils des Textes, die übrigen Teile werden ausgezeichnet. Das hält auch das PDF kleiner, weil nur Text in einer anderen Sprache als der Hauptsprache eine Sprachangabe braucht.
Alternativ-Texte und Bildbeschreibungen
Bilder sollten mit einer Beschreibung versehen werden, damit diese in der Hierarchie anstelle des Bildes erscheint. Bei Absätzen ist es auch möglich, den »echten Text« (actual text) einzufügen. Dieser wird in der Hierarchie anstelle des Textes innerhalb von <Value> angezeigt.
Aus dem Beispiele-Repository
Dieses Layout ist auch im Beispiele-Repository zu finden und erstellt ein PDF/UA konformes PDF, das den Ansprüchen für die Barrierefreiheit genügt. Unterhalb der obersten Ebene Document gibt es einen Abschnitt Sect, das eine Überschrift, einen Absatz ohne Besonderheiten und einen Absatz mit einem Hyperlink sowie eine Abbildung enthält.
(Aufruf mit sp --dummy, da hier auf variable Daten verzichtet wird.)
<Layout xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<PDFOptions format="PDF/UA" />
<StructureElement role="Document">
<StructureElement role="Sect" id="section" />
</StructureElement>
<Record element="data">
<PlaceObject>
<Textblock>
<Paragraph role="H1" parent="section">
<B>
<Value>A very short story</Value>
</B>
</Paragraph>
<Paragraph role="P" parent="section">
<Value>Once upon a time....</Value>
</Paragraph>
<Paragraph role="P" parent="section">
<Value>This is a </Value>
<A href="https://www.speedata.de"
description="link to speedata.de">
<Value>link to speedata.de</Value>
</A>
<Value>.</Value>
</Paragraph>
</Textblock>
</PlaceObject>
<PlaceObject>
<Image
width="8"
file="ocean.pdf"
parent="section"
description="An image of an ocean" />
</PlaceObject>
</Record>
</Layout>
Die Ausgabe aus dem Layout oben ist wie erwartet.
Mit verschiedenen Werkzeugen kann man prüfen, wie die Struktur des Dokuments aufgebaut ist:
Mit pdfuaanalyze kann man sich die Struktur als XML-Baum ausgeben lassen.
<Document>
<Sect>
<H1></H1>
<P></P>
<P>
<Link></Link>
</P>
<Figure></Figure>
</Sect>
</Document>
Der speedata Publisher kann den Strukturbaum auch als XML-Datei ausgeben. Dazu wird der Befehl Trace mit dem Attribut dump-structtree verwendet (alle Trace-Schalter listet das Kapitel Fehlerbehebung / Debugging auf):
<Trace dump-structtree="yes" />
Damit wird die Datei publisher-struct.xml geschrieben, die den Strukturbaum des PDF-Dokuments enthält. Das ist nützlich zum Debuggen und für automatisierte Tests der Dokumentstruktur.
Leerzeichen zwischen Wörtern
Im PDF ist der Abstand zwischen zwei Wörtern nur eine Lücke und kein Zeichen. Programme, die den Text auslesen (Bildschirmlesegeräte, Kopieren und Einfügen, Suche), müssen raten, wo ein Wort endet, und manche ziehen die Wörter zusammen. Im PDF/UA-Modus setzt der Publisher deshalb in jeden Wortabstand ein unsichtbares Leerzeichen. Das Layout ändert sich dadurch nicht. Mit <PDFOptions interwordspace="yes"> lässt sich das auch für andere PDFs einschalten, mit interwordspace="no" ausschalten.
Lesereihenfolge von Wörtern
In manchen Schriften stehen die Glyphen eines Wortes im PDF nicht in Lesereihenfolge: in Schriften von rechts nach links wie Arabisch und Hebräisch und in indischen Schriften, in denen manche Vokalzeichen vor dem Konsonanten stehen, dem sie im Text folgen. Programme, die den Text auslesen, erhalten die Zeichen solcher Wörter dann in falscher Reihenfolge. Im PDF/UA-Modus speichert der Publisher den Text dieser Wörter deshalb zusätzlich in Lesereihenfolge (als ActualText), zusammen mit ihrer Sprache, wenn sie von der Sprache des Dokuments abweicht. Wörter in lateinischer, griechischer oder kyrillischer Schrift sind nicht betroffen. Das Layout ändert sich nicht, das PDF wird aber größer, bei einem vollständig vokalisierten arabischen Text um etwa ein Drittel. Mit <PDFOptions logicaltextorder="yes"> lässt sich das auch für andere PDFs einschalten, mit logicaltextorder="no" ausschalten.
Nicht alle Programme werten diese Angabe gleich aus. Manche Programme, die keinen Text von rechts nach links unterstützen, geben die Wörter dieser Schriften in umgekehrter Reihenfolge aus.
Überprüfen des Dokuments
Um die Barrierefreiheit zu überprüfen, bieten sich folgende Programme an:
- PAC (PDF accessibility checker)
- Adobe Acrobat
- Vera PDF
- pdfuaanalyze gibt die Struktur des PDFs als XML-Baum aus
Bekannte Einschränkungen
Die aktuellen Probleme können auf GitHub angesehen werden.