У меня проблема с почтовыми файлами, созданными с использованием сценария python uno.Запуск mailmerge внутри самого LibreOffice с помощью мастера mailmerge работает так, как в скрытых полях, а другие поля в документе сглаживаются / выполняются, а полученный документ имеет правильный окончательный сглаженный вывод.
В отличие от этого при запуске сПриведенный ниже код представляет собой серию выходных документов, в которых все еще есть коды полей, а скрытые абзацы по-прежнему видны.Каждый документ настроен на соответствующую строку базы данных mailmerge, так же, как я получаю предварительный просмотр в LibreOffice при настройке Mailmerge.При открытии этих документов на другом компьютере данные не отображаются, так как для получения полевых данных сначала необходим доступ к внутренней базе данных.
Если в моем сценарии я установил SaveFilter, скажем, «HTML (StarWriter)» или «writer_pdf_export», то он сгладит файл, но не удалит скрытые абзацы из вывода.
Не могли бы вы помочь мне воспроизвести способ, которым LibreOffice выполняет почтовое слияние, но с использованием интерфейса uno python?
import uno
def mergeit():
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext )
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager
oMailMerge = smgr.createInstanceWithContext( "com.sun.star.text.MailMerge",ctx)
oMailMerge.DocumentURL = "file:////home/user/templates/testtemplate.odt" #Source document (forward slashes only)
oMailMerge.DataSourceName = "jdbcpostgresmailmerge" #name of data source (included in source document)
oMailMerge.CommandType = 0 #0 = table name, 1 = query name, 3 = SQL command
oMailMerge.Command = "public.mailmergedata" #name of table in data source
oMailMerge.OutputType = 2 #1 = printer, 2 = file, 3 = email
oMailMerge.OutputURL = uno.systemPathToFileUrl("/home/user/output/") #output directory (forward slashes only)
oMailMerge.SaveFilter = "writer8"
oMailMerge.FileNameFromColumn = True #get file name from data source column
oMailMerge.FileNamePrefix = "mergefilename" #name of data source column
oMailMerge.SaveAsSingleFile = False #save as multiple files
oMailMerge.execute([])
# Do a nasty thing before exiting the python process. In case the
# last call is a oneway call (e.g. see idl-spec of insertString),
# it must be forced out of the remote-bridge caches before python
# exits the process. Otherwise, the oneway call may or may not reach
# the target object.
# I do this here by calling a cheap synchronous call (getPropertyValue).
ctx.ServiceManager
def main():
mergeit()
if __name__ == '__main__':
main()
Система работает под управлением LibreOffice 6.0.6.2 в Ubuntu 18 x64
Вот какЯ запускаю LibreOffice перед вызовом моего скрипта:
libreoffice --headless --accept="socket,host=localhost,port=2002;urp;"