Der Auftrag war eine Architekturfrage. Für einen Kunden sollte das Rechnungsportal neu aufgestellt werden, tragfähig für die kommenden Jahre. Erst bei der Umsetzung der Architektur trat eine Anforderung zutage, die in keinem der Konzeptpapiere stand: Die Rechnungen, die dieses Portal ausliefert, müssen barrierefrei sein. Das Muster ist bekannt. Pflichten dieser Art stehen selten im Fachkonzept, sie werden sichtbar, sobald gebaut wird.
Der Blick auf den Markt fiel ernüchternd aus. Die verfügbaren kommerziellen Werkzeuge waren entweder so teuer, dass die Lizenzkosten bei den Mengen eines Rechnungsarchivs jede Kalkulation gesprengt hätten, oder so langsam, dass ein Stapellauf über den Bestand in kein Wartungsfenster gepasst hätte. Eine Anforderung, die sich weder finanzieren noch terminieren lässt, bleibt in Programmen liegen, bis jemand von außen nachfragt.
Also ist die fehlende Antwort im Mandat selbst entstanden. Sie heißt accessipdf, steht unter der MIT-Lizenz auf GitHub und ist produktiv gelaufen.
Befund und Rechtslage
Wer eine Rechnung aus einem beliebigen Archiv von einem Screenreader vorlesen lässt, bekommt in aller Regel Unbrauchbares zu hören. Es fehlen Überschriften, an denen sich die Navigation orientieren könnte. Hinter den Zeichencodes steht häufig kein Buchstabe, der sich aussprechen ließe. Und die Schriften, die das Dokument verwendet, sind nicht darin eingebettet. Am Bildschirm ist von alledem nichts zu erkennen. Das Dokument sieht korrekt aus und ist für die Ausgabe über Hilfsmittel wertlos.
Der European Accessibility Act und seine deutsche Umsetzung, das Barrierefreiheitsstärkungsgesetz, gelten seit dem 28. Juni 2025. In den Vereinigten Staaten besteht mit Section 508 eine vergleichbare Pflicht seit erheblich längerer Zeit. Die Fristen haben den technischen Standard nicht verschärft. Verändert hat sich, wie angreifbar ein Unternehmen ist, das Dokumente an Verbraucher ausliefert. Ein Dokument, das ein Portal heute zustellt, muss heute für seinen Empfänger nutzbar sein.
Warum Neuerzeugung ausfällt
Den Bestand neu zu erzeugen, kommt in den meisten Fällen nicht in Betracht. Das erzeugende System ist abgelöst oder weiterentwickelt, und die Freigabe des Layouts liegt bei Personen, die das Unternehmen längst verlassen haben. Selbst dort, wo eine Neuerzeugung technisch möglich wäre, ist sie das falsche Mittel. Gefordert ist eine zusätzliche, unsichtbare Strukturebene im vorhandenen Dokument. Eine Neuausgabe dagegen erzeugt ein zweites Dokument zu einem Vorgang, den der Empfänger bereits abgelegt hat und im Zweifel gegen seine Buchhaltung hält.
Daraus folgt eine Bedingung, die vor der ersten Zeile Code festgeschrieben wurde. Das Original bleibt unangetastet, und die Ausgabe muss dem Original pixelgenau entsprechen. Was eine Zeile verschiebt oder eine Glyphe unterdrückt, erzeugt ein abweichendes Dokument, und ein abweichendes Dokument ist in einem Rechnungsprozess ein neuer Sachverhalt.
Fünf Stufen
Die Verarbeitung läuft je Datei in fünf Stufen ab.
Zunächst liest accessipdf die Content-Streams, verfolgt den Grafikzustand und ermittelt jeden Textoperator mit Position und dekodiertem Text. Dafür arbeiten pikepdf und pypdfium2 zusammen.
In der zweiten Stufe gleicht das Programm die Datei über Ankertexte gegen die hinterlegten Layoutvorlagen im YAML-Format ab. Trifft keine Vorlage zu, wandert die Datei in die Quarantäne, zusammen mit einem maschinenlesbaren Bericht. Eine heuristische Notlösung gibt es nicht, das Programm meldet stattdessen, dass es diese Datei nicht kennt.
Die dritte Stufe leitet aus der Vorlage die Rollen der Zonen ab: Überschriften, Absätze und echte Tabellen mit Kopfzellen, auch über Seitengrenzen hinweg. Dekorative Bestandteile werden als Artefakt gekennzeichnet, die Lesereihenfolge ergibt sich aus der Reihenfolge der Zonen.
In der vierten Stufe schreibt das Werkzeug die Content-Streams neu. Der Inhalt wird über BDC/EMC samt MCID ausgezeichnet, der Strukturbaum entsteht, Sprache, Titel und die XMP-Kennung für PDF/UA werden gesetzt. Im selben Durchgang folgt die Schriftreparatur. Fehlende ToUnicode-Tabellen werden erzeugt, für referenzierte, aber nicht eingebettete Standardschriften kommen metrikkompatible Schnitte der Liberation-Familie in die Datei, wobei die Auszeichnung erhalten bleibt, die CIDToGIDMap wird korrigiert und defekte CIDSets werden entfernt.
Die fünfte Stufe übergibt das Ergebnis an veraPDF, den frei verfügbaren Prüfer für PDF/UA. Fehlerfreie Dateien wandern atomar in das Ausgabeverzeichnis, beanstandete zusammen mit dem vollständigen Regelbericht in die Quarantäne. Eine Ausgabe, die diese Prüfung nicht durchlaufen hat, kann es nicht geben.
Wiederholte Läufe sind über ein SHA-256-Register idempotent. Die eigentliche Verarbeitung benötigt 0,1 bis 0,15 Sekunden je Rechnung. Der Start der Java-Laufzeitumgebung für den veraPDF-Aufruf kostet weitere 0,7 Sekunden und bestimmt damit die Laufzeit. An dieser Stelle wurde aus dem Kostenproblem eine Rechenaufgabe, die sich einem Betriebsleiter vorlegen lässt.
Vorlagen statt Raten
Hier fällt die eigentliche Entscheidung des Verfahrens, und sie ist unbequem. Ein automatischer Tagger nimmt jedes PDF entgegen und leitet die Struktur heuristisch ab. Er liefert stets ein Ergebnis, dessen Qualität sich vorher nicht bestimmen lässt. accessipdf verarbeitet ausschließlich Layouts, für die eine Vorlage hinterlegt ist.
Eine Vorlage ist eine YAML-Datei mit Ankertexten zur Erkennung, Zonen in Seitenkoordinaten und den zugehörigen Rollen. Die Reihenfolge der Zonen bestimmt die Lesereihenfolge. Eine Tabellenzone greift nur auf den Seiten, auf denen ihre Kopfanker tatsächlich vorkommen. Die Datei ist lesbar, im Review prüfbar und begründet änderbar, und sie liefert bei gleicher Eingabe stets dasselbe Ergebnis.
Das ist ein Tausch: Abdeckung gegen Nachvollziehbarkeit. Für gleichförmige Massendokumente aus einem Vorlagensystem ist er vorteilhaft. Wer hunderttausend Rechnungen desselben Layouts ausliefert, benötigt keine Vielseitigkeit, sondern eine Aussage, die vor einem Prüfer Bestand hat.
Hinzu kommt ein Gesichtspunkt, der in der technischen Bewertung selten auftaucht und in der Vorstandsvorlage entscheidend ist. Ein heuristisch erzeugtes Ergebnis lässt sich weder begründen noch reproduzieren. Eine Vorlage lässt sich vorlegen. Es ist derselbe Grundsatz, der auch Souprise zugrunde liegt: im Zweifel keine Auskunft statt einer plausiblen Erfindung.
Drei kompromisslose Messkriterien
Die Kriterien standen fest, bevor Code entstand, und sie wurden nachträglich nicht angepasst.
Erstens muss veraPDF je Datei null Fehler gegen das Profil PDF/UA-1 melden.
Zweitens wird jede Seite vor und nach der Verarbeitung gerendert und Pixel für Pixel verglichen. Zugelassen ist eine einzige Abweichung, nämlich das Antialiasing an den Glyphenrändern nach einer Schrifteinbettung. Auch sie muss eine Erosionsmaske mit 9×9-Kernel überstehen, die belegt, dass die Differenz keine zusammenhängende Fläche enthält.
Drittens darf keine Zeile zuvor extrahierbaren Textes verlorengehen. Eine Verbesserung ist zulässig und tritt regelmäßig ein, weil die erzeugten ToUnicode-Tabellen eine zuvor fehlerhafte Textentnahme instand setzen. Genau darauf zielt PDF/UA.
Die Testsuite erzeugt ihr Prüfstück selbst: eine synthetische Rechnung ohne Auszeichnung, ohne ToUnicode, mit den referenzierten, aber nicht eingebetteten Schriften Helvetica und Helvetica-Bold. Sie durchläuft die vollständige Kette einschließlich der veraPDF-Prüfung.
Im Mandat verarbeitete die Engine echte Telekommunikationsrechnungen aus zwei Layoutfamilien. 13 von 13 Dateien erfüllten alle drei Kriterien. Die Dokumente enthalten Kundendaten und liegen deshalb nicht im Repository.
Ein fehlerfreier Maschinenbefund ersetzt allerdings keine fachliche Abnahme. Bevor eine Vorlage in Produktion geht, gehört ein manueller Durchgang dazu, mit einem Prüfwerkzeug wie PAC 2024 und einem Screenreader. Ein Regelprüfer prüft Regeln. Ob ein Mensch dem Dokument folgen kann, beantwortet er nicht.
Wirkung im Betrieb
Für den Betreiber eines Rechnungsportals verschiebt das Verfahren drei Größen.
Die Kosten hängen nicht länger an einer Lizenz je Dokument, sondern an der einmaligen Arbeit, die Layouts zu vermessen. Im beschriebenen Mandat genügten zwei Vorlagen für den gesamten Rechnungslauf. Da Massendokumente aus einem Vorlagensystem stammen, ist die Zahl der Layoutfamilien in der Praxis klein.
Der Durchsatz wird planbar. Bei einem Zehntel einer Sekunde je Dokument im Kern ist ein Lauf über den Bestand eine Frage von Stunden und paralleler Prozesse, nicht von Monaten.
Und die Nachweisführung ändert ihren Charakter. Am Ende steht je Datei ein Prüfbericht eines unabhängigen, frei verfügbaren Prüfers. Das ist etwas anderes als die Zusicherung eines Herstellers, und im Streitfall ist es genau die Unterlage, die vorgelegt wird.
Der Weg dorthin führt selten über einen Werkzeugkauf. Er beginnt bei der Frage, welche Dokumente ein Portal ausliefert, welches System sie erzeugt und an welcher Stelle der Verarbeitungsstrecke sich die fehlende Strukturebene am günstigsten einziehen lässt. Diese Frage war im Mandat zu beantworten. Die Software ist deren Ergebnis, nicht ihr Ausgangspunkt.
Installation und Test
Voraussetzung sind Python 3.12 oder neuer sowie die veraPDF-CLI im Suchpfad. Das Repository enthält eine Demo-Rechnung, die absichtlich unzugänglich aufgebaut ist.
git clone https://github.com/mkupermann/accessipdf
cd accessipdf
make setup
.venv/bin/python -m accessipdf.demo demo_invoice.pdf
.venv/bin/accessipdf check demo_invoice.pdf # FAIL
.venv/bin/accessipdf identify demo_invoice.pdf # Layout: acme-demo
.venv/bin/accessipdf convert demo_invoice.pdf out/
.venv/bin/accessipdf check out/demo_invoice.pdf # PASS, PDF/UA-1
convert endet mit dem Rückgabewert 0, wenn alle Dateien fehlerfrei waren, mit 1, sobald mindestens eine Datei in der Quarantäne gelandet ist, und mit 2 bei einem harten Fehler. Damit lässt sich der Aufruf ohne Zusatzaufwand in einen Stapellauf einbinden.
Der Quelltext steht unter der MIT-Lizenz auf GitHub. Ein kommerzielles SDK ist nicht beteiligt. Die mitgelieferten Liberation-Schriften unterliegen der SIL Open Font License, veraPDF wird als externes Werkzeug aufgerufen.
Das fertige Dokument sieht aus wie zuvor. Der Unterschied erschließt sich erst dem, der es sich vorlesen lässt.