# Feature: Textextraktion und OCR Als System möchte ich den Textinhalt jedes Dokuments gewinnen, ohne die Originaldatei jemals zu verändern (DEC-IMMUTABLE-01), damit Suche und Anreicherung auf externem Kontext arbeiten können. ```gherkin Funktionalität: Textextraktion und OCR Szenario: Born-digital-PDF braucht kein OCR Angenommen ein PDF mit maschinenlesbarem Textlayer Wenn die Extract-Stage läuft Dann wird der Text per pdftotext gewonnen Und ein Event "TextExtracted" mit needs_ocr=false wird aufgezeichnet Und die OCR-Stage wird übersprungen Szenario: Gescanntes PDF wird per OCR erschlossen Angenommen ein PDF ohne bzw. mit unzureichendem Textlayer Wenn die OCR-Stage läuft Dann wird der Text per ocrmypdf im Sidecar-Modus gewonnen Und ein Event "OCRCompleted" mit engine "ocrmypdf" wird aufgezeichnet Und es wird kein Ausgabe-PDF erzeugt Szenario: Bilddateien werden immer per OCR erschlossen Angenommen ein importiertes JPG-, PNG- oder HEIC-Bild Wenn die Verarbeitung läuft Dann liefert die Extract-Stage needs_ocr=true Und der Text wird per tesseract direkt aus dem Bild gewonnen Szenario: HEIC wird nur temporär konvertiert Angenommen ein importiertes HEIC-Bild Wenn die OCR-Stage läuft Dann wird für die Erkennung ein temporäres PNG erzeugt Und das temporäre PNG wird nach der Erkennung gelöscht Und die archivierte Datei ist das unveränderte HEIC-Original Szenario: Originaldatei bleibt byte-identisch Angenommen ein Dokument mit bekanntem SHA-256-Hash bei der Aufnahme Wenn das Dokument vollständig verarbeitet und abgelegt wurde Dann ist der SHA-256-Hash der archivierten Datei identisch mit dem Hash bei der Aufnahme Szenario: Korrupte oder passwortgeschützte Datei schlägt endgültig fehl Angenommen eine nicht lesbare oder passwortgeschützte PDF-Datei Wenn Extraktion und OCR fehlschlagen Dann wird ein Event "ProcessingFailed" mit retryable=false aufgezeichnet Und das Dokument hat den Status "failed" mit gesetzter failed_stage ``` ## Traceability | Szenario | Go-Test (Pakete `internal/pdf`, `internal/ocr`, `internal/pipeline`) | |---|---| | Born-digital-PDF braucht kein OCR | `TestExtractStage_TextPDFSkipsOCR` | | Gescanntes PDF wird per OCR erschlossen | `TestOCRStage_ScannedPDFUsesSidecarOnly` | | Bilddateien werden immer per OCR erschlossen | `TestExtractStage_ImageAlwaysNeedsOCR` | | HEIC wird nur temporär konvertiert | `TestOCR_HEICTempConversionIsCleanedUp` | | Originaldatei bleibt byte-identisch | `TestPipeline_OriginalHashUnchangedAfterProcessing` | | Korrupte oder passwortgeschützte Datei schlägt endgültig fehl | `TestPipeline_CorruptPDFFailsNonRetryable` |