case history
Case #02 · Automation

Automazione pipeline firma digitale: da email a PDF firmato in 3 minuti

Un documento .doc arriva via email. Va compilato, firmato, convertito in PDF e rispedito. Workflow manuale da 20 minuti. Diventato tool CLI riutilizzabile in 15 minuti di sviluppo.

ContestoDocumento contrattuale
StackPython, LibreOffice, Gmail API
Sviluppo~15 minuti
Iterazioni3 versioni

Il problema

Un documento Word (.doc) arriva via email da un'azienda cliente. Contiene un modulo da sottoscrivere: va inserita una data, aggiunta una firma digitale e il documento va riconsegnato in PDF.

Workflow manuale standard:

  1. Scaricare l'allegato da Gmail
  2. Aprirlo in Word o LibreOffice
  3. Inserire la data nei campi puntini
  4. Trovare la firma salvata da qualche parte
  5. Inserirla manualmente nel punto corretto
  6. Esportare in PDF
  7. Allegare il PDF alla email di risposta

20 minuti di lavoro meccanico. E succederà di nuovo — questo tipo di documento è ricorrente.

La pipeline automatizzata

01
Gmail APIDownload allegato .doc dall'email originale tramite message ID e attachment ID
02
LibreOffice headlessConversione .doc → .docx (python-docx non legge .doc nativo)
03
python-docxPattern matching sui paragrafi → sostituzione puntini con la data corrente
04
Google Drive APIDownload file firma digitale (JPG) dal Drive personale tramite file ID
05
python-docxIndividuazione riga firma, clear() del paragrafo, inserimento immagine con dimensione definita
06
LibreOffice headlessConversione .docx → PDF finale
07
OutputPDF firmato pronto per allegato email

Punti critici risolti

Compilazione campi data: i documenti legali usano spesso sequenze di puntini come placeholder. Il pattern matching funziona ma non è deterministico — ogni documento ha la propria convenzione (…………… vs .........). La soluzione è un set di pattern comuni.

for para in doc.paragraphs:
    if '……………………' in para.text:
        para.text = para.text.replace('……………………', "29/01/2026")

Inserimento firma immagine: para.clear() è necessario prima di inserire immagini — altrimenti il testo esistente rimane.

for para in doc.paragraphs:
    if '.........' in para.text:
        para.clear()
        run = para.add_run()
        run.add_picture('firma.jpg', width=Inches(1.5))

LibreOffice headless: stabile per entrambe le conversioni (.doc→.docx e .docx→PDF). Timeout 30 secondi sufficiente per documenti sotto 1MB. Output PDF di qualità alta.

Encoding firma da Drive: read_file restituisce contenuto escaped. Encoding latin1 per la conversione bytes → stringa.

Evoluzione del tool

Interfaccia finale:

python3 document-signer/signer.py \
  --message-id <gmail_message_id> \
  --signature <drive_file_id>

Risultati

Il pattern è replicabile per qualsiasi workflow di firma documenti via email: contratti, moduli, dichiarazioni ricorrenti. La chiave è non automatizzare per automatizzare, ma farlo quando il workflow si ripete — anche solo 3-4 volte l'anno il costo di sviluppo è già ammortizzato.

Python Gmail API Google Drive LibreOffice automation document processing