#!/bin/python #coding: utf-8 # +------------------------------------------------------------------- # | version: 1.0 # +------------------------------------------------------------------- # | system: django-vue-lyadmin 专业版 # +------------------------------------------------------------------- # | Author: lybbn # +------------------------------------------------------------------- # | QQ: 1042594286 # +------------------------------------------------------------------- # ------------------------------ # 生成荣誉证书 # ------------------------------ import os import re from PIL import Image, ImageDraw, ImageFont import datetime import time from django.conf import settings from config import DOMAIN_HOST,BASE_DIR import random from io import BytesIO import requests def createCertificate(avatarurl,company,id,name,year,month,day): dirs = "usercertificate" bg = Image.open(os.path.join(BASE_DIR, 'media','certificate','bg.png')) x, y = bg.size stamp = Image.open(os.path.join(BASE_DIR, 'media','certificate','stamp.png')) #通过网络获取图片 # response = requests.get('https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eruSicV3HINJUQAV9kMlUCHEBZktHldvZOYpPmicj1cB0y2vKZxmyhtUsazNLuEFRqmNSI7E2dUWLfA/132') response = requests.get(avatarurl) response = response.content BytesIOObj = BytesIO() BytesIOObj.write(response) avatar = Image.open(BytesIOObj) title = company thefontpath = os.path.join(BASE_DIR, 'media','SourceHanSansCN-Medium.otf') titlefont = ImageFont.truetype(thefontpath,45) sn = id snfont = ImageFont.truetype(thefontpath, 45) namefont = ImageFont.truetype(thefontpath, 58) timefont = ImageFont.truetype(thefontpath, 50) timefont2 = ImageFont.truetype(thefontpath, 37) whitelayer = Image.new('RGBA', bg.size, (255,255,255)) whitelayer.paste(bg, (0, 0, x, y), bg) layer = Image.new('RGBA', bg.size, (0, 0, 0, 0)) avatar = avatar.resize((260, 300)) whitelayer.paste(avatar, (530, 560)) draw = ImageDraw.Draw(whitelayer) if len(name)<3: content1 = "%s 同志于 %s 年 %s 月 %s 日,参" % (name, year, month, day) content2 = "加合肥市印刷法规培训,经考试合格," content3 = "特发此证" elif len(name)<5: content1 = "%s 同志于 %s 年 %s 月 %s 日,"%(name,year,month,day) content2 = "参加合肥市印刷法规培训,经考试合格," content3 = "特发此证" else: content = "%s 同志于 %s年%s月%s日,参加合肥市印刷法规培训,经考试合格,特发此证" % (name, year, month, day) content1 = content[0:21] content2 = content[21:39] content3 = content[39:len(content)] draw.text((430,940),text=title,font=titlefont,fill='black') draw.text((430, 1075), text=sn, font=snfont, fill='black') # draw.text((210, 1218), text=name, font=namefont, fill='black') # draw.text((540, 1218), text=year, font=timefont, fill='black') # draw.text((730, 1218), text=month, font=timefont, fill='black') # draw.text((890, 1218), text=day, font=timefont, fill='black') draw.text((200, 1218), text=content1, font=namefont, fill='black') draw.text((160, 1318), text=content2, font=namefont, fill='black') draw.text((160, 1418), text=content3, font=namefont, fill='black') draw.text((780, 1715), text=year, font=timefont2, fill='black') draw.text((920, 1715), text=month, font=timefont2, fill='black') draw.text((1030, 1715), text=day, font=timefont2, fill='black') layer.paste(stamp,(layer.size[0] - 500, layer.size[1] - 680)) out = Image.composite(layer, whitelayer, layer) # out.show() curr_time = datetime.datetime.now() fn = time.strftime('%Y%m%d%H%M%S') fn = fn + '_%d' % random.randint(100, 999) # 重写合成文件名 image_name = fn + '.png' time_path = curr_time.strftime("%Y-%m-%d") img_task_dir = dirs # 对应models中的上传路径 sub_path = os.path.join(settings.MEDIA_ROOT, img_task_dir, time_path) if not os.path.exists(sub_path): os.makedirs(sub_path) image_path = os.path.join(sub_path, image_name) # web_img_url = settings.MEDIA_URL + img_task_dir + "/" + time_path + "/" + image_name#相对路径/media/xxx/xxxx/xxx.png web_img_url = DOMAIN_HOST + settings.MEDIA_URL + img_task_dir + "/" + time_path + "/" + image_name # 绝对路径http://xxx.xxx.com/media/xxx/xxxx/xxx.png # 另存图片 out.save(image_path) return web_img_url # if __name__ == "__main__": # createCertificate("https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eruSicV3HINJUQAV9kMlUCHEBZktHldvZOYpPmicj1cB0y2vKZxmyhtUsazNLuEFRqmNSI7E2dUWLfA/132",'12','121','LYBBN','2023','05','01')