# Kontrollierter PDF-Test zu Topic 037 Die drei PDFs zeigen denselben **fiktiven Redaktionsablauf**. Die Inhalte sind erfunden; die hier aufgeführten Datei-, Extraktions- und HTTP-Eigenschaften wurden am **15. September 2026 tatsächlich lokal gemessen**. Keine Kundenunterlagen, Produktkonten oder externen APIs wurden verwendet. ## Dateien und bewusste Unterschiede | Variante | PDF | Konstruktion | | --- | --- | --- | | A | `output/pdf/a-text-pdf.pdf` | Digitale Text-PDF; vier Schrittblöcke in der Reihenfolge 1, 2, 3, 4 gezeichnet; `/Lang` ist `de-DE`. | | B | `output/pdf/b-image-only-pdf.pdf` | Ein PNG-Raster der kompletten Seite A als einziges Seitenbild. Keine Textebene, keine OCR; `/Lang` bewusst nicht gesetzt. | | C | `output/pdf/c-reversed-stream-pdf.pdf` | Dieselben sichtbaren Textpositionen wie A; die vier Blöcke werden im Inhaltsstrom jedoch in der Reihenfolge 4, 3, 2, 1 gezeichnet; `/Lang` ist `de-DE`. | Alle PDFs sind Einseiter im A4-Format. Es wurden **keine Struktur-Tags** hinzugefügt. `/StructTreeRoot` und `/MarkInfo` fehlen in allen drei Dateien. Das sind bewusst einfache Prüffälle, keine als barrierefrei angebotenen Dokumentvorlagen. Die Marker lauten `SCHRITT 1`, `SCHRITT 2`, `SCHRITT 3`, `SCHRITT 4`. Die zugehörigen Überschriften sind „Ziel klären“, „Entwurf schreiben“, „Aussagen prüfen“ und „Freigabe dokumentieren“. Auf allen sichtbaren Seiten stehen sie von oben nach unten in dieser Reihenfolge. ## Tatsächlich beobachtete Extraktion Die Modi werden getrennt ausgewertet; die erwartete sichtbare Reihenfolge wird nicht als erwartetes Ergebnis eines Extraktors erzwungen. | Werkzeug und Modus | A | B | C | | --- | --- | --- | --- | | pypdf 6.10.0, Standard (`extract_text()`) | 1, 2, 3, 4 | kein Textmarker | 4, 3, 2, 1 | | pypdf 6.10.0, `extraction_mode="layout"` | 1, 2, 3, 4 | kein Textmarker | 1, 2, 3, 4 | | pdfplumber 0.11.9, Standard | 1, 2, 3, 4 | kein Textmarker | 1, 2, 3, 4 | | Poppler pdftotext 26.05.0, Standard | 1, 2, 3, 4 | kein Textmarker | 1, 2, 3, 4 | | Poppler pdftotext 26.05.0, `-raw` | 1, 2, 3, 4 | kein Textmarker | 4, 3, 2, 1 | pdfplumber zählt auf A und C jeweils 613 PDF-Textzeichen und kein Bild. Auf B zählt es **0 Textzeichen und genau 1 Bild**. Die Extraktoren liefern bei B keinen Inhaltstext; ein eventuell verbleibendes Seitenendezeichen in einer Textdatei ist keine Textebene. Es wurde kein OCR-Verfahren auf B angewendet. Daraus folgt keine Aussage darüber, was ein zusätzliches OCR-Verfahren erkennen könnte. Die Metadaten enthalten in allen Varianten einen Titel, einen Autorhinweis auf das kontrollierte Beispiel sowie Erzeugungswerkzeug und Datum. Auch B besitzt solche Metadaten, obwohl auf der Seite keine Textobjekte liegen. Metadaten sind deshalb separat vom ausgelesenen Seiteninhalt dokumentiert. ## Rendering und visuelle Kontrolle Alle drei PDFs wurden mit **Poppler pdftoppm 26.05.0 bei 144 dpi** zu PNGs gerendert. Jede Aufnahme ist 1191 × 1684 Pixel groß. Die drei PNGs wurden einzeln zur visuellen Kontrolle geöffnet. Überschrift, alle vier Schritte, Fiktionshinweis, Fußnoten und Seitenzahl sind vollständig lesbar; keine abgeschnittenen Zeilen, Überlagerungen oder fehlenden Zeichen wurden gesehen. Der zusätzliche Pixelvergleich meldet für diesen konkreten Renderer und diese Auflösung identische Pixel zwischen A/B und A/C. Das illustriert den Testaufbau; es ist keine Garantie identischer Darstellung in jedem PDF-Viewer. Die unterschiedliche Textauslese bleibt trotz dieser identischen Rasterdarstellung bestehen. ## Tatsächlich beobachtete HTTP-Antworten Das Skript startete einen eigenen Server ausschließlich auf `127.0.0.1` mit zufällig gewähltem Port. Beim dokumentierten Lauf war die Origin `http://127.0.0.1:64792`. Nach drei GET-Anfragen wurde der Server wieder beendet. Der HTTP-Client verwendet weder einen Proxy noch Kontozugangsdaten. Der User-Agent lautet `Transparion-Local-PDF-Evidence/1.0 (not a crawler)`. | Pfad | Status | Content-Type | X-Robots-Tag | Beobachtung | | --- | --- | --- | --- | --- | | `/text.pdf` | 200 | `application/pdf` | nicht vorhanden | 2759 Bytes, PDF-Signatur vorhanden. | | `/text-noindex.pdf` | 200 | `application/pdf` | `noindex` | Exakt dieselben 2759 PDF-Bytes und derselbe SHA-256-Hash wie bei `/text.pdf`. | | `/missing.pdf` | 404 | `text/plain; charset=utf-8` | nicht vorhanden | 18 Bytes Fehlermeldung, keine PDF-Signatur. | Der `noindex`-Versuch belegt nur den tatsächlich ausgelieferten Header. Keine Suchmaschine hat diesen lokalen Endpunkt abgerufen, und es wurde keine Indexierungswirkung gemessen. Ein fehlender `X-Robots-Tag` in der ersten Antwort ist ebenfalls kein Beleg dafür, dass eine Suchmaschine die Datei indexiert. ## Messbedingungen und Belege - Laufbeginn: `2026-09-15T07:05:47.117974+00:00` / 09:05:47 Europe/Berlin. - Laufende: `2026-09-15T07:06:02.452790+00:00` / 09:06:02 Europe/Berlin. - Python 3.12.14, ReportLab 4.4.9, pypdf 6.10.0, pdfplumber 0.11.9. - Native Poppler-Werkzeuge `pdftoppm`, `pdftotext` und `pdfinfo`, jeweils 26.05.0. Die öffentliche Kopie von results.json nennt aus Datenschutzgründen Binary-Namen statt benutzerspezifischer absoluter Werkzeugpfade; alle Messwerte bleiben unverändert. - Schrift: PDF-Standardschrift Helvetica. Keine Webfonts oder anderen externen Ressourcen. - `results.json`: vollständig gemessene Extraktionen, Zeichen- und Bildzahlen, Metadaten, Dokumentensprache, Strukturfelder, Datei-Hashes, HTTP-Header einschließlich Datum, tatsächliche Anfragen, Werkzeugversionen und Pixelvergleich. - `text/`: fünf unveränderte Textextrakte pro PDF; Dateinamen enthalten Variante und Extraktionsmodus. - `tool-output/`: originale `pdfinfo`-Ausgaben und Fehlerausgaben von `pdftotext`. - `renders/`: die drei tatsächlich geprüften PNG-Renderings. - `run_pdf_audit.py`: vollständiger portabler Aufbau und Messlauf. Die fünf technischen Integritäts-/HTTP-Prüfungen sind bestanden. Die Extraktionsresultate werden ergebnisoffen protokolliert. ## Reproduzieren Voraussetzungen sind Python ab 3.10, die folgenden Pakete sowie Poppler. In einem separat entpackten Belegordner: ```bash python3 -m pip install reportlab==4.4.9 pypdf==6.10.0 pdfplumber==0.11.9 pillow python3 run_pdf_audit.py ``` Poppler kann beispielsweise unter macOS mit `brew install poppler` oder unter Debian/Ubuntu mit `sudo apt-get install poppler-utils` bereitgestellt werden. Diese Installationsschritte benötigen eine Paketquelle; **der eigentliche Messlauf kontaktiert ausschließlich seinen eigenen lokalen HTTP-Server**. Wenn mehrere Werkzeugversionen installiert sind, lassen sich die Pfade ausdrücklich setzen: ```bash PDFTOPPM=/pfad/zu/pdftoppm PDFTOTEXT=/pfad/zu/pdftotext PDFINFO=/pfad/zu/pdfinfo python3 run_pdf_audit.py ``` Ohne Pfadvorgaben sucht das Skript zunächst im PATH und danach im bekannten gebündelten Codex-Runtime-Verzeichnis. Im dokumentierten Lauf wurden die drei nativen Poppler-Binaries ausdrücklich ausgewählt. Es waren keine Paketinstallationen notwendig. Der Lauf überschreibt PDFs, Renderings, Textextrakte und `results.json` in seinem eigenen Ordner. Bewahren Sie für einen Vergleich zuerst eine Kopie der dokumentierten Belege auf. Nach einer Wiederholung gelten deren neues Datum, neue PDF-Hashes und tatsächlich protokollierte Werkzeugversionen. Die visuelle Kontrolle muss anschließend erneut erfolgen; das Skript markiert sie bis dahin als ausstehend. ## Aussagegrenzen Dies ist ein kontrollierter Funktionstest mit drei selbst erzeugten Dateien. Er ist weder eine repräsentative Untersuchung produktiver PDFs noch ein Test von Googlebot, KI-Crawlern oder Screenreadern. Eine Abweichung zwischen Extraktoren ist **keine simulierte Screenreader-Lesereihenfolge**. Dokumentensprache, Tags und Textextraktion allein erlauben keine Aussage über PDF/UA-, WCAG- oder sonstige Barrierefreiheitskonformität. Ebenso belegt eine erfolgreiche Auslese oder ein HTTP-Status 200 weder Indexierung noch Ranking oder tatsächliche Zitate in KI-Antworten.