initial commit

master 1.0.0
李岩峰 5 years ago
parent 476040fd56
commit 50820fd961

@ -1,3 +1,20 @@
# SignOffice
Office文件签名程序
Office文件签名程序
支持docx,xlsx签名
## 签名方式
~~~
SignOffice.exe C:/test.xlsx "签名文字=test;签名图片=pic:C:/test.png"
~~~
## word签名设置
有两种方式:
1. 通过设置属性的方式签名文字
2. 通过设置在单元格内的书签的方式进行签名,这种方式既可以签名图片,也可以签名文字,放在单元格内也会让图片的大小和单元格一致,**推荐使用这种**
## excel签名设置
通过设置单元格的名称即可
图片会自动适应单元格大小

@ -0,0 +1,167 @@
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
}
Loading…
Cancel
Save