unoconv: copertina

Mini guida alla conversione di formato nei documenti.

unoconv è un piccolo programma che permette di convertire un documento da un formato ad un altro, Ad esempio la conversione di un file DOCX al formato DOC.
Per funzionare richiede Python e LibreOffice.
È un programmino ideale per automatizzare conversioni massive ed è disponibile per tutti i sistemi operativi.

Vediamo come funziona.
Ipotizziamo di lavorare da un computer Linux, di voler convertire il file Word "esempio.docx" nel formato OpenDocument "esempio.odt".
Inoltre ipotizziamo di avere nella directory "esempi" un migliaio di file Word DOCX da convertire nel formato OpenDocument ODT.

Conversione semplice

Procediamo con la conversione diretta del file "esempio.docx"

unoconv -f odt esempio.docx

In questa sintassi:

  • -f odt: questa opzione istruisce unoconv a convertire la sorgente in formato OpenDocument ODT;
  • esempio.docx: è il file origine da convertire.

Otterremo come risultato il file esempio.odt.

Se vogliamo convertire il file in formato HTML possiamo usare la seguente sintassi:

unoconv -f html esempio.docx

La lista completa dei formati gestiti da unoconv si possono trovare in questa pagina:

http://dag.wiee.rs/home-made/unoconv/

Conversione più avanzata

Rivisitiamo la sintassi sopra usata introducendo una variante dove istruiamo unoconv per generare un file di output con un nome diverso dal file sorgente.

Rivisitando la sintassi sopra usata desidero che il file di output si chiami "miofile1"

unoconv -f odt -o miofile1 esempio.docx

La sintassi è intuitiva, lineare e semplice. L'estensione al nuovo file viene applicata automaticamente. Volendo possiamo specificarla nella riga di comando.
Complichiamo leggermente la sintassi indicando anche una diversa directory di output. In questo caso se non esiste la directory unoconv la creerà

unoconv -f odt -o out/miofile1 esempio.docx

Facciamo un'ulteriore passo in avanti ipotizzando che il file sorgente si trova in un  directory diversa da quella da cui invochiamo unoconv:

unoconv -f odt -o out/miofile1 inp/esempio.docx

All'occorrenza possiamo indicare i path assoluti come, ad esempio, /opt/doc/inp sia per l'opzione -o sia per il file sorgente.

Conversioni massive

Vogliamo ora convertire i 1000 file Word nel formato OpenDocument.
Abbiamo 2 possibilità:

  • diamo il comando secco;
  • lanciamo un'istanza server di unoconv e poi diamo il comando secco.

Per comando secco intendo l'istruzione:

unoconv -f odt -o out/0000.docx esempi/0000.docx

Questa via è perfettamente funzionante, ma poco performante. Infatti per ogni file da convertire unoconv avvierà LibreOffice, farà la conversione, chiuderà LibreOffice.
Per avere un'idea della differenza significa che con il comando secco impiegherà circa 5 secondi per convertirlo. Se invece creiamo un'istanza server la conversione richiederà circa 1 secondo.
Quando convertiamo migliaia di file c'è una bella differenza!

Comando secco

Operando con il comando secco possiamo usare la seguente sintassi

unoconv -f odt -o out esempi/*.docx

dove:

  • -f odt: converti nel formato OpenDocument
  • -o out: i file di output scrivili dentro la directory out
  • esempi/*.docx: i file sorgente prendili da dentro la directory ``esempi`` e prendi tutti i file che hanno estensione DOCX.

Comando con server

Per sfruttare una migliore efficienza grazie ad una istanza server dobbiamo dare 2 comandi in ambiente Linux, Mac e Unix in generale:

unoconv -l &
unoconv -f odt -o out esempi/*.docx

Il comando unoconv -l & avvia un'istanza di unoconv che funzionerà dietro le quinte. In realtà lancia LibreOffice, senza l'interfaccia GUI e resta in ascolto per gestire sui file che gli vengono passati secondo le opzioni che indichiamo.

Uso in ambiente Windows e Mac

Per sistemi diversi da Linux ci sono i porting.
Rimando alle documentazioni ufficiali per installare la versione specifica per il proprio sistema operativo.
Le sintassi sopra esposte cambiano a seconda delle regole del proprio sistema operativo. Ad esempio in ambiente Windows il carattere ``/`` è invece ``\``.

Opportunità e limiti

Per prima cosa esistono comode GUI (=interfacce grafiche) che aiutano e permettono di lavorare come Dio comanda in ambienti come Windows o per utenti che non sono sistemisti o programmatori.

Altresì PHP e molti altri linguaggi offrono ai programmatore librerie che semplificano l'uso del tool all'interno di applicazioni.

Accanto a queste due prime considerazioni va tenuto presente che unoconv ha molte altre opzioni e permette grandi potenzialità, ben oltre a quanto esposto in queste poche righe. Per tutto questo rimando alla documentazione ufficiale. Il link si trova qui in calce. In rete ci sono svariati esempi.

Va anche fatta un'osservazione su alcuni limiti. Il primo è che le conversioni non sono 1:1, cioè il file convertito non è sempre identico all'originale. Il problema è complesso da spiegare. A volte non è possibile la conversione. Nella maggior parte dei casi entrano in gioco disturbi come i font, diverse metriche, ecc...
 
Una seconda nota riguarda l'ambiente Linux. Al comando quando si invoca unoconv si ottiene anche questo messaggio:

/usr/bin/unoconv:19: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
  from distutils.version import LooseVersion

Si tratta di un warning, non di un problema o di un errore.
Ci sono dei workaround per aggiustare la cosa all'origine. Se non vogliamo complicarci la vita possiamo usare, per gli ambienti *nix, un reindirizzamento del warning:

unoconv -f odt esempio.docx 2>&1 /dev/null

Siti di riferimento

uniconv: Automated conversion and styling using LibreOffice, https://github.com/unoconv/unoconv
unoconv, https://github.com/unoconv
unoconv, https://pypi.org/project/unoconv/
http://dag.wiee.rs/home-made/unoconv/