Oh yeah, I almost forgot. I've seen a lot of posts about how headless LibreOffice needs X server running. I'm just setting up an Ubuntu server now for test purposes. I'll report back here.
On Wednesday, March 28, 2012 12:53:07 PM UTC-4, Cliff wrote: > > Most of what I know comes from this: > > http://lucasmanual.com/mywiki/OpenOffice > > Other points > 1. You can start LibreOffice from a script, but you can't connect to it > in that same script. That one cost me half a day. > 2. LibreOffice is gonna crash. You'll need a cron job to check if > LibreOffice is still running and restart it if it's died. > 3. It's slow. If LibreOffice is going to do much work, use the scheduler > as Wilkus suggests. > 4. Get a version of Python with uno baked in. > 5. ZipFile can unpack an odt document. Beware on upload, though; don't > mess with the odt doc until after it is saved. > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > Here's the code I use to start LibreOffice: > > #! /usr/bin/python2.7 > import uno, subprocess, shlex, pyuno, os, socket ## prune this import list! > # fire up libreoffice > rgs = '/usr/lib/libreoffice/program/swriter > -accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" > -norestore -nofirstwizard -nologo -headless' > args = shlex.split(rgs) > lo = subprocess.Popen(args) > > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > Here's a controller. > def do_documents(form): > import uno, os, socket, string ## prune this list > from com.sun.star.beans import PropertyValue > try: > os.mkdir(request.folder + 'temp_pdf') > except OSError: > pass > > package_name = db.document_packages[request.args(0)].name > items = {} > # processing a hand made form > # get the doc id, make a list of fields for each > for k,v in form.vars.iteritems(): > k_split = k.split('_') > if len(k_split) < 2 or k_split[0][:3] != 'id=': > continue > doc_id = k_split[0][3:] > if doc_id not in items: > items[doc_id] = [] > items[doc_id].append((k_split[1], v)) > # now attach the the running LibreOffice instance > # still need to implement a check if running and recovery if not > local = uno.getComponentContext() > resolver = > local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", > > local) > context = > resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") > desktop = > context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", > > context) > > for k, v in items.iteritems(): > rcrd = db.document_templates[k] > path = request.folder + 'uploads/' + rcrd.body > tmplt = desktop.loadComponentFromURL("file:///"+path ,"_blank", 0, > ()) > print type(tmplt) # diagnostic > > search = tmplt.createSearchDescriptor() > for val in v: > search.SearchString = '{{='+val[0]+'}}' > found = tmplt.findFirst(search) > while found: > found.String = string.replace(found.String, > unicode('{{='+val[0]+'}}', 'utf-8'), unicode(val[1], 'utf-8')) > found = tmplt.findNext(found.End, search) > ## next step is to implement the pdf conversion. I THINK this code will > do it > ## property = (PropertyValue("FilterName" , 0, "writer_pdf_Export" > , 0 ),) > ## newpath = request.folder + 'temp_pdf/' + os.path.split(path)[1] > ## tmplt.storeToURL("file:///" + newpath,property) > ## tmplt.dispose() > tmplt.storeAsURL("file:///home/cjk/wtf.odt",()) # not final code > tmplt.dispose() > > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > > > On Wednesday, March 28, 2012 11:17:20 AM UTC-4, DenesL wrote: >> >> Hi Cliff, >> >> could you post more details on your interface to LibreOffice? >> >> Last time I looked at this it did not work properly (UNO bridge with >> OpenOffice) but from your initial post it sounds like a viable alternative >> now. >> >> Thanks, >> Denes >> >> On Tuesday, March 27, 2012 7:47:15 AM UTC-4, Cliff wrote: >>> >>> Thanks Wilkus. >>> >>> Further research this AM says Libre/Open Office does not multi-thread >>> well. >>> >>> The scheduler is just what I need. >>> >>> On Mar 27, 6:33 am, Wikus van de Merwe <dupakrop...@googlemail.com> >>> wrote: >>> > If this processing is done after the form submission you can delegate >>> that >>> > to a background task. >>> > Having a queue of tasks end executing them one by one should solve the >>> > concurrent access >>> > problem. Check out the book section on scheduler: >>> http://web2py.com/books/default/chapter/29/4#Scheduler-%28experimenta... >> >>