go 實(shí)現(xiàn)電子合同(生成動(dòng)態(tài)內(nèi)容word文件并拼接簽名圖片)

go要實(shí)現(xiàn)一個(gè)電子合同的功能還是不容易的,go有直接用戶模版替換的標(biāo)準(zhǔn)庫彤恶,但是我沒有用它,
它的特點(diǎn)有鳄橘,實(shí)現(xiàn)文字替換模版非常簡單声离,但是無法處理替換圖片,同時(shí)它只能讀取由編輯器生成的docx文件瘫怜,word或者wps生成的docx文檔术徊,后面查了一下是由于軟件生成的docx帶有bom頭,所以標(biāo)準(zhǔn)庫讀取失敗宝磨。
三方庫用這個(gè),還有另外一個(gè)需要授權(quán)的弧关,就不用了
github.com/carmel/gooxml/document

//生成未簽電子合同
func CreateUnsignContract(params valiate.CreateUnsignContract) (url, obj_key string, err error) {
    data, err := CreateContractTpData(params) //這里就是一個(gè)數(shù)據(jù)結(jié)構(gòu)體
    if err != nil {
        log.Fatalf("error opening document: %s", err)
        return
    }

    doc, err := document.Open("e-contract-tp2.docx") // 獲取模板文檔路徑
    if err != nil {
        log.Fatalf("error opening document: %s", err)
        return
    }
    // 獲取全部的段落信息
    paragraphs := []document.Paragraph{}
    paragraphs = append(paragraphs, doc.Paragraphs()...)
    for _, sdt := range doc.StructuredDocumentTags() {
        paragraphs = append(paragraphs, sdt.Paragraphs()...)
    }

    // 循環(huán)段落并進(jìn)行文字替換,也就是將模版文件里的動(dòng)態(tài)部分替換成實(shí)際傳入的數(shù)據(jù)
    for _, p := range paragraphs {
        for _, r := range p.Runs() {
            str := r.Text()
            if strings.Contains(str, "ShopName") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "ShopName", data.ShopName, 1)
                r.AddText(tmp)
            }
            if strings.Contains(str, "ShopAddress") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "ShopAddress", data.ShopAddress, 1)
                r.AddText(tmp)
            }
            if strings.Contains(str, "UserName") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "UserName", data.UserName, 1)
                r.AddText(tmp)
            }
            if strings.Contains(str, "UserRealNum") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "UserRealNum", data.UserRealNum, 1)
                r.AddText(tmp)
            }
            if strings.Contains(str, "UserMobile") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "UserMobile", data.UserMobile, 1)
                r.AddText(tmp)
            }
        }
    }
    // 保存文檔,保存在本地
    filename := fmt.Sprintf("e-contract-unsign-%d.docx", time.Now().UnixMicro())
    err = doc.SaveToFile(filename)
    if err != nil {
        return
    }
       return
}

//合成帶簽名的合同
func MakeSignContract(sign_filename string)  {
    doc, err := document.Open(unsign) //打開未簽名的本地合同文件
    if err != nil {
        log.Fatalf("error opening document: %s", err)
        return
    }
    // 獲取全部的段落信息
    paragraphs := []document.Paragraph{}
    paragraphs = append(paragraphs, doc.Paragraphs()...)
    for _, sdt := range doc.StructuredDocumentTags() {
        paragraphs = append(paragraphs, sdt.Paragraphs()...)
    }

    // // 循環(huán)段落并進(jìn)行文字替換
    for _, p := range paragraphs {
        for _, r := range p.Runs() {
            str := r.Text()
            if strings.Contains(str, "Sign") {
                r.ClearContent() // 清除原有的文字信息和換行符
                tmp := strings.Replace(str, "Sign", "", 1)
                r.AddText(tmp)
                r.AddBreak()
                img, _ := common.ImageFromFile(sign_filename) //前端上傳的簽名文件,是圖片
                if err != nil {
                    break
                }
                img1ref, err := doc.AddImage(img)
                if err != nil {
                    break
                }
                anchored, err := r.AddDrawingAnchored(img1ref)
                if err != nil {
                    break
                }
                anchored.SetSize(2*measurement.Inch, 4*measurement.Inch)
                anchored.SetXOffset(3 * measurement.Inch)
                anchored.SetYOffset(3.2 * measurement.Inch)
                r.AddBreak()
            }
        }
    }
    // 保存簽名后的文檔
    filename := fmt.Sprintf("e-contract-signed-%d.docx", time.Now().UnixMicro())
    err = doc.SaveToFile(filename)
    if err != nil {
        return
    }
    return
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唤锉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子别瞭,更是在濱河造成了極大的恐慌窿祥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙寨,死亡現(xiàn)場(chǎng)離奇詭異晒衩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)墙歪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門听系,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虹菲,你說我怎么就攤上這事靠胜。” “怎么了毕源?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵浪漠,是天一觀的道長。 經(jīng)常有香客問我霎褐,道長址愿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任冻璃,我火速辦了婚禮响谓,結(jié)果婚禮上损合,老公的妹妹穿的比我還像新娘。我一直安慰自己娘纷,他們只是感情好嫁审,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著失驶,像睡著了一般土居。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嬉探,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天擦耀,我揣著相機(jī)與錄音,去河邊找鬼涩堤。 笑死眷蜓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胎围。 我是一名探鬼主播吁系,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼白魂!你這毒婦竟也來了汽纤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤福荸,失蹤者是張志新(化名)和其女友劉穎蕴坪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敬锐,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡背传,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了台夺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片径玖。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颤介,靈堂內(nèi)的尸體忽然破棺而出梳星,到底是詐尸還是另有隱情,我是刑警寧澤买窟,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布丰泊,位于F島的核電站,受9級(jí)特大地震影響始绍,放射性物質(zhì)發(fā)生泄漏瞳购。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一亏推、第九天 我趴在偏房一處隱蔽的房頂上張望学赛。 院中可真熱鬧年堆,春花似錦、人聲如沸盏浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绢掰。三九已至痒蓬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滴劲,已是汗流浹背攻晒。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留班挖,地道東北人鲁捏。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像萧芙,于是被迫代替她去往敵國和親给梅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349