Управление документами в диспетчере операционной системы
ВАЖНО Для любого пути аргумента в методах объектов pyUNO всегда используйте путь в формате URL, используемую функцию uno.systemPathToFileUrl(PATH). Примечание пользователей Windows: сегменты пути разделяются косой чертой (/).
ВНИМАНИЕ! В следующих примерах замените USER именем пользователя.
Как создать новый пустой документ
import uno
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
# Это общий блок для следующих двух примеров
def create_instance(name, with_context=False):
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Чтобы открыть документ Acell, используйте этот блок:
def new_doc_acell():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/scalc'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Чтобы открыть документ AText, используйте этот блок:
def new_doc_atext():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
return
# Завершите макрос следующей строкой:
g_exportedScripts = (new_doc_acell, new_doc_atext)
Для других
типов документов используйте аргумент path:
- AConcept: simpress
- AGraph: sdraw
- AMath: smath
Создание и закрытие нового документа в режиме скрытого отображения
Эта функция создает новый документ в режиме скрытого отображения, выводит его заголовок в окне сообщения и затем закрывает его
from com.sun.star.beans import PropertyValue
def new_doc_args():
desktop = create_instance('com.sun.star.frame.Desktop', True)
path = 'private:factory/swriter'
args = (PropertyValue(Name='Hidden', Value=True),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
doc.close(True)
return
Открыть
ВАЖНО Помните, всегда используйте путь к файлу в формате URL.
path = uno.systemPathToFileUrl('/home/USER/acell.ods')
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.loadComponentFromURL(path, '_default', 0, ())
- Открыть с аргументами
from com.sun.star.beans import PropertyValue
def open_args():
path = uno.systemPathToFileUrl('/home/USER/atext.odt')
desktop = create_instance('com.sun.star.frame.Desktop', True)
args = (PropertyValue(Name='Password', Value='letmein'),)
doc = desktop.loadComponentFromURL(path, '_default', 0, args)
return
- Другие общие аргументы
args = {'Hidden': True}
args = {'ReadOnly': True}
args = {'Preview': True}
# Чтобы активировать макросы внутри документа
args = {'MacroExecutionMode': 4}
# Открыть документ из шаблона (True) или открыть шаблон для редактирования (False).
args = {'AsTemplate': True}
Перебрать все открытые документы
desktop = create_instance('com.sun.star.frame.Desktop', True)
for doc in desktop.getComponents():
msgbox(doc.Title)
Получить текущий документ
doc = XSCRIPTCONTEXT.getDocument()
msgbox(doc.Title)
# Другой способ сделать то же самое:
desktop = create_instance('com.sun.star.frame.Desktop', True)
doc = desktop.getCurrentComponent()
msgbox(doc.Title)
Экспорт в PDF
Посмотрите дополнительные параметры экспорта в PDF данные фильтра экспорта
- Экспорт документа ACell в формат 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/acell.pdf')
doc = XSCRIPTCONTEXT.getDocument()
args = {
'FilterName': 'calc_pdf_Export',
}
args = dict_to_property(args)
doc.storeToURL(path_pdf, args)
return
- Экспорт с другими параметрами
def main():
path_pdf = uno.systemPathToFileUrl('/home/mau/acell.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
Управление документами в AlterOffice
Получить тип документа
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
Установить фокус для текущего документа
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setFocus()
Сделать документ видимым или скрытым
doc = XSCRIPTCONTEXT.getDocument()
win = doc.getCurrentController().getFrame().getComponentWindow()
win.setVisible(False)
msgbox(doc.Title)
win.setVisible(True)
Установить коэффициент масштабирования для документа
doc = XSCRIPTCONTEXT.getDocument()
doc.getCurrentController().getViewSettings().ZoomValue = 150
ImplementationName выделенного объекта
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
msgbox(sel.ImplementationName)
Управление в строке состояния
- Попробуйте этот код
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)
# Важен путой статус бар
statusbar.end()
return
- Вы не можете ничего просмотреть, потому что выполнение заблокировано.
А теперь попробуйте это
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
Ниже предлагаем вам примеры макросов
Создание и закрытие нового документа в режиме скрытого отображения
Открыть документ с аргументами
Смотрите вложение к данной статье (файл open_document_with_pass.py)
Перебрать все открытые документы
Смотрите вложение к данной статье (файл view_name_message.py)