""" =============================================================================== FILE: services/office/service.py PROJECT: SCUD Orion AI (Office Domain) ROLE: Единый фасад офисного модуля для вызова из API и фоновых задач. =============================================================================== """ import os import uuid import logging from typing import Dict, Any from config import BASE_DIR from .document_extractor import process_pdf_full from .word_builder import build_docx_from_ocr logger = logging.getLogger("OFFICE_SERVICE") OFFICE_OUTPUT_DIR = os.path.join(BASE_DIR, "output", "web", "office") os.makedirs(OFFICE_OUTPUT_DIR, exist_ok=True) def convert_pdf_to_word_service(file_path: str, original_filename: str) -> Dict[str, Any]: """ Полный цикл: Постраничный OCR скана PDF -> Сборка документа DOCX -> Ссылка на скачивание. """ session_id = str(uuid.uuid4())[:8] base_name = os.path.splitext(os.path.basename(original_filename))[0] out_docx_name = f"{base_name}_распознан.docx" target_dir = os.path.join(OFFICE_OUTPUT_DIR, session_id) os.makedirs(target_dir, exist_ok=True) out_docx_path = os.path.join(target_dir, out_docx_name) # 1. Постраничный парсинг всех страниц pages = process_pdf_full(file_path) # 2. Сборка Word-документа build_docx_from_ocr(pages, out_docx_path, doc_title=base_name) # 3. Краткое превью для окна чата preview_sample = pages[0]["text"][:600] if pages else "Документ распознан." download_url = f"/api/v1/files/download/office/{session_id}/{out_docx_name}" return { "status": "success", "total_pages": len(pages), "filename": out_docx_name, "filepath": out_docx_path, "download_url": download_url, "preview_text": preview_sample, "message": f"Документ успешно распознан целиком ({len(pages)} стр.) и собран в MS Word." }