M0: arc42-Konzeptdokument, Gherkin-Anforderungen und OpenAPI-Vertrag
- doc/architecture.md: arc42-Detaildokument mit Mermaid-Diagrammen (Bausteinsicht, Klassendiagramm, Statusmodell, 5 Sequenzdiagramme), Speicherkonzept, DEC-01..19-Entscheidungen mit Trade-offs - doc/requirements/: 7 Features als Gherkin-Szenarien (TDD-Grundlage) mit Traceability-Tabellen Szenario <-> Stdlib-Testname - doc/openapi.yaml: API-Vertrag fuer alle 9 Endpunkte (Quelle der Wahrheit) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
# 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` |
|
||||
Reference in New Issue
Block a user