Macro/Guida a Python/Documenti
< Macros | Python Guide
TDF LibreOffice Document Liberation Project Blog comunitari Weblate Nextcloud Redmine Ask LibreOffice Donazione
Gestione dei Documenti all'interno del gestore dei file del sistema operativo
IMPORTANTE: ogni volta che passate un percorso come argomento di un metodo di un oggetto pyUNO, indicate il percorso in formato URL; potete convertirlo da percorso di sistema a URL usando la funzione uno.systemPathToFileUrl(PATH)
Nota per gli utenti di Windows: nei percorsi le cartelle sono separate da uno slash (/).
ATTENZIONE Negli esempi che seguono, sostituite USER con il vostro nome utente effettivo.
Nuovo documento vuoto
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
# Questo è un blocco comune ai due esempi che seguono
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Per aprire un documento di Calc usate questo blocco:
def new_doc_calc():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/scalc'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Per aprire un documento di Writer usate questo blocco:
def new_doc_writer():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Terminate la macro con la seguente riga:
g_exportedScripts = (new_doc_calc, new_doc_writer)
- Per altri tipi di documento usate l'argomento
path
: - Impress:
simpress
- Draw:
sdraw
- Math:
smath
ATTENZIONE: Copiate o importate la funzione msgbox
dalle Funzioni utili
from com.sun.star.beans import PropertyValue
def new_doc_args():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/sdraw'
args = (PropertyValue(Name='Hidden', Value=True),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
msgbox(doc.Title)
doc.close(True)
return
- Per un nuovo database di Base usate:
def new_db():
path = uno.systemPathToFileUrl('/home/USER/newdb.odb')
dbc = create_instance('com.sun.star.sdb.DatabaseContext')
db = dbc.createInstance()
db.URL = 'sdbc:embedded:firebird'
db.DatabaseDocument.storeAsURL(path, ())
return
Apri
IMPORTANTE
- Ricordatevi di usare sempre i percorsi dei file in formato URL.
path = uno.systemPathToFileUrl('/home/USER/calc.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
- Apri con degli argomenti
from com.sun.star.beans import PropertyValue
def open_args():
path = uno.systemPathToFileUrl('/home/USER/writer.odt')
desktop = create_instance('com.sun.star.frame.Desktop', True)
args = (PropertyValue(Name='Password', Value='letmein'),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
return
- Altri argomenti comunemente usati
args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}
# per attivare le macro all'interno del documento
args = {'MacroExecutionMode': 4}
# Per aprire un documento da un modello (True), oppure per aprire un modello per modificarlo (False).
args = {'AsTemplate': True}
Iterazione su tutti i documenti aperti
desktop = create_instance('com.sun.star.frame.Desktop', True)
for doc in desktop.getComponents():
msgbox(doc.Title)
Selezionare il documento corrente
doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)
# Un altro modo per ottenere lo stesso effetto:
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)
Esportare in PDF
Potete trovare maggiori informazioni sulle possibili opzioni in Filtro dati per l'esportazione in PDF
- Esportare documenti di Calc in PDF
from com.sun.star.beans import PropertyValue
def dict_to_property(values, uno_any=False):
ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()])
if uno_any:
ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps)
return ps
def main():
path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
doc = XSCRIPTCONTEXT.getDocument()
args = {
'FilterName': 'calc_pdf_Export',
}
args = dict_to_property(args)
doc.storeToURL(path_pdf, args)
return
- Esportare con altre opzioni
def main():
path_pdf = uno.systemPathToFileUrl('/home/mau/calc.pdf')
doc = XSCRIPTCONTEXT.getDocument()
args = {
'EncryptFile': True,
'DocumentOpenPassword': 'letmein',
}
filter_data = dict_to_property(args, True)
args = {
'FilterName': 'calc_pdf_Export',
'FilterData': filter_data,
}
args = dict_to_property(args)
doc.storeToURL(path_pdf, args)
return
Gestione del documento all'interno di LibreOffice
Ottenere il tipo di documento
def get_type_doc(doc):
TYPE_DOC = {
'calc': 'com.sun.star.sheet.SpreadsheetDocument',
'writer': 'com.sun.star.text.TextDocument',
'impress': 'com.sun.star.presentation.PresentationDocument',
'draw': 'com.sun.star.drawing.DrawingDocument',
'base': 'com.sun.star.sdb.DocumentDataSource',
'math': 'com.sun.star.formula.FormulaProperties',
'basic': 'com.sun.star.script.BasicIDE',
}
for k, v in TYPE_DOC.items():
if doc.supportsService(v):
return k
return ''
def main():
doc = XSCRIPTCONTEXT.getDocument()
msgbox(get_type_doc(doc))
return
Impostare il focus sul documento attivo
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setFocus()
Rendere visibile il documento o nasconderlo
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setVisible(False)
msgbox(doc.Title)
win.setVisible(True)
Impostare il fattore di zoom per un documento
doc = XSCRIPTCONTEXT.getDocument()
doc.getCurrentController().ZoomValue = 150
Ottenere la selezione corrente
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
msgbox(sel.ImplementationName)
Gestione della barra di stato
- Provate questo codice
from time import sleep
def main():
doc = XSCRIPTCONTEXT.getDocument()
statusbar = doc.getCurrentController().getStatusIndicator()
statusbar.start('Line', 10)
for i in range(10):
statusbar.setValue(i)
sleep(1)
# ~ Is important free status bar
statusbar.end()
return
- Non potete vedete nulla perché l'esecuzione è bloccata.
Ora provate così.
import threading
from time import sleep
def run_in_thread(fn):
def run(*k, **kw):
t = threading.Thread(target=fn, args=k, kwargs=kw)
t.start()
return t
return run
@run_in_thread
def update_status_bar(statusbar, text, limit):
statusbar.start(text, limit)
for i in range(limit):
statusbar.setValue(i)
sleep(1)
# ~ Is important free status bar
statusbar.end()
return
def main():
doc = XSCRIPTCONTEXT.getDocument()
statusbar = doc.getCurrentController().getStatusIndicator()
update_status_bar(statusbar, 'Line', 10)
return