dynamic_table_demo.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # -*- coding: UTF-8 -*-
  2. import esigntool
  3. import requests
  4. from esigntool import esign_run_print_outer
  5. from esigntool.esign_file import fileHelp
  6. import time
  7. # 模版场景:支持动态表格,上传的文件必须是.doc 或 .docx 格式
  8. config = esigntool.config() # 初始化配置类
  9. @esign_run_print_outer
  10. def getFileUploadUrl(file):
  11. """
  12. 获取文件上传地址
  13. :return:
  14. """
  15. contentType = "application/octet-stream" # 声明请求变量
  16. body = {
  17. "contentMd5": file.contentMd5,
  18. "contentType": contentType,
  19. "convert2Pdf": False,
  20. "convertToHTML": True,
  21. "fileName": file.fileName,
  22. "fileSize": file.fileSize
  23. } # 构建请求参数body体
  24. api_path = "/v3/files/file-upload-url"
  25. method = esigntool.httpMethodEnum.POST
  26. json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert,
  27. method, api_path, body) # 签名并构造签名鉴权json请求头
  28. resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送请求
  29. print(resp.text)
  30. fileUploadUrl = resp.json()['data']['fileUploadUrl'] # 获取文件上传路径
  31. fileId = resp.json()['data']['fileId']
  32. print(resp.text)
  33. return fileUploadUrl, fileId
  34. @esign_run_print_outer
  35. def fileStreamUpload(binfile, fileUploadUrl):
  36. """
  37. 文件流上传服务器
  38. :return:
  39. """
  40. contentMd5 = file.contentMd5 # 声明请求变量
  41. contentType = "application/octet-stream" # 声明请求变量
  42. method = esigntool.httpMethodEnum.PUT # 声明请求方法
  43. json_headers = esigntool.buildFileUploadHeader(contentType, contentMd5) # 构建请求头
  44. resp = requests.request(method, fileUploadUrl, data=binfile, headers=json_headers) # 发送请求
  45. print(resp.text)
  46. return resp
  47. # 查询文件上传状态
  48. @esign_run_print_outer
  49. def getUploadFileState(fileId):
  50. """
  51. :param fileId:文件ID
  52. :return:
  53. """
  54. api_path = "/v3/files/{}".format(fileId)
  55. method = esigntool.httpMethodEnum.GET
  56. if fileId == "":
  57. print("请设置文件ID")
  58. exit()
  59. # 签名并构造签名鉴权json请求头
  60. json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert, method, esigntool.apiPathSort(api_path))
  61. # 发起请求
  62. resp = requests.request(method, config.host + api_path, json=None, headers=json_headers)
  63. status = resp.json()['data']['fileStatus']
  64. print(resp.text)
  65. return status
  66. @esign_run_print_outer
  67. def templatePageCreate(fileId):
  68. """
  69. 获取制作合同模板页面
  70. :return:
  71. """
  72. body = {
  73. "docTemplateName": "某公司的劳动合同模板",
  74. "docTemplateType": 1,
  75. "fileId": fileId,
  76. "redirectUrl": "https://www.esign.cn/"
  77. } # 构建请求body体
  78. if fileId == "":
  79. print("请设置文件ID")
  80. exit()
  81. api_path = "/v3/doc-templates/doc-template-create-url" # 拼接请求路径
  82. method = esigntool.httpMethodEnum.POST # 声明请求方法
  83. json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert,
  84. method, api_path, body) # 签名并构造签名鉴权json请求头
  85. resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送请求
  86. docTemplateCreateUrl = resp.json()['data']['docTemplateCreateUrl']
  87. docTemplateId = resp.json()['data']['docTemplateId']
  88. print(resp.text)
  89. return docTemplateCreateUrl, docTemplateId
  90. @esign_run_print_outer
  91. def templateDetail(docTemplateId):
  92. """
  93. 查询合同模板中控件详情
  94. :return:
  95. """
  96. body = {
  97. "redirectUrl": "https://www.esign.com/"
  98. }
  99. if docTemplateId == "":
  100. print("请设置模版ID")
  101. exit()
  102. api_path = "/v3/doc-templates/{}".format(docTemplateId) # 拼接请求路径
  103. method = esigntool.httpMethodEnum.GET # 声明请求方法
  104. json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert,
  105. method, api_path, body) # 签名并构造签名鉴权json请求头
  106. resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送网络请求
  107. print(resp.text)
  108. return resp
  109. @esign_run_print_outer
  110. def templateCreateDoc(docTemplateId):
  111. """
  112. 填写模板生成文件
  113. :return:
  114. """
  115. body = {
  116. "docTemplateId": docTemplateId,
  117. "fileName": "测试文件",
  118. "components": [
  119. {
  120. "componentKey": "table",
  121. "componentValue": '[{"row":{"column1":"1","column2":"2","column3":"3","column4":"4","column5":"5"}},'
  122. '{"row":{"column1":"11","column2":"22","column3":"33","column4":"44",'
  123. '"column5":"55"}},{"row":{"column1":"111","column2":"222","column3":"333",'
  124. '"column4":"444","column5":"555"}},{"insertRow":"true","row":{"column1":"1111",'
  125. '"column2":"2222","column3":"3333","column4":"4444","column5":"5555"}}] '
  126. }
  127. ]
  128. }
  129. if docTemplateId == "":
  130. print("请设置模版ID")
  131. exit()
  132. api_path = "/v3/files/create-by-doc-template" # 拼接请求路径
  133. method = esigntool.httpMethodEnum.POST # 声明请求方法
  134. json_headers = esigntool.buildSignJsonHeader(config.appId, config.scert,
  135. method, api_path, body) # 签名并构造签名鉴权json请求头
  136. resp = requests.request(method, config.host + api_path, json=body, headers=json_headers) # 发送网络请求
  137. print(resp.text)
  138. fileId = resp.json()['data']['fileId']
  139. return fileId
  140. if __name__ == '__main__':
  141. fileUrl = "D:\\**文件\\1.docx" # 本地文件路径,默认场景为动态模板,此处文件格式必须为.doc 或 .docx 格式
  142. if config.appId == "" or config.scert == "" or fileUrl == "":
  143. print("请设置应用Appid和应用Secret,以及文件地址")
  144. exit()
  145. file = fileHelp(fileUrl) # 初始化文件辅助类
  146. fileUploadUrl, fileId = getFileUploadUrl(file) # 获取文件ID&文件上传路径
  147. fileStreamUpload(file.getBinFile(), fileUploadUrl) # 上传文件流
  148. status = getUploadFileState(fileId) # 查询上传的文件状态
  149. # 判断上传的文件是否转化完成,完成后才可以继续执行后续操作,2代表文件已转换为HTML
  150. while status != 2:
  151. time.sleep(1)
  152. status = getUploadFileState(fileId)
  153. docTemplateCreateUrl, docTemplateId = templatePageCreate(fileId) # 获取模版ID&在线设置模版的链接
  154. # 获取到的docTemplateCreateUrl打开并设置动态表格控件,设置之后提交再运行后续接口,以设置3*5的表格为例,自定义编码设置为table
  155. # newFileId = templateCreateDoc(docTemplateId) #填充动态表格内容
  156. # time.sleep(3) #填充需要时间
  157. # getUploadFileState(newFileId)
  158. # 最终打印的效果中,表格变成了4*5,说明可以通过参数来自动添加行数