Solved: pyUNO Converter

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Thomas Guettler

    #1

    Solved: pyUNO Converter

    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,h ost=localhost,p ort=2002;urp;"
    #


    # pyUNO Imports

    import uno
    from com.sun.star.be ans import PropertyValue

    # Python Imports

    import os
    import sys



    # For a list of possible export formats see
    # http://www.openoffice.org/files/docu...scription.html
    # or
    # /opt/OpenOffice.org/share/registry/data/org/openoffice/Office/TypeDetection.x cu

    export_format=" writer_pdf_Expo rt"
    export_extensio n="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,h ost=localhost,p ort=2002;urp;"
    """ % (os.path.basena me(sys.argv[0]))

    def do_file(file, desktop, out_url):
    # Load File
    file=os.path.ab spath(file)
    url="file:///%s" % file
    properties=[]
    p=PropertyValue ()
    p.Name="Hidden"
    p.Value=True
    properties.appe nd(p)
    doc=desktop.loa dComponentFromU RL(
    url, "_blank", 0, tuple(propertie s));
    if not doc:
    print "Failed to open '%s'" % file
    return
    # Save File
    properties=[]
    p=PropertyValue ()
    p.Name="Overwri te"
    p.Value=True
    properties.appe nd(p)
    p=PropertyValue ()
    p.Name="FilterN ame"
    p.Value=export_ format
    properties.appe nd(p)
    p=PropertyValue ()
    p.Name="Hidden"
    p.Value=True
    basename=os.pat h.basename(file )
    idx=basename.rf ind(".")
    assert(idx!=-1)
    basename=basena me[:idx]
    url_save="%s/%s.%s" % (out_url, basename, export_extensio n)
    try:
    doc.storeToURL(
    url_save, tuple(propertie s))
    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.arg v[2]
    out_url="file://%s" % os.path.abspath (out_dir)
    print out_url
    # Init: Connect to running soffice process
    context = uno.getComponen tContext()
    resolver=contex t.ServiceManage r.createInstanc eWithContext(
    "com.sun.star.b ridge.UnoUrlRes olver", context)
    try:
    ctx = resolver.resolv e(
    "uno:socket,hos t=localhost,por t=2002;urp;Star Office.Componen tContext")
    except:
    print "Could not connect to running openoffice."
    usage()
    sys.exit()
    smgr=ctx.Servic eManager
    desktop = smgr.createInst anceWithContext ("com.sun.star. frame.Desktop", ctx)

    files=os.listdi r(in_dir)
    files.sort()
    for file in files:
    print "Processing %s" % file
    file=os.path.jo in(in_dir, file)
    do_file(file, desktop, out_url)

    if __name__=="__ma in__":
    main()

  • Andreas Kuntzagk

    #2
    Re: Solved: pyUNO Converter

    On Thu, 27 Nov 2003 17:41:07 +0100, Thomas Guettler wrote:
    [color=blue]
    > This script will convert files to PDF with OpenOffice. Other formats
    > (html, doc ...) should be possible, too.[/color]

    Nice.

    Is there any way to start soffice without a display?
    Could be used to offer a webservice-documentconvert er.

    Murple

    Comment

    • Thomas Guettler

      #3
      Re: Solved: pyUNO Converter

      Am Fri, 28 Nov 2003 14:18:12 +0100 schrieb Andreas Kuntzagk:
      [color=blue]
      > On Thu, 27 Nov 2003 17:41:07 +0100, Thomas Guettler wrote:
      >[color=green]
      >> This script will convert files to PDF with OpenOffice. Other formats
      >> (html, doc ...) should be possible, too.[/color]
      >
      > Nice.
      >
      > Is there any way to start soffice without a display?
      > Could be used to offer a webservice-documentconvert er.[/color]

      No, but there is a special X-Server which does not need
      a real display. But I don't think that it is thread save.

      Untested:
      You could start e.g. 5 office instances listening on 5
      different ports and syncronize the access yourself.

      Fortunately I only need it for batch processing.

      thomas

      Comment

      • Duane Kaufman

        #4
        Re: Solved: pyUNO Converter

        "Thomas Guettler" <guettli@thom as-guettler.de> wrote in message news:<pan.2003. 11.27.16.41.02. 989568@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

        [color=blue]
        > 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,h ost=localhost,p ort=2002;urp;"
        > #
        >
        >
        > # pyUNO Imports
        >
        > import uno
        > from com.sun.star.be ans import PropertyValue
        >
        > # Python Imports
        >
        > import os
        > import sys
        >
        >
        >
        > # For a list of possible export formats see
        > # http://www.openoffice.org/files/docu...scription.html
        > # or
        > # /opt/OpenOffice.org/share/registry/data/org/openoffice/Office/TypeDetection.x cu
        >
        > export_format=" writer_pdf_Expo rt"
        > export_extensio n="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,h ost=localhost,p ort=2002;urp;"
        > """ % (os.path.basena me(sys.argv[0]))
        >
        > def do_file(file, desktop, out_url):
        > # Load File
        > file=os.path.ab spath(file)
        > url="file:///%s" % file
        > properties=[]
        > p=PropertyValue ()
        > p.Name="Hidden"
        > p.Value=True
        > properties.appe nd(p)
        > doc=desktop.loa dComponentFromU RL(
        > url, "_blank", 0, tuple(propertie s));
        > if not doc:
        > print "Failed to open '%s'" % file
        > return
        > # Save File
        > properties=[]
        > p=PropertyValue ()
        > p.Name="Overwri te"
        > p.Value=True
        > properties.appe nd(p)
        > p=PropertyValue ()
        > p.Name="FilterN ame"
        > p.Value=export_ format
        > properties.appe nd(p)
        > p=PropertyValue ()
        > p.Name="Hidden"
        > p.Value=True
        > basename=os.pat h.basename(file )
        > idx=basename.rf ind(".")
        > assert(idx!=-1)
        > basename=basena me[:idx]
        > url_save="%s/%s.%s" % (out_url, basename, export_extensio n)
        > try:
        > doc.storeToURL(
        > url_save, tuple(propertie s))
        > 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.arg v[2]
        > out_url="file://%s" % os.path.abspath (out_dir)
        > print out_url
        > # Init: Connect to running soffice process
        > context = uno.getComponen tContext()
        > resolver=contex t.ServiceManage r.createInstanc eWithContext(
        > "com.sun.star.b ridge.UnoUrlRes olver", context)
        > try:
        > ctx = resolver.resolv e(
        > "uno:socket,hos t=localhost,por t=2002;urp;Star Office.Componen tContext")
        > except:
        > print "Could not connect to running openoffice."
        > usage()
        > sys.exit()
        > smgr=ctx.Servic eManager
        > desktop = smgr.createInst anceWithContext ("com.sun.star. frame.Desktop", ctx)
        >
        > files=os.listdi r(in_dir)
        > files.sort()
        > for file in files:
        > print "Processing %s" % file
        > file=os.path.jo in(in_dir, file)
        > do_file(file, desktop, out_url)
        >
        > if __name__=="__ma in__":
        > main()[/color]

        Comment

        • yawar

          #5
          Re: Solved: pyUNO Converter

          One could create the properties list in one go:

          properties = [PropertyValue() for i in range(3)]

          And then fill it in:

          properties[0].Name = ...
          properties[0].Value = ...

          Comment

          Working...