Macros/Guía de Python/Trabajo con documentos
TDF LibreOffice en español Document Liberation Project Blogs comunitarios Weblate Nextcloud Redmine Preguntas y respuestas Donar
Gestión de documentos con el sistema operativo
IMPORTANTE
Para cualquier argumento de rutas en métodos de objetos pyUNO, use siempre la ruta en formato URL, use la función uno.systemPathToFileUrl(PATH)
. Nota para los usuarios de Windows: los segmentos de la ruta están separados por una barra inclinada (/).
PRECAUCIÓN En los siguientes ejemplos, sustituya USUARIO por su nombre de usuario real.
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)
return
- 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
Consulte 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