Solved: pyUNO Converter

Duane Kaufman duanek at chorus.net
Wed Dec 17 17:56:04 EST 2003


"Thomas Guettler" <guettli at thomas-guettler.de> wrote in message news:<pan.2003.11.27.16.41.02.989568 at thomas-guettler.de>...

Nice work!

One question though, doesn't this work only for OOo writer files (not
Draw or Calc files)?

I tried hacking it, and in the end, simply tried all output filters
that put out PDF in succession, until one worked.

I _know_ this is a hack, but I couldn't find any information on how to
use pyUNO to query OO and return what _type_ of file it had
opened.....

How _does_ one do that, anyway?

Thanks,
Duane


> Hi!
> 
> This script will convert files to PDF with OpenOffice.
> Other formats (html, doc ...) should be possible, too.
> 
> Have a nice day,
>   thomas
> 
> 
> # OpenOffice1.1 comes with its own python interpreter.
> # This Script needs to be run with the python from OpenOffice.org:
> #   /opt/OpenOffice.org/program/python 
> # Start the Office before connecting:
> # soffice "-accept=socket,host=localhost,port=2002;urp;"
> #
> 
> 
> # pyUNO Imports
> 
> import uno
> from com.sun.star.beans import PropertyValue
> 
> # Python Imports
> 
> import os
> import sys
> 
> 
> 
> # For a list of possible export formats see
> # http://www.openoffice.org/files/documents/25/111/filter_description.html
> # or
> # /opt/OpenOffice.org/share/registry/data/org/openoffice/Office/TypeDetection.xcu
> 
> export_format="writer_pdf_Export"
> export_extension="pdf"
> 
> def usage():
>     print """Usage: %s in_dir out_dir
> All files in in_dir will be opened with OpenOffice.org and
> saved to out_dir
> You must start the office with this line before starting
> this script:
>   soffice "-accept=socket,host=localhost,port=2002;urp;"
>   """ % (os.path.basename(sys.argv[0]))
> 
> def do_file(file, desktop, out_url):
>     # Load File
>     file=os.path.abspath(file)
>     url="file:///%s" % file
>     properties=[]
>     p=PropertyValue()
>     p.Name="Hidden"
>     p.Value=True
>     properties.append(p)
>     doc=desktop.loadComponentFromURL(
>         url, "_blank", 0, tuple(properties));
>     if not doc:
>         print "Failed to open '%s'" % file
>         return
>     # Save File
>     properties=[]
>     p=PropertyValue()
>     p.Name="Overwrite"
>     p.Value=True
>     properties.append(p)
>     p=PropertyValue()
>     p.Name="FilterName"
>     p.Value=export_format
>     properties.append(p)
>     p=PropertyValue()
>     p.Name="Hidden"
>     p.Value=True
>     basename=os.path.basename(file)
>     idx=basename.rfind(".")
>     assert(idx!=-1)
>     basename=basename[:idx]
>     url_save="%s/%s.%s" % (out_url, basename, export_extension)
>     try:
>         doc.storeToURL(
>             url_save, tuple(properties))
>     except:
>         print "Failed while writing: '%s'" % file
>     doc.dispose()
>          
> def main():
>     if len(sys.argv)!=3:
>         usage()
>         sys.exit(1)
>     in_dir=sys.argv[1]
>     out_dir=sys.argv[2]
>     out_url="file://%s" % os.path.abspath(out_dir)
>     print out_url
>     # Init: Connect to running soffice process
>     context = uno.getComponentContext()
>     resolver=context.ServiceManager.createInstanceWithContext(
>         "com.sun.star.bridge.UnoUrlResolver", context)
>     try:
>         ctx = resolver.resolve(
>             "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
>     except:
>         print "Could not connect to running openoffice."
>         usage()
>         sys.exit()
>     smgr=ctx.ServiceManager
>     desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)
> 
>     files=os.listdir(in_dir)
>     files.sort()
>     for file in files:
>         print "Processing %s" % file
>         file=os.path.join(in_dir, file)
>         do_file(file, desktop, out_url)
> 
> if __name__=="__main__":
>     main()




More information about the Python-list mailing list