Αντρω δι Νεξυνω

[Python] Documenti writer (*.otd - L.O./O.O) come template

« Older   Newer »
  Share  
nuzzopippo
view post Posted on 23/2/2020, 12:13 by: nuzzopippo
Avatar

Nubbio x Sempre

Group:
Moderazione globale
Posts:
7,226

Status:


Salve, è circa un anno che non scrivo niente qui ... è rimasta anche "roba appesa", vabbe'

Introduzione e problematica


Recentemente mi son trovato ad affrontare il problema di dover impostare tutta una serie di documenti (lettere, distinte, atti contabili, etc) relativi ad una particolare gestione da tenersi separatamente dalle operazioni contabili ordinarie (in cui è inclusa) per trattamenti specifici da comunicarsi a referente esterno.
Tale gestione, molto semplice, è tenuta "manualmente" ( :cry: il mondo è quello che è) da vari uffici e soggetti, ognuno per le proprie specifiche competenze sulla base di "modelli di documento" stabiliti anni fa ed i cui template ho provveduto io stesso (pur se la faccenda non mi riguarda) ad impostare per i formati *.odt ed *.ods (rispettivamente, writer e calc di Libreoffice/Openoffice).

... orbene, pur se tale gestione è di per se semplicissima, come sempre quando ci sono più teste sulla stessa faccenda inevitabilmente accadono disguidi, tipo assegnare lo stesso identificativo "univoco" a diversi procedimenti, disguidi che inevitabilmente comportano tutta una serie di provvedimenti burocratici capaci di procastinare per mesi l'utilizzo di fondi seppur disponibili ... cosa comune nella burocrazia delle P.A. ma estremamente seccante quando riguarda voci particolari, tipo quelle relative a stipendi e salari ;) ... l'ultima evenienza mi ha fatto decidere, dato che ne sono capace, di affrontare l'argomento nei ritagli di tempo (fine settimana a casa, ovviamente) per poi proporre una sorta di gestione centralizzata della faccenda.

Uno degli aspetti "irrinunciabili" della faccenda è che il "prodotto finale" DEVE essere aderente ai modelli di documento stabiliti e "modificabile" per uffici e R.U.P. di turno possano apporci le loro sigle e titoli per le firme (e che! Siamo nel 2020, mica usi i timbri)

questo post riguarda il test di due metodi paralleli per modificare documenti writer utilizzati come modello.

Il primo metodo è relativo alla compilazione di campi in uno dei documenti costituenti un singolo provvedimento contabile.

Il secondo metodo riferisce alla compilazione tabellare di riepilogo per una categoria di provvedimenti.

Strumenti adottati


Python naturalmente, versione 3.6.9 Linux, e la libreria odfpy, in questa pagina di github trovate il master della libreria, per l'installazione potete installarla direttamente con pip nel vostro venv.

Modo 1 : Compilazione di una "reversale"


Uno dei metodi più immediati messi a disposizione da odfpy è il modulo "userfield", tale modulo permette di valorizzare in maniera decisamente semplice delle variabili definite dall'utente.
Questo ci permette di definire un documento popolandolo di un opportuno numero di campi che valorizzeremo poi tramite un nostro script python.

Per preparare il template in figura giù

png



dovremo in primo luogo definire la struttura del documento, in questo caso grafica con pesante uso di tabelle ma il discorso vale anche per testo ordinario tipo normali lettere commerciali, e quindi definire i campi utente necessari, per far ciò useremo la seguenza di menu

Inserisci -> Comando di campo -> Altri campi ...



che ci farà comparire la finestra di dialogo "Comandi di campo" in figura

png



Qui selezioneremo il tab "Variabili" e il tipo "Campo utente", quindi nella casella "Nome" scriveremo il nome identificativo della variabile e nella casella "Valore" il segnaposto da mostrare (valori in grigio nella immagine precedente) e selezionare nell'elenco "Formato" il tipo di formattazione da applicarsi, per inciso, l'immagine è un work in progress, txt_valuta è un capo di testo, quindi, terminato di definire la variabile, premere il segno di spunta accanto ai campi di immissione, la variabile definita comparirà nell'elenco "Seleziona", posizionatovi nel punto in cui volete inserirla vi sarà sufficiente selezionarla e premere il pulsante "Inserisci", vedrete il segnaposto comparire nel documento.
In una singola sessione possono essere definite più variabili utente.

Attenzione : le immagini ed i menu citati sono pertinenti alla disponibilità del mio sistema (Libreoffice 6.0.7.3 su ubuntu 18.04.3 ambiente Unity), dipendentemente dal Vostro s.o. e dalla versione di libreoffice/oenoffice utilizzata potrebbero esserci differenze, comunque i campi utente dovrebbero essere disponibili.

Codifica primo metodo


Una volta soddisfatti del Vostro modello di documento potrete salvarlo, nel mio caso in una sub-directory "templates" della direttrice di test, con il nome "reversale.odt", potrete passare alla codifica-

Letto il punto 6.1 "Userfield module" del documento "api-for-odfpy-odt", reperibile nel master di odfpy nel link precedente, e fatto qualche test, ho scoperto che, una volta preparati di dati, è incredibilmente semplice valorizzare i campi utente nel documento e salvare (in un nuovo documento, non vogliamo perdere il template no?).

Nello specifico del test, mi son limitato a definire un dizionario in cui le chiavi sono i nomi delle variabili ed i valori quelli da applicarsi, ovvio l'import di userfield, una volta aperti in lettura scrittura binaria il template ed il file di destinazione è sufficiente istanziare "UserField" del modulo "userfield" dandogli in pasto i files aperti, quindi invocare il metodo "update()", dandogli in pasto il dizionario, eseguire il salvataggio con il metodo "savedoc()" dell'istanza e chiudere i documenti aperti.

qui il codice

CODICE
# -*- coding: utf-8 -*-

#from odf.opendocument import load
import sys
import os
from odf import userfield as uf


# definizione dei valori da inserire nel template
values = {}
values['num'] = 1
values['anno'] = 2020
values['valuta'] = 96250.25
values['txt_valuta'] = 'novantaseimiladuecentocinquanta e venticinque centesimi'
values['causale'] = 'Parziale rimborso prestiti mese di Dicembre 2019'
values['riferimento'] = 'Pag. 125 Registro crediti, righe 17-29.'
values['debitore'] = 'Paolino Paperino'
values['indirizzo'] = 'via dei Tigli, 13  -  01313 - Paperopoli (PP)'

# definizione del template da utilizzare (file otd con campi pre-definiti)
file_name = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])),
                        'templates/reversale.odt')
doc = open(file_name, 'rb')
# definizione del file da generare
doc_fin = open(os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])),
                           'documents/reversale_modificato.odt'), 'wb')

# istanza ad UserFields
us_f = uf.UserFields(src=doc, dest=doc_fin)

# aggiornamento dati da rappresentare
us_f.update(values)
# creazione del file finale
us_f.savedoc()

# chiusura dei documenti aperti
doc.close()
doc_fin.close()


e qui il prodotto finale

png



Facile no? ... certo, ho omesso la gestione degli errori ed un sacco di altre cose, è solo un esempio ma è stato facilissimo.

... così non sarà nel prossimo post, i documenti sono qualcosa di maledettamente complesso e la documentazione ... beh, gli utenti esperti forse avranno vita più facile ma a me ha fatto piangere, è il motivo di questi post : tra un mese chi se lo ricorda?

Segue, ciao ;)

Edited by nuzzopippo - 29/2/2020, 14:15
 
Web  Top
2 replies since 23/2/2020, 12:13   106 views
  Share