# -*- coding: UTF-8 -*- import esigntool import requests from esigntool import esign_run_print_outer from esigntool.esign_file import fileHelp import time # 模版场景:支持动态表格,上传的文件必须是.doc 或 .docx 格式 config = esigntool.config() # 初始化配置类 @esign_run_print_outer def getFileUploadUrl(file): """ 获取文件上传地址 :return: """ contentType = "application/octet-stream" # 声明请求变量 body = { "contentMd5": file.contentMd5, "contentType": contentType, "convert2Pdf": False, "convertToHTML": True, "fileName": file.fileName, "fileSize": file.fileSize } # 构建请求参数body体 api_path = "/v3/files/file-upload-url" method = esigntool.httpMethodEnum.POST json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, api_path, body) # 签名并构造签名鉴权json请求头 resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送请求 print(resp.text) fileUploadUrl = resp.json()['data']['fileUploadUrl'] # 获取文件上传路径 fileId = resp.json()['data']['fileId'] print(resp.text) return fileUploadUrl, fileId @esign_run_print_outer def fileStreamUpload(binfile, fileUploadUrl): """ 文件流上传服务器 :return: """ contentMd5 = file.contentMd5 # 声明请求变量 contentType = "application/octet-stream" # 声明请求变量 method = esigntool.httpMethodEnum.PUT # 声明请求方法 json_headers = esigntool.buildFileUploadHeader(contentType, contentMd5) # 构建请求头 resp = requests.request(method, fileUploadUrl, data=binfile, headers=json_headers) # 发送请求 print(resp.text) return resp # 查询文件上传状态 @esign_run_print_outer def getUploadFileState(fileId): """ :param fileId:文件ID :return: """ api_path = "/v3/files/{}".format(fileId) method = esigntool.httpMethodEnum.GET if fileId == "": print("请设置文件ID") exit() # 签名并构造签名鉴权json请求头 json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, esigntool.apiPathSort(api_path)) # 发起请求 resp = requests.request(method, config.host + api_path, json=None, headers=json_headers) status = resp.json()['data']['fileStatus'] print(resp.text) return status @esign_run_print_outer def templatePageCreate(fileId): """ 获取制作合同模板页面 :return: """ body = { "docTemplateName": "某公司的劳动合同模板", "docTemplateType": 1, "fileId": fileId, "redirectUrl": "https://www.esign.cn/" } # 构建请求body体 if fileId == "": print("请设置文件ID") exit() api_path = "/v3/doc-templates/doc-template-create-url" # 拼接请求路径 method = esigntool.httpMethodEnum.POST # 声明请求方法 json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, api_path, body) # 签名并构造签名鉴权json请求头 resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送请求 docTemplateCreateUrl = resp.json()['data']['docTemplateCreateUrl'] docTemplateId = resp.json()['data']['docTemplateId'] print(resp.text) return docTemplateCreateUrl, docTemplateId @esign_run_print_outer def templateDetail(docTemplateId): """ 查询合同模板中控件详情 :return: """ body = { "redirectUrl": "https://www.esign.com/" } if docTemplateId == "": print("请设置模版ID") exit() api_path = "/v3/doc-templates/{}".format(docTemplateId) # 拼接请求路径 method = esigntool.httpMethodEnum.GET # 声明请求方法 json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, api_path, body) # 签名并构造签名鉴权json请求头 resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送网络请求 print(resp.text) return resp @esign_run_print_outer def templateCreateDoc(docTemplateId): """ 填写模板生成文件 :return: """ body = { "docTemplateId": docTemplateId, "fileName": "测试文件", "components": [ { "componentKey": "table", "componentValue": '[{"row":{"column1":"1","column2":"2","column3":"3","column4":"4","column5":"5"}},' '{"row":{"column1":"11","column2":"22","column3":"33","column4":"44",' '"column5":"55"}},{"row":{"column1":"111","column2":"222","column3":"333",' '"column4":"444","column5":"555"}},{"insertRow":"true","row":{"column1":"1111",' '"column2":"2222","column3":"3333","column4":"4444","column5":"5555"}}] ' } ] } if docTemplateId == "": print("请设置模版ID") exit() api_path = "/v3/files/create-by-doc-template" # 拼接请求路径 method = esigntool.httpMethodEnum.POST # 声明请求方法 json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, api_path, body) # 签名并构造签名鉴权json请求头 resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送网络请求 print(resp.text) fileId = resp.json()['data']['fileId'] return fileId if __name__ == '__main__': fileUrl = "D:\\**文件\\1.docx" # 本地文件路径,默认场景为动态模板,此处文件格式必须为.doc 或 .docx 格式 if config.appId == "" or config.scert == "" or fileUrl == "": print("请设置应用Appid和应用Secret,以及文件地址") exit() file = fileHelp(fileUrl) # 初始化文件辅助类 fileUploadUrl, fileId = getFileUploadUrl(file) # 获取文件ID&文件上传路径 fileStreamUpload(file.getBinFile(), fileUploadUrl) # 上传文件流 status = getUploadFileState(fileId) # 查询上传的文件状态 # 判断上传的文件是否转化完成,完成后才可以继续执行后续操作,2代表文件已转换为HTML while status != 2: time.sleep(1) status = getUploadFileState(fileId) docTemplateCreateUrl, docTemplateId = templatePageCreate(fileId) # 获取模版ID&在线设置模版的链接 # 获取到的docTemplateCreateUrl打开并设置动态表格控件,设置之后提交再运行后续接口,以设置3*5的表格为例,自定义编码设置为table # newFileId = templateCreateDoc(docTemplateId) #填充动态表格内容 # time.sleep(3) #填充需要时间 # getUploadFileState(newFileId) # 最终打印的效果中,表格变成了4*5,说明可以通过参数来自动添加行数