"""Извлечение текста из PDF файлов через PyMuPDF.""" import logging logger = logging.getLogger(__name__) def extract_text_from_pdf(data: bytes) -> str: """ Извлечь текст из PDF файла. Обрабатывает многостраничные документы. Удаляет лишние переносы строк и пробелы. Args: data: Байты PDF файла Returns: Извлечённый текст Raises: ValueError: Если не удалось открыть PDF """ import fitz # PyMuPDF try: doc = fitz.open(stream=data, filetype="pdf") except Exception as e: raise ValueError(f"Не удалось открыть PDF: {e}") from e texts: list[str] = [] for page_num, page in enumerate(doc): try: page_text = page.get_text("text") if page_text.strip(): texts.append(page_text) except Exception as e: logger.warning(f"Ошибка извлечения текста со страницы {page_num}: {e}") continue doc.close() full_text = "\n".join(texts) # Нормализация: убрать множественные переносы строк import re full_text = re.sub(r"\n{3,}", "\n\n", full_text) full_text = re.sub(r"[ \t]+", " ", full_text) return full_text.strip() def extract_metadata_from_pdf(data: bytes) -> dict: """ Извлечь метаданные из PDF (title, author, subject и т.д.). Args: data: Байты PDF файла Returns: Словарь метаданных """ import fitz try: doc = fitz.open(stream=data, filetype="pdf") metadata = doc.metadata or {} doc.close() return { "title": metadata.get("title", ""), "author": metadata.get("author", ""), "subject": metadata.get("subject", ""), "keywords": metadata.get("keywords", ""), "creator": metadata.get("creator", ""), "pages": doc.page_count if hasattr(doc, "page_count") else 0, } except Exception as e: logger.warning(f"Ошибка извлечения метаданных PDF: {e}") return {}