Motore DOCX -> PDF (Server)¶
Obiettivo¶
Conversione server-side da docx a pdf riusabile in tutti i flussi (RAS, rapportini, checklist, ecc.) senza dipendere dal client.
Stack¶
- Engine: LibreOffice headless (
soffice) - Service python:
app/services/docx_pdf_engine.py - Task Celery:
app.tasks.docx_to_pdf_convert - CLI operativa:
flask --app app docx_to_pdf_convert
Config .env¶
DOCX_PDF_ENGINE=soffice
DOCX_PDF_SOFFICE_BIN=/usr/bin/soffice
DOCX_PDF_TIMEOUT_SECONDS=180
DOCX_PDF_TMP_DIR=/tmp/safeops_docx_pdf
RAS_MASTER_TEMPLATE_DOCX=/home/safeops/safeops/incoming/RAS_Ed._1_Rev.1_18-10-2024_MASTER.docx
Installazione server (AlmaLinux/RHEL)¶
dnf -y install libreoffice-headless
Test rapido¶
/root/.pyenv/versions/safeops/bin/flask --app app docx_to_pdf_convert \
--input /home/safeops/safeops/incoming/Libretto_Compilato.docx \
--output /home/safeops/backup/Libretto_Compilato.pdf
Uso via Celery¶
from app.tasks import docx_to_pdf_convert
docx_to_pdf_convert.delay(
input_docx_path="/path/input.docx",
output_pdf_path="/path/output.pdf",
)
Note operative¶
- Il motore usa un profilo LibreOffice temporaneo dedicato per evitare lock tra conversioni concorrenti.
- Il backend valida che l'output PDF esista realmente anche quando
sofficetermina con exit code 0. - Se il comando non trova
soffice, la conversione fallisce esplicitamente con errore gestito. - In finalizzazione RAS il sistema prova prima il template DOCX (
RAS_MASTER_TEMPLATE_DOCX) e, se fallisce, ripiega automaticamente sul renderer PDF legacy.