55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
"""
|
|
===============================================================================
|
|
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."
|
|
} |