You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
3.5 KiB
168 lines
3.5 KiB
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
|
|
}
|