PDF im Batch mit OpenOffice und Python

Mit Python lässt sich OpenOffice wunderbar zur Konvertierung von Dokumenten im Batch automatisieren. Das folgende Python Script ist ein Office zu PDF Batch Converter, basierend auf der OpenOffice PyUNO API. Es wird am besten mit dem Python Interpreter aus OpenOffice aufgerufen und konvertiert alle Dokumente in einem angegebenen Verzeichnis zu PDF.

Vorraussetzung ist natürlich, dass die PyUNO API bei der OpenOffice-Installation mitinstalliert und OpenOffice Im Servermodus gestartet wurde:

soffice "-accept=socket,host=localhost,port=2002;urp;"

Und hier ein beispielhafter Aufruf des Programms:

c:\\programme\\OpenOffice\\program\\python.bat c:\\converter\\ooconvert.py c:\\testdocs\\doc

Und nun der Python Quellcode:

 
# 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  

import sys, os, uno 
from com.sun.star.beans import PropertyValue  
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 OpenOffice 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()

Dokumente mit OpenOffice vergleichen und Unterschiede in einer PDF Datei zeigen

Ein sehr interessantes PyUNO Script, welches zwei Word Dokumente mit OpenOffice gegeneinander vergleicht und die Unterschiede in einer PDF Datei markiert hat Neil Blakey-Milner in seinem Blog veröffentlicht.

Dabei werden neu erzeugte Passagen farblich hervorgehoben und gelöschte Passagen durchgestrichen dargestellt. Man kann diese Funktion mit der aus Microsoft Office bekannten Dokumente vergleichen und zusammenführen vergleichen.

 

Damit das Programm im Netz nicht verloren geht, hab ich es hier nochmal abgelegt: PyUNO compare doc