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:
--headlessavvia LibreOffice senza aprire finestre;--convert-to pdfindica il formato di destinazione;--outdirspecifica la cartella dove salvare i risultati;- l'ultimo argomento elenca i file da convertire; i caratteri jolly come
*.docxsono 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 pdfconverte in PDF interi gruppi di documenti.- Usate un profilo dedicato con
-env:UserInstallationper 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.