<kbd id="uqusk"></kbd>
  • <strike id="uqusk"></strike>
    <ul id="uqusk"><pre id="uqusk"></pre></ul>
    <strike id="uqusk"></strike>
  • <ul id="uqusk"></ul>
    <samp id="uqusk"></samp>
  • <strike id="uqusk"><s id="uqusk"></s></strike>

    go 實現電子合同(生成動態內容word

    網絡 分享 時間: 收藏本文

    go 實現電子合同(生成動態內容word

    go 實現電子合同(生成動態內容word文件并拼接簽名圖片)

    go要實現一個電子合同的功能還是不容易的,go有直接用戶模版替換的標準庫,但是我沒有用它,

    它的特點有,實現文字替換模版非常簡單,但是無法處理替換圖片,同時它只能讀取由編輯器生成的docx文件,word或者wps生成的docx文檔,后面查了一下是由于軟件生成的docx帶有bom頭,所以標準庫讀取失敗。

    三方庫用這個,還有另外一個需要授權的,就不用了

    ///

    //生成未簽電子合同
    func CreateUnsignContract(params valiate.CreateUnsignContract) (url, obj_key string, err error) {
        data, err := CreateContractTpData(params) //這里就是一個數據結構體
        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()...)
        }
        // 循環段落并進行文字替換,也就是將模版文件里的動態部分替換成實際傳入的數據
        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()...)
        }
        // // 循環段落并進行文字替換
        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
    }
    

    最后編輯于 :2023.11.22 16:30:16

    ?著作權歸作者所有,轉載或內容合作請聯系作者

    周易 易經 代理招生 二手車 網絡營銷 旅游攻略 非物質文化遺產 查字典 精雕圖 戲曲下載 抖音代運營 易學網 互聯網資訊 成語 詩詞 工商注冊 抖音帶貨 云南旅游網 網絡游戲 代理記賬 短視頻運營 在線題庫 國學網 抖音運營 雕龍客 雕塑 奇石 散文 常用文書 河北生活網 好書推薦 游戲攻略 心理測試 石家莊人才網 考研真題 漢語知識 心理咨詢 手游安卓版下載 興趣愛好 網絡知識 十大品牌排行榜 商標交易 單機游戲下載 短視頻代運營 寶寶起名 范文網 電商設計 免費發布信息 服裝服飾 律師咨詢 搜救犬 Chat GPT中文版 經典范文 優質范文 工作總結 二手車估價 實用范文 石家莊點痣 養花 名酒回收 石家莊代理記賬 女士發型 搜搜作文 鋼琴入門指法教程 詞典 讀后感 玄機派 企業服務 法律咨詢 chatGPT國內版 chatGPT官網 勵志名言 文玩 語料庫 游戲推薦 男士發型 高考作文 PS修圖 兒童文學 工作計劃 舟舟培訓 IT教程 手機游戲推薦排行榜 暖通,電地暖, 女性健康 苗木供應 ps素材庫 短視頻培訓 優秀個人博客 包裝網 創業賺錢 養生 民間借貸律師 綠色軟件 安卓手機游戲 手機軟件下載 手機游戲下載 單機游戲大全 石家莊論壇 網賺 職業培訓 資格考試 成語大全 英語培訓 藝術培訓 少兒培訓 苗木網 雕塑網 好玩的手機游戲推薦 漢語詞典 中國機械網 美文欣賞 紅樓夢 道德經 標準件 電地暖 鮮花 書包網 英語培訓機構 電商運營
    国产偷窥女洗浴在线观看亚洲 | 亚洲Av永久无码精品黑人| 亚洲va在线va天堂va888www| 中文字幕亚洲一区| 亚洲国产精品不卡毛片a在线| 国产精品亚洲lv粉色| 亚洲va久久久噜噜噜久久天堂| 国产成人精品曰本亚洲79ren| 亚洲欧洲日本在线| 亚洲夂夂婷婷色拍WW47| 久久精品国产亚洲av麻豆蜜芽| 亚洲伊人久久大香线蕉影院| 亚洲一区二区免费视频| 亚洲an日韩专区在线| 亚洲国产成人久久| 中文文字幕文字幕亚洲色| 天天爽亚洲中文字幕| 亚洲日本VA午夜在线电影| 亚洲熟妇AV一区二区三区宅男| 亚洲日韩中文字幕无码一区| 亚洲AV无码专区国产乱码不卡| 久久久久久亚洲精品无码| 国产成人不卡亚洲精品91| 亚洲国产精品综合久久一线| 中文字幕亚洲不卡在线亚瑟| 好看的亚洲黄色经典| 亚洲AV日韩AV永久无码久久| 久久亚洲AV无码精品色午夜 | 日韩亚洲国产二区| www国产亚洲精品久久久| 亚洲日本中文字幕一区二区三区| 中文字幕在线亚洲精品| 亚洲国产AV无码专区亚洲AV| 亚洲色四在线视频观看| 亚洲另类图片另类电影| 中文字幕亚洲情99在线| 欧美日韩亚洲精品| 久久亚洲中文字幕精品一区| 久久精品国产亚洲夜色AV网站| 亚洲理论片中文字幕电影| 亚洲∧v久久久无码精品|