Search code examples
python-3.xeditingodt

Editing a .odt File using python


First off i must say i am VERY new to programming (less then a week experience in total). I set out to write a program that generates a series of documents of an .odt template. I want to use a template with a specific keyword lets say "X1234X" and so on. This will then be replaced by values generated from the program. Each document is a little different and the values are entered and calculated via a prompt (dates and other things)

I wrote most of the code so far but i am stuck since 2 days on that problem. I used the ezodf module to generate a new document (with different filenames) from a template but i am stuck on how to edit the content. I googled hard but came up empty hope someone here could help. I tried reading the documentations but i must be honest...its a bit tough to understand. I am not familiar with the "slang"

Thanks

PS: a ezodf method would be great, but any other ways will do too. The program doesnt have to be pretty it just has to work (so i can work less ^_^)


Solution

  • Well i figured it out. nd finished the program. I used a ezodf to create the file, then zipfile to extract and edit the content.xml and then repacked the whole thing via a nice >def thingy< from here. I tried to mess with etree...but i couldnt figure it out...

    from ezodf import newdoc
    import os
    import zipfile
    import tempfile
    
    for s in temp2:
    input2 = s
    input2 = str(s)
    input1 = cname[0]
    file1 = '.odt'
    namef = input2 + input1 + file1
    odt = newdoc(doctype='odt', filename=namef, template='template.odt')
    odt.save()
    a = zipfile.ZipFile('template.odt')
    content = a.read('content.xml')
    content = str(content.decode(encoding='utf8'))
    content = str.replace(content,"XXDATEXX", input2)
    content = str.replace(content, 'XXNAMEXX', input1)
    
    
    
    def updateZip(zipname, filename, data):
        # generate a temp file
        tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
        os.close(tmpfd)
    
        # create a temp copy of the archive without filename
        with zipfile.ZipFile(zipname, 'r') as zin:
            with zipfile.ZipFile(tmpname, 'w') as zout:
                zout.comment = zin.comment # preserve the comment
                for item in zin.infolist():
                    if item.filename != filename:
                        zout.writestr(item, zin.read(item.filename))
    
        # replace with the temp archive
        os.remove(zipname)
        os.rename(tmpname, zipname)
    
        # now add filename with its new data
        with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
            zf.writestr(filename, data)
    
    updateZip(namef, 'content.xml', content)