how-to: конвертация .doc и лого Nubes
This commit is contained in:
@@ -0,0 +1,89 @@
|
|||||||
|
# Как подключить конвертацию .doc → .docx
|
||||||
|
|
||||||
|
Сервис: **https://liberta.containerk8s.dev.nubes.ru**
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
**Конвертация:**
|
||||||
|
```bash
|
||||||
|
curl -X POST -F "file=@документ.doc" https://liberta.containerk8s.dev.nubes.ru/convert -o результат.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Проверка:**
|
||||||
|
```bash
|
||||||
|
curl https://liberta.containerk8s.dev.nubes.ru/health
|
||||||
|
# → {"ok":true,"version":"1.0.0"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Интеграция в Python (как в Сверке)
|
||||||
|
|
||||||
|
### 1. config.py — URL сервиса
|
||||||
|
```python
|
||||||
|
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
|
||||||
|
```python
|
||||||
|
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 — фронтенд
|
||||||
|
```javascript
|
||||||
|
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
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Как подключить лого Nubes в веб-сервис
|
||||||
|
|
||||||
|
## Правильный способ (как в Сверке)
|
||||||
|
|
||||||
|
Использовать `<img src="/static/logo.svg">` — браузер рендерит как картинку,
|
||||||
|
"b" в слове nubes не закрашивается.
|
||||||
|
|
||||||
|
## Файлы
|
||||||
|
|
||||||
|
- `~/nubes/design/logo.svg` — правильный логотип (CorelDRAW, 5 путей)
|
||||||
|
- `~/nubes/design/nubes-favicon.svg` — фавикон U-арка с nubes.ru
|
||||||
|
|
||||||
|
## В Python (Flask)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Читаем SVG как строку
|
||||||
|
_LOGO_SVG = """<svg ...>...</svg>"""
|
||||||
|
|
||||||
|
# Отдаём через эндпоинт
|
||||||
|
@app.route("/static/logo.svg")
|
||||||
|
def logo():
|
||||||
|
from flask import Response
|
||||||
|
return Response(_LOGO_SVG, mimetype="image/svg+xml")
|
||||||
|
```
|
||||||
|
|
||||||
|
## В HTML
|
||||||
|
|
||||||
|
```html
|
||||||
|
<img src="/static/logo.svg" alt="Nubes" style="height:28px">
|
||||||
|
```
|
||||||
|
|
||||||
|
## НЕПРАВИЛЬНО
|
||||||
|
|
||||||
|
- ❌ Инлайн `<svg>` — fill-rule ломает букву "b"
|
||||||
|
- ❌ Data URI — битый если длинный/неправильно закодирован
|
||||||
|
|
||||||
|
## Фавикон
|
||||||
|
|
||||||
|
Брать из nubes.ru: `https://nubes.ru/themes/custom/nubes/images/nubes-ico.svg`
|
||||||
Reference in New Issue
Block a user