Files
contracts/History/how-to-convert-doc.md
T

2.6 KiB

Как подключить конвертацию .doc → .docx

Сервис: https://liberta.containerk8s.dev.nubes.ru

API

Конвертация:

curl -X POST -F "file=@документ.doc" https://liberta.containerk8s.dev.nubes.ru/convert -o результат.docx

Проверка:

curl https://liberta.containerk8s.dev.nubes.ru/health
# → {"ok":true,"version":"1.0.0"}

Интеграция в Python (как в Сверке)

1. config.py — URL сервиса

CONVERT_SERVICE_URL = os.getenv(
    "CONVERT_SERVICE_URL",
    "http://containerk8s.df36c8af-1a95-4623-b551-0d37b731ccca.svc.cluster.local:5000"
)

2. upload_bp.py — замена subprocess на HTTP

import httpx
import config

@upload_bp.route("/convert-doc", methods=["POST"])
def convert_doc():
    f = request.files.get("files")
    if not f:
        return jsonify(ok=False, error="no file"), 400
    try:
        resp = httpx.post(
            config.CONVERT_SERVICE_URL + "/convert",
            files={"file": (f.filename, f.read(), f.content_type or "application/msword")},
            timeout=120,
        )
        if resp.status_code == 200:
            return send_file(io.BytesIO(resp.content), mimetype="...docx")
        return jsonify(ok=False, error=resp.json().get("error")), 500
    except httpx.TimeoutException:
        return jsonify(ok=False, error="conversion timeout"), 500

3. files.js — фронтенд

var CONVERT_URL = '/convert-doc';

// Перед uploadFile: если .doc → сначала convertDoc()
async function convertDoc(file, onProgress) {
  var fd = new FormData();
  fd.append('files', file, file.name);
  var resp = await fetch(CONVERT_URL, { method: 'POST', body: fd });
  if (!resp.ok) throw new Error('Конвертация: HTTP ' + resp.status);
  var blob = await resp.blob();
  return new File([blob], file.name.replace(/\.doc$/i, '.docx'), {
    type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  });
}

Топология

Браузер → POST /convert-doc (Flask-сервер)
                ↓ httpx
       liberta:5000/convert (libreoffice)
                ↓
            .docx обратно
                ↓
       обычный upload + парсинг

Деплой liberta

Образ: gitea.services.ngcloud.ru/nail/contractor-convert:latest Рецепт: ~/nubes/contracts/convert-service/

  • Dockerfile: python:3.12 + libreoffice + flask
  • Платформа: pythonk8s
  • Порт: 5000
  • Память: 1024 MB
  • CPU: 500m
  • Реплики: 1