package main import ( "os" "strconv" "strings" "github.com/360EntSecGroup-Skylar/excelize" "github.com/unidoc/unioffice/common" "github.com/unidoc/unioffice/document" "github.com/unidoc/unioffice/measurement" ) func main() { if len(os.Args) > 2 { file := os.Args[1] paras := os.Args[2] split := strings.Split(paras, ";") paraMap := make(map[string]string) println("sign:", file) for _, str := range split { index := strings.Index(str, "=") if index == -1 { continue } paraMap[str[:index]] = str[index+1:] } if strings.Contains(file, ".xlsx") { signExcel(file, paraMap) } if strings.Contains(file, ".docx") { signWord(file, paraMap) } } } func signExcel(file string, paras map[string]string) { f, err := excelize.OpenFile(file) if err != nil { println("open error:", err.Error()) return } names := f.GetDefinedName() for _, name := range names { if len(paras[name.Name]) == 0 { continue } sheet, ref := getRealRef(name.RefersTo) val := paras[name.Name] index := strings.Index(val, "pic:") if index == 0 { f.DeletePicture(sheet, ref) val = val[4:] err = f.AddPicture(sheet, ref, val, `{ "autofit": true}`) if err != nil { println("add picture error:", err.Error()) } } else { f.SetCellValue(sheet, ref, val) } } err = f.Save() if err != nil { println("save error:", err.Error()) } else { println("success sign:", file) } } func signWord(file string, paras map[string]string) { doc, err := document.Open(file) if err != nil { println("open error:", err.Error()) return } bookMap, heightMap := doc.BookmarkMap() for key, value := range bookMap { if len(paras[key]) == 0 { continue } ps := value.Paragraphs() for _, p := range ps { for _, run := range p.Runs() { p.RemoveRun(run) } } var para document.Paragraph if len(ps) > 0 { para = ps[0] } else { para = value.AddParagraph() } val := paras[key] index := strings.Index(val, "pic:") if index == 0 { val = val[4:] println("sign picture:", val) img1, err := common.ImageFromFile(val) if err != nil { println("error:", err.Error()) continue } img1ref, err := doc.AddImage(img1) anc, err := para.AddRun().AddDrawingInline(img1ref) width := value.Properties().X().TcW.WAttr.String() for i := 0; i < len(width); i++ { if width[i] > '9' || width[i] < '0' { width = width[:i] break } } w, err := strconv.Atoi(width) if err != nil { println("convert error:", err.Error()) continue } anc.SetSize(measurement.Distance(w), measurement.Distance(heightMap[key])*measurement.Twips) } else { para.AddRun().AddText(val) } } fieldMap := doc.Fields() for key, value := range fieldMap { if len(paras[key]) == 0 { continue } value.X().EG_RunInnerContent[0].T.Content = paras[key] prop := doc.GetOrCreateCustomProperties().GetPropertyByName(key) if prop != nil { if prop.Lpwstr != nil { *prop.Lpwstr = paras[key] } } } err = doc.SaveToFile(file) if err != nil { println("save error:", err.Error()) } else { println("success sign:", file) } } func getRealRef(ref string) (string, string) { index := strings.Index(ref, "!") if index == -1 { return "", "" } sheet := ref[:index] remains := ref[index+1:] strs := strings.Split(remains, "$") ret := "" if len(strs) > 2 { ret += strs[1] index = strings.Index(strs[2], ":") if index != -1 { ret += strs[2][:index] } else { ret += strs[2] } } return sheet, ret }