Code: Select all
# coding: utf8
import sys
import os
import time
import uno
import pyuno
def mergeFromURL(desk, dispatcher, doc1, url, dt = 1.0):
ctr1 = doc1.getCurrentController()
frame1 = ctr1.Frame
doc2 = desk.loadComponentFromURL(url, "_blank", 0, ())
ctr2 = doc2.getCurrentController()
frame2 = ctr2.Frame
dispatcher.executeDispatch(frame1, ".uno:DiaMode", "", 0, ())
dispatcher.executeDispatch(frame2, ".uno:DiaMode", "", 0, ())
for i in range(doc2.DrawPages.Count):
page2 = doc2.DrawPages.getByIndex(i)
ctr2.setCurrentPage(page2)
dispatcher.executeDispatch(frame2, ".uno:Copy", "", 0, ())
time.sleep(dt)
page1 = doc1.DrawPages.getByIndex(doc1.DrawPages.Count-1)
ctr1.setCurrentPage(page1)
dispatcher.executeDispatch(frame1, ".uno:Paste", "", 0, ())
time.sleep(dt)
dispatcher.executeDispatch(frame1, ".uno:DrawingMode", "", 0, ())
doc2.close(False)
def fileNameToUrl(fname):
if fname[0:7] != 'file://':
fname = os.path.realpath(fname)
return pyuno.systemPathToFileUrl(fname)
else:
return fname
def mergeFiles(ctx, desk, filelist, outname):
doc = desk.loadComponentFromURL("private:factory/simpress", "_blank", 0, ())
dispatcher = ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.DispatchHelper", ctx)
for fname in filelist:
mergeFromURL(desk, dispatcher, doc, fileNameToUrl(fname))
doc.DrawPages.remove(doc.DrawPages.getByIndex(0))
doc.storeAsURL(fileNameToUrl(outname), ())
doc.close(False)
def asMacro():
ctx = XSCRIPTCONTEXT.getComponentContext()
desk = XSCRIPTCONTEXT.getDesktop()
infiles = [
"c:/users/my_user/slides1.odp",
"c:/users/my_user/slides2.odp",
]
outfile = "c:/users/my_user/output.odp"
mergeFiles(ctx, desk, infiles, outfile)
def asService():
assert len(sys.argv) >= 2
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" )
desk = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.frame.Desktop", ctx)
infiles = sys.argv[1 : -1]
outfile = sys.argv[-1]
# infiles = [
# "c:/users/my_user/slides1.odp",
# "c:/users/my_user/slides2.odp",
# ]
# outfile = "c:/users/my_user/output.odp"
mergeFiles(ctx, desk, infiles, outfile)
if __name__ == '__main__':
asService()
1. The script, however, makes full copy of the content only when Impress is running in visual mode. Trying to use it in server (or --headless) mode on Linux with no X Server results in partial copying (slides are inserted, but the content is not complete). I suspect the Copy service to be dependent on GUI. Any idea how to get near equivalent feature usable with no X environment?
2. Similar StarBasic code can be run as macro inside Impress session. It uses wait() function in place of time.sleep(). Call of Python routine as a macro is not successfull: copying is not executed, no matter how long the time lag is.