Search code examples
godocx

insert image into a specific place of docx file using golang


I am trying to fill a docx template dynamically using the golang package "github.com/lukasjarosch/go-docx".

enter image description here

I can replace all the text fields accordingly with this code:

package main

import (
    docx "github.com/lukasjarosch/go-docx"
)

func main() {
    // some logic here

    replaceMap := docx.PlaceholderMap{
        "personName":            name,
        "companyName":           company_name,
        "cityName":              city_name,
        // .....
    }

    // read and parse the template docx
    doc, err := docx.Open("rental_contract_template.docx")
    if err != nil {
        panic(err)
    }

    // replace the keys with values from replaceMap
    err = doc.ReplaceAll(replaceMap)
    if err != nil {
        panic(err)
    }

    // write out a new file
    err = doc.WriteToFile("replaced.docx")
    if err != nil {
        panic(err)
    }
}

Now I want to insert an image at {QRODE}. I found out that unfortunately, this package does not provide this functionality. I am lacking the knowledge to work with XML directly. I am supposed to not use "github.com/unidoc/unioffice".

How can I insert an image at that specific place?


Solution

  • Do you want to try it ?

    "github.com/nguyenthenguyen/docx"

    this is example:

    package main
    
    import (
        "strconv"
    
        "github.com/nguyenthenguyen/docx"
    )
    
    func main() {
        // Read from docx file
        r, err := docx.ReadDocxFile("./TestDocument.docx")
        // Or read from memory
        // r, err := docx.ReadDocxFromMemory(data io.ReaderAt, size int64)
    
        // Or read from a filesystem object:
        // r, err := docx.ReadDocxFromFS(file string, fs fs.FS)
    
        if err != nil {
            panic(err)
        }
        docx1 := r.Editable()
        // Replace like https://golang.org/pkg/strings/#Replace
        docx1.Replace("old_1_1", "new_1_1", -1)
        docx1.Replace("old_1_2", "new_1_2", -1)
        docx1.ReplaceLink("http://example.com/", "https://github.com/nguyenthenguyen/docx", 1)
        docx1.ReplaceHeader("out with the old", "in with the new")
        docx1.ReplaceFooter("Change This Footer", "new footer")
        docx1.WriteToFile("./new_result_1.docx")
    
        docx2 := r.Editable()
        docx2.Replace("old_2_1", "new_2_1", -1)
        docx2.Replace("old_2_2", "new_2_2", -1)
        docx2.WriteToFile("./new_result_2.docx")
    
        // Or write to ioWriter
        // docx2.Write(ioWriter io.Writer)
    
        docx3 := r.Editable()
        //Currently only swaps apples for apples i.e. png to png, and not png to jpeg etc.
        docx3.ReplaceImage("word/media/image1.png", "./new.png")
    
        // replace the last image
        imageIndex := docx3.ImagesLen()
        docx3.ReplaceImage("word/media/image"+strconv.Itoa(imageIndex)+".png", "./new.png")
        docx3.WriteToFile("./new_result_3.docx")
    
        r.Close()
    }