main.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # coding=utf-8
  2. import flask
  3. import imgkit
  4. import json
  5. import os
  6. import oss2
  7. import random
  8. from flask import request
  9. # 创建一个服务,把当前这个python文件当做一个服务
  10. server = flask.Flask(__name__)
  11. # 端口配置
  12. port = 5008
  13. host = '127.0.0.1'
  14. debug = True
  15. # 工具配置
  16. tool_path = r'E:\wkhtmltopdf\bin\wkhtmltoimage.exe'
  17. # OSS配置
  18. oss_end_point = 'oss-cn-shanghai.aliyuncs.com'
  19. oss_bucket = 'hzchart'
  20. oss_key_id = 'LTAIFMZYQhS2BTvW'
  21. oss_key_secret = '12kk1ptCHoGWedhBnKRVW5hRJzq9Fq'
  22. resource_host = 'https://hzstatic.hzinsights.com/'
  23. # server.config['JSON_AS_ASCII'] = False
  24. # @server.route()可以将普通函数转变为服务 登录接口的路径、请求方式
  25. @server.route('/htm2img', methods=['post'])
  26. def htm2img():
  27. # 获取参数
  28. req_data = request.get_json()
  29. if req_data is None:
  30. return json.dumps({'code': 5004, 'msg': '参数有误', 'data': ''}, ensure_ascii=False)
  31. # 参数校验
  32. contents = req_data['html_content']
  33. if contents is None or contents == '':
  34. return json.dumps({'code': 5004, 'msg': '获取html文本内容失败', 'data': ''}, ensure_ascii=False)
  35. width = req_data['width']
  36. if width <= 0:
  37. return json.dumps({'code': 5004, 'msg': '图片宽度有误', 'data': ''}, ensure_ascii=False)
  38. height = req_data['height']
  39. if height <= 0:
  40. return json.dumps({'code': 5004, 'msg': '图片长度有误', 'data': ''}, ensure_ascii=False)
  41. # 生成html文件
  42. rand_name = get_rand_string()
  43. html_path = 'html/' + rand_name + '.html'
  44. res = html2file(contents, html_path)
  45. if not res:
  46. return json.dumps({'code': 5004, 'msg': '生成html失败', 'data': ''}, ensure_ascii=False)
  47. # html转图片
  48. img_name = rand_name + '.jpg'
  49. img_path = html_to_img(html_path, img_name, width, height)
  50. if img_path == '':
  51. return json.dumps({'code': 400, 'msg': '生成图片失败', 'data': ''}, ensure_ascii=False)
  52. # 上传OSS
  53. upload_dir = 'static/images/yb/htm2img/'
  54. save_path = upload_dir + img_name
  55. upload_res = upload_oss_file(save_path, img_path)
  56. # 清除本地生成的html及图片
  57. clear_local_file(img_path, html_path)
  58. if upload_res.status == 200:
  59. resource_url = resource_host + save_path
  60. return json.dumps({'code': 200, 'msg': '生成图片成功', 'data': resource_url}, ensure_ascii=False)
  61. else:
  62. return json.dumps({'code': 400, 'msg': '生成图片失败', 'data': ''}, ensure_ascii=False)
  63. # html文件转为图片
  64. def html_to_img(html_url, img_name, width=100, height=100):
  65. path_wkimg = tool_path # 工具路径
  66. cfg = imgkit.config(wkhtmltoimage=path_wkimg)
  67. opt = {"width": width, "height": height, "quality": 100, "format": "jpg"}
  68. img_path = 'img/' + img_name
  69. imgkit.from_file(html_url, img_path, config=cfg, options=opt)
  70. try:
  71. os.path.isfile(img_path)
  72. return img_path
  73. except Exception as e:
  74. # print(e)
  75. return ''
  76. # 上传图片至OSS
  77. def upload_oss_file(save_path, file_path):
  78. auth = oss2.Auth(oss_key_id, oss_key_secret)
  79. bucket = oss2.Bucket(auth, oss_end_point, oss_bucket)
  80. return bucket.put_object_from_file(save_path, file_path)
  81. # 生成指定长度的随机字符串
  82. def get_rand_string(size=28):
  83. random_str = ''
  84. base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
  85. length = len(base_str) - 1
  86. for i in range(size):
  87. random_str += base_str[random.randint(0, length)]
  88. return random_str
  89. # 清除本地生成的文件
  90. def clear_local_file(img_path, html_path):
  91. try:
  92. # os.remove(img_path)
  93. # os.remove(html_path)
  94. return True
  95. except OSError as e:
  96. # print(e)
  97. return False
  98. # html文本生成文件
  99. def html2file(content, file_path):
  100. try:
  101. f = open(file_path, 'w', encoding='UTF-8')
  102. f.write(content)
  103. f.close()
  104. return True
  105. except Exception as e:
  106. # print(e)
  107. return False
  108. if __name__ == '__main__':
  109. server.run(debug=debug, port=port, host=host)