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()