Vai al contenuto

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 soffice termina 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.