| """Tesseract OCR wrapper — magyar+angol+német (HU+EN+DE) nyelvi modellek. |
| |
| A pdf_loader 3-szintű fallback-jénél a 2. réteg: ha a PyMuPDF natív szöveg |
| < SCANNED_THRESHOLD karakter, akkor az oldal-renderelt képet átadjuk a |
| Tesseract-nak. Ha az OCR még mindig kevés szöveget ad, az oldal `is_scanned=True` |
| marad és a PageContent `image_bytes`-szal tölt fel — a vision-extract node majd |
| közvetlenül a képből nyer ki strukturált adatot. |
| |
| Lazy-importáljuk a pytesseract és Pillow-t, hogy a Fázis 1 dummy-csak smoke |
| teszt NE igényelje a tesseract-rendszerszintű telepítést. |
| """ |
|
|
| from __future__ import annotations |
|
|
| |
| SCANNED_THRESHOLD = 50 |
|
|
| |
| TESSERACT_LANGS = "hun+eng+deu" |
|
|
|
|
| def tesseract_available() -> bool: |
| """Visszaadja, hogy a pytesseract + tesseract-binary működik-e. |
| |
| Lazy-import: ha a package nincs telepítve vagy a tesseract binary nem érhető |
| el, False-t ad vissza, és a downstream PDF loader skip-eli az OCR réteget. |
| """ |
| try: |
| import pytesseract |
| pytesseract.get_tesseract_version() |
| return True |
| except Exception: |
| return False |
|
|
|
|
| def ocr_image_bytes(image_bytes: bytes, langs: str = TESSERACT_LANGS) -> str: |
| """Bináris kép → szöveg Tesseract OCR-rel. |
| |
| Hibák esetén (Tesseract hiányzik, kép-formátum nem támogatott) üres stringet |
| ad vissza — a PageContent `image_bytes` mezője megmarad, a downstream |
| vision-fallback fogja a feladatot átvenni. |
| """ |
| if not image_bytes: |
| return "" |
|
|
| try: |
| from io import BytesIO |
|
|
| import pytesseract |
| from PIL import Image |
|
|
| with Image.open(BytesIO(image_bytes)) as img: |
| |
| if img.mode != "RGB": |
| img = img.convert("RGB") |
| return pytesseract.image_to_string(img, lang=langs).strip() |
| except Exception: |
| return "" |
|
|