Всем привет. Написал макрос для обновления оглавления через libreoffice на python. Для этого использую библиотеку uno. Но при отработке выдает ошибку что модуль Base не найден. Не могу понять в чем проблема.
2025-01-10 05:05:02 - src.loading_and_processing_xml - INFO - [loading_and_processing_xml.py:402] - LibreOffice запущен в фоновом режиме
Traceback (most recent call last):
File "/app/src/libreoffice_macro.py", line 1, in <module>
import uno
File "/usr/local/lib/python3.13/site-packages/uno/__init__.py", line 4, in <module>
from base import Element, Css, Payload, UnoBaseFeature, UnoBaseField
ModuleNotFoundError: No module named 'base'
2025-01-10 05:05:04 - src.loading_and_processing_xml - ERROR - [loading_and_processing_xml.py:415] - Ошибка при обновлении оглавления
Макрос
import uno
import sys
from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK
from com.sun.star.text import XTextContent
def update_table_of_contents(doc_path):
# Получаем локальный контекст
local_context = uno.getComponentContext()
# Создаем UNO менеджер соединений
resolver = local_context.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", local_context)
try:
# Подключаемся к запущенному процессу LibreOffice
context = resolver.resolve(
"uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
desktop = context.ServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", context)
# Открываем документ
doc = desktop.loadComponentFromURL(
uno.systemPathToFileUrl(doc_path), "_blank", 0, ())
# Получаем все индексы в документе
indexes = doc.getDocumentIndexes()
# Обновляем каждый индекс
for i in range(indexes.getCount()):
index = indexes.getByIndex(i)
if index.supportsService("com.sun.star.text.ContentIndex"):
index.update()
# Сохраняем и закрываем документ
doc.store()
doc.close(True)
except Exception as e:
print(f"Ошибка при обновлении оглавления: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Использование: python libreoffice_macro.py <путь_к_документу>", file=sys.stderr)
sys.exit(1)
update_table_of_contents(sys.argv[1])