Macros/Guía de Python/Trabajo con documentos
TDF LibreOffice en español Document Liberation Blogs comunitarios Weblate Nextcloud Redmine Preguntas y respuestas Donar
Gestión de documentos con el sistema operativo
IMPORTANTE
En todos los métodos y funciones de los objetos de PyUNO, para cualquier argumento que requiera una ruta a un archivo, es mejor usar la función uno.systemPathToFileUrl(PATH)
.
PRECAUCIÓN En los siguientes ejemplo, substituya USER con el nombre real de su usuario. Las rutas se ejemplifican en sistemas Linux. Son similares en otros sistemas.
Nuevo documento en blanco
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
# El siguiente es un bloque de código común a los dos siguientes ejemplos
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Para abrir un documento de Calc use el siguiente bloque de código
def new_doc_calc():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/scalc'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Para abrir un documento de Writer use el siguiente bloque de código
def new_doc_writer():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Finalice la macro con la siguiente línea de código:
g_exportedScripts = (new_doc_calc, new_doc_writer)
Para crear otro tipo de documento, debe usar, respectivamente, al final del argumento path
:
- Impress:
simpress
- Draw:
sdraw
- Math:
smath
- Impress:
simpress
- Draw:
sdraw
- Math:
smath
PRECAUCIÓN
En estos ejemplos se usa la función msgbox
. Cópiela desde Funciones útiles o impórtela en su macro.
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
- Para abrir un nuevo documento Base use:
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
Abrir un documento ya existente
IMPORTANTE Recuerde siempre usar la ruta al archivo en formato URL.
path = uno.systemPathToFileUrl('/home/USER/calc.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
- Abrir un documento con los argumentos más comunes
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)
- Abrir un documento con otros argumentos posibles
args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}
# Para que se activen las macros del documento
args = {'MacroExecutionMode': 4}
# Para abrir un documento a partir de una plantilla (True), o para abrir una plantilla para su edición (False)
args = {'AsTemplate': True}
Iterar sobre todos los documentos abiertos
desktop = create_instance('com.sun.star.frame.Desktop', True)
for doc in desktop.getComponents():
msgbox(doc.Title)
Obtener el documento activo
doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)
# Otra manera de hacer lo mismo que arriba:
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)
Exportación a PDF
Mire más opciones disponibles para la exportación en Opciones del filtro de exportación a PDF
- Exportar un libro de Calc como 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
- Un ejemplo de exportación con otras opciones
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
Gestión de documentos dentro de LibreOffice
Conocer el tipo de documento activo
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
Establecer el foco para el documento activo
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setFocus()
Mostrar u ocultar el documento
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setVisible(False)
msgbox(doc.Title)
win.setVisible(True)
Establecer el factor de ampliación para ver el documento
doc = XSCRIPTCONTEXT.getDocument()
doc.getCurrentController().ZoomValue = 150
Obtener la selección activa
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
msgbox(sel.ImplementationName)
Gestión en la barra de estado
- Intente con este código
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
- No verá ningún cambio o movimiento porque la ejecución está bloqueada.
Ahora pruebe este otro código.
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