⟳ Automazione

Convertire documenti in PDF in blocco con LibreOffice

Come convertire in PDF decine di file Word, Excel e PowerPoint con LibreOffice da riga di comando, anche in PDF/A, e automatizzare tutto con uno script.

Inviare una gara, depositare una pratica, archiviare la documentazione di un progetto: in molti casi i documenti devono essere consegnati in PDF. Convertire un file alla volta con «Salva con nome» va bene per tre documenti, non per sessanta. LibreOffice, oltre a essere una suite d'ufficio completa, può lavorare senza interfaccia grafica, in modalità «headless», e convertire interi gruppi di file con un solo comando. Funziona su Windows, macOS e Linux, ed è gratuito.

Il comando di base

Il programma da invocare si chiama soffice. Su Windows si trova di solito nella cartella C:\Program Files\LibreOffice\program\; su Linux è disponibile direttamente nel terminale dopo l'installazione.

soffice --headless --convert-to pdf --outdir C:\Consegna C:\Documenti\*.docx

Le opzioni hanno un significato preciso:

  • --headless avvia LibreOffice senza aprire finestre;
  • --convert-to pdf indica il formato di destinazione;
  • --outdir specifica la cartella dove salvare i risultati;
  • l'ultimo argomento elenca i file da convertire; i caratteri jolly come *.docx sono comodi, ma il modo in cui vengono espansi dipende dal terminale, quindi la prima volta conviene verificare il risultato.

I file prodotti mantengono il nome originale con estensione .pdf. Lo stesso comando funziona con .doc, .odt, .rtf, .xlsx, .ods, .pptx e molti altri formati.

Una trappola frequente: LibreOffice già aperto

Se LibreOffice è già in esecuzione sul computer, magari con un documento aperto, il comando può terminare senza convertire nulla e senza dare spiegazioni. Il motivo è che la nuova istanza si collega a quella esistente e le passa il lavoro. Le soluzioni sono due: chiudere LibreOffice prima di lanciare la conversione, oppure indicare un profilo utente separato con l'opzione -env:UserInstallation, che rende l'istanza headless completamente indipendente:

soffice -env:UserInstallation=file:///C:/Temp/lo_conversione --headless --convert-to pdf --outdir C:\Consegna C:\Documenti\*.docx

Nel mio lavoro uso sempre un profilo dedicato negli script automatici: elimina un'intera categoria di malfunzionamenti difficili da diagnosticare.

Ottenere un PDF/A

Per la conservazione a lungo termine e per molti portali istituzionali è richiesto il formato PDF/A. Il filtro di esportazione accetta opzioni aggiuntive; nelle versioni recenti di LibreOffice si possono passare in formato JSON:

soffice --headless --convert-to "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"2\"}}" --outdir C:\Consegna documento.docx

Il valore 2 corrisponde a PDF/A-2b. La sintassi è delicata, soprattutto per le virgolette nei diversi terminali, quindi conviene verificarla sulla propria versione e controllare il risultato con un validatore PDF/A prima di automatizzare un'intera consegna. Per i fogli di calcolo il filtro si chiama calc_pdf_Export e per le presentazioni impress_pdf_Export.

Uno script per cartelle intere

Un piccolo script Python rende la conversione ripetibile e gestisce le sottocartelle, cosa che i caratteri jolly da soli non fanno:

import subprocess
from pathlib import Path

SOFFICE = r"C:\Program Files\LibreOffice\program\soffice.exe"
origine = Path("C:/Progetto/Documenti")
destinazione = Path("C:/Progetto/PDF")
estensioni = {".docx", ".doc", ".odt", ".xlsx", ".ods", ".pptx"}

for file in sorted(origine.rglob("*")):
    if file.suffix.lower() not in estensioni or file.name.startswith("~$"):
        continue
    cartella = destinazione / file.parent.relative_to(origine)
    cartella.mkdir(parents=True, exist_ok=True)
    subprocess.run(
        [SOFFICE, "--headless", "--convert-to", "pdf",
         "--outdir", str(cartella), str(file)],
        check=True, timeout=180,
    )

Due dettagli pratici. I file che iniziano con ~$ sono file temporanei creati da Word mentre un documento è aperto: vanno ignorati. Il parametro timeout impedisce che un documento problematico blocchi lo script per sempre.

Fedeltà della conversione

LibreOffice apre i formati Microsoft con ottima compatibilità, ma non sempre identica. Le differenze più comuni riguardano:

Elemento Possibile problema Rimedio
Caratteri Font non installati sostituiti con altri Installare gli stessi font sul computer di conversione
Impaginazione Interruzioni di pagina leggermente spostate Controllare i documenti lunghi
Fogli di calcolo Area di stampa non definita, colonne divise su più pagine Impostare area di stampa e adattamento alla pagina nel file originale
Campi Date o indici non aggiornati Aggiornare i campi prima della conversione

I fogli di calcolo meritano un'attenzione particolare: la conversione segue le impostazioni di stampa del file. Se l'area di stampa non è definita, un foglio largo può diventare un PDF di decine di pagine con poche colonne ciascuna.

Quando usare altri strumenti

Su un computer con Microsoft Office installato, la conversione può essere fatta anche controllando Word stesso da uno script, con una fedeltà perfetta ai documenti Word. È però più lenta, richiede una licenza e non funziona su server Linux. Per conversioni tra formati di testo come Markdown, HTML e Word, uno strumento come Pandoc è più adatto.

In sintesi

  • soffice --headless --convert-to pdf converte in PDF interi gruppi di documenti.
  • Usate un profilo dedicato con -env:UserInstallation per evitare conflitti con LibreOffice aperto.
  • Il PDF/A si ottiene con le opzioni del filtro di esportazione, da verificare sulla propria versione.
  • Uno script Python gestisce sottocartelle, file temporanei e tempi massimi.
  • Installate gli stessi font e definite le aree di stampa per conversioni fedeli.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche