dvlyadmin_pro/backend/utils/create_certificate_image.py
2025-03-18 08:46:50 +08:00

98 lines
4.7 KiB
Python

#!/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')