fix(indexer): понятная ошибка, если загруженный "PDF" на самом деле не PDF
Живой репорт: проверка плагиата упала с "Не удалось открыть PDF: code=7: no objects found" — сырая внутренняя ошибка MuPDF. Разобрал файл из MinIO: это HTML-страница (веб-интерфейс роутера D-Link DAP-400P), сохранённая с расширением .pdf — 2049 байт, не PDF вообще. Система корректно отказалась парсить мусор (это не баг пайплайна — реальный битый/не-PDF файл юзера), но сообщение об ошибке было нечитаемым. extract_text_from_pdf теперь проверяет magic-байты (%PDF-) ДО попытки fitz.open() и даёт понятное "Файл повреждён или не является PDF-документом" для этого частого случая; для настоящих PDF с внутренней порчей — прежнее поведение (сырая ошибка MuPDF как detail, для диагностики). 4 юнит-теста (валидный PDF, HTML под видом PDF, пустые байты, битый заголовок PDF). Тестов всего: 122 (было 118). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,12 @@ def extract_text_from_pdf(data: bytes) -> str:
|
||||
"""
|
||||
import fitz # PyMuPDF
|
||||
|
||||
# Частый случай: файл с расширением .pdf, но внутри — HTML/другое (например,
|
||||
# сохранённая веб-страница). Даём понятное сообщение, а не сырую ошибку MuPDF
|
||||
# вида "code=7: no objects found", которая ничего не скажет пользователю.
|
||||
if not data.startswith(b"%PDF-"):
|
||||
raise ValueError("Файл повреждён или не является PDF-документом")
|
||||
|
||||
try:
|
||||
doc = fitz.open(stream=data, filetype="pdf")
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user