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国内版 chatGPT官网 励志名言 河北代理记账公司 文玩 朋友圈文案 语料库 游戏推荐 男士发型 高考作文 PS修图 儿童文学 买车咨询 工作计划 礼品厂 舟舟培训 IT教程 手机游戏推荐排行榜 暖通,电采暖, 女性健康 苗木供应 主题模板 短视频培训 优秀个人博客 包装网 创业赚钱 养生 民间借贷律师 绿色软件 安卓手机游戏 手机软件下载 手机游戏下载 单机游戏大全 免费软件下载 网赚 手游下载 游戏盒子 职业培训 资格考试 成语大全 英语培训 艺术培训 少儿培训 苗木网 雕塑网 好玩的手机游戏推荐 汉语词典 中国机械网 美文欣赏 红楼梦 道德经 网站转让 鲜花