officeutil.py (analog pdfutil): server-seitige Text-Extraktion, damit das
LLM Inhalte als Text bekommt statt Base64-Blob. Verkabelt in files.read_file,
mail.read_attachment (und notes.read_resource, bereits in e34711d).
Aeltere Binaerformate (.doc/.xls/.ppt) und .rtf bewusst nicht behandelt --
is_office() False -> Fallback auf Rohdaten. requirements-extra: python-pptx.
War bereits deployed und lief (FileTypes-Tests 14 passed), lag aber
uncommittet im Arbeitsverzeichnis; ohne officeutil.py waere ein frischer
Clone seit e34711d kaputt gewesen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XhHNJKk3RsHgUsJ27WQSom
Scan-/bildbasierte PDFs werden jetzt von Files-MCP (read_file) UND Mail-MCP
(read_attachment) ueber das gemeinsame Modul pdfutil.py verarbeitet: Seiten via
PyMuPDF als PNG (150dpi, max 20) + OCR-Text (tesseract deu+eng). Verschluesselte/
kaputte PDFs bleiben graceful. Deps: pymupdf, pytesseract (+ system tesseract-ocr).
76 Tests gruen.
read_file gab bei Scan-PDFs (kein extrahierbarer Text) nur nutzlose Rohbytes
zurueck -> claude.ai konnte sie nicht lesen. Jetzt: PyMuPDF rendert die Seiten
als PNG (150 dpi, max 20 Seiten) -> ImageContent, das LLM liest sie per Vision.
Verschluesselte/kaputte PDFs bleiben graceful. TestFileTypes scanned.pdf -> image.
Produktiv-Fix fuer alle User. Dep: pymupdf (requirements-extra.txt). 76 Tests gruen.