Makros/Python-Leitfaden/Dokumente
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Spende
Dokumenten-Management innerhalb des Betriebssystemmanagers
WICHTIG
Für jeden Argumentpfad in Methoden von pyUNO-Objekten verwenden Sie den Pfad (Path) im Format URL, verwendete Funktion uno.systemPathToFileUrl(PATH)
. Windows-Anwender beachten: Pfad-Segmente sind getrennt durch einen Schrägstrich (/).
ACHTUNG In den folgenden Beispielen ersetzen Sie USER mit Ihrem wirklichen Benutzernamen.
Neues leeres Dokument
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
# Dies ist ein üblicher Block zu den folgenden zwei Beispielen
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Um ein Calc-Dokument zu öffnen verwenden Sie diesen Block:
def new_doc_calc():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/scalc'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Um ein Writer-Dokument zu öffnen, verwenden Sie diesen Block:
def new_doc_writer():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Beenden Sie das Makro mit der folgenden Zeile:
g_exportedScripts = (new_doc_calc, new_doc_writer)
Für andere Dokumenten-Typen verwenden Sie im path
Argument:
- Impress:
simpress
- Draw:
sdraw
- Math:
smath
VORSICHT
Kopieren oder importieren Sie die Funktion msgbox
von Nützliche Funktionen
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
- Für ein neues Base-Dokument verwenden Sie:
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
Öffnen
WICHTIG Denken Sie daran, den Dateipfad immer im URL-Format zu verwenden.
path = uno.systemPathToFileUrl('/home/USER/calc.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
- Öffnen mit Argumenten
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
- Andere übliche Argumente
args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}
# Um Makros innerhalb des Dokuments zu aktivieren
args = {'MacroExecutionMode': 4}
# Um ein Dokument aus einer Vorlage zu öffnen (True) oder um eine Vorlage zum Bearbeiten zu öffnen (False).
args = {'AsTemplate': True}
Über alle offenen Dokumente iterieren
desktop = create_instance('com.sun.star.frame.Desktop', True)
for doc in desktop.getComponents():
msgbox(doc.Title)
Aktuelles Dokument holen
doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)
# Ein anderer Weg, um dasselbe wie oben zu erreichen:
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)
Nach PDF exportieren
Schauen Sie für weitere Optionen für das Exportieren in PDF-Export-Filter-Daten
- Calc-Dokument als PDF exportieren
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
- Mit anderen Optionen exportieren
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
Dokumenten-Management innerhalb von LibreOffice
Den Dokument-Typ holen
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
Den Fokus auf das aktuelle Dokument setzen
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setFocus()
Das Dokument sichtbar oder unsichtbar machen
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setVisible(False)
msgbox(doc.Title)
win.setVisible(True)
Den Zoom-Faktor für das Dokument setzen
doc = XSCRIPTCONTEXT.getDocument()
doc.getCurrentController().ZoomValue = 150
Die aktuelle Auswahl holen
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
msgbox(sel.ImplementationName)
Management in der Statusleiste
- Versuchen Sie diesen Code
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
- Sie können nichts sehen, da die Ausführung blockiert ist.
Versuchen Sie nun dies.
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