125 lines
5.2 KiB
Python
125 lines
5.2 KiB
Python
from PIL import ImageFont, ImageDraw, Image
|
||
from django.conf import settings
|
||
from apps.edu.models import Certificate
|
||
from datetime import date
|
||
font_dict = {
|
||
'font_1': "/media/cert/template/weibei.ttf",
|
||
'font_2': "/media/cert/template/SIMLI.TTF"
|
||
}
|
||
|
||
|
||
def make_img_x(instance: Certificate):
|
||
if instance.证书方案 == '202309':
|
||
titles = []
|
||
if instance.是否内审员:
|
||
titles.append('内审员')
|
||
if instance.是否授权签字人:
|
||
titles.append('授权签字人')
|
||
if instance.是否质量负责人:
|
||
titles.append('质量负责人')
|
||
if instance.是否最高管理者:
|
||
titles.append('最高管理者')
|
||
instance.证书地址 = make_img(instance.证书编号, instance.姓名, '、'.join(titles), font_dict[f'font_{instance.字体方案}'])
|
||
instance.save()
|
||
elif instance.证书方案 == '202312':
|
||
courses_list = [i.name for i in instance.课程列表.all()]
|
||
courses = ';'.join(courses_list) + '。'
|
||
instance.证书地址 = make_img_2(instance.证书编号, instance.姓名, instance.培训日期, instance.发证日期, courses, font_dict[f'font_{instance.字体方案}'])
|
||
instance.save()
|
||
|
||
def text_wrap(draw, text, font, max_width):
|
||
lines = []
|
||
|
||
# 将文本分割成单词
|
||
words = list(text)
|
||
# 尝试将单词拼成一行,使其宽度不要超过最大宽度
|
||
while words:
|
||
line = ''
|
||
# 当加上一个新单词不会让行宽超出最大宽度时就加上它
|
||
while words and draw.textlength(line + words[0], font=font) <= max_width:
|
||
line += words.pop(0)
|
||
lines.append(line.strip()) # 移除多余的空格
|
||
return lines
|
||
|
||
def make_img_2(number, name, att_date: date, issue_date: date, courses, font_name_path):
|
||
# 打开底版图片
|
||
imageFile = settings.BASE_DIR + '/media/cert/template/background2.jpg'
|
||
img = Image.open(imageFile)
|
||
# 选择字体与大小
|
||
font = ImageFont.truetype(settings.BASE_DIR+ font_name_path, 155)
|
||
font_courses = ImageFont.truetype(settings.BASE_DIR + "/media/cert/template/simkai.ttf", 100)
|
||
font_number = ImageFont.truetype(settings.BASE_DIR + "/media/cert/template/timesbd.ttf", 58)
|
||
font_day = ImageFont.truetype(settings.BASE_DIR + "/media/cert/template/Dengl.ttf", 68)
|
||
position_number = (1730, 606)
|
||
position_name = (720, 840)
|
||
position_courses = (490, 1070)
|
||
position_a_y = (1530, 900)
|
||
position_a_m = (1870, 900)
|
||
position_a_d = (2170, 900)
|
||
position_i_y = (2010, 1910)
|
||
position_i_m = (2254, 1910)
|
||
position_i_d = (2446, 1910)
|
||
color_name = (82, 68, 19)
|
||
color = (0,0,0)
|
||
draw = ImageDraw.Draw(img)
|
||
draw.text(position_name, name, color_name, font=font)
|
||
|
||
max_width = 2800 # 根据实际证书的内容区域来设置最大宽度
|
||
wrapped_courses = text_wrap(draw, courses, font_courses, max_width)
|
||
y_offset = 0
|
||
for line in wrapped_courses:
|
||
draw.text((position_courses[0], position_courses[1] + y_offset), line, (0,0,0), font=font_courses)
|
||
y_offset = y_offset + 180
|
||
draw.text(position_number, number, color_name, font=font_number)
|
||
draw.text(position_a_y, str(att_date.year), color, font=font_day)
|
||
draw.text(position_a_m, str(att_date.month), color, font=font_day)
|
||
draw.text(position_a_d, str(att_date.day), color, font=font_day)
|
||
draw.text(position_i_y, str(issue_date.year), color, font=font_day)
|
||
draw.text(position_i_m, str(issue_date.month), color, font=font_day)
|
||
draw.text(position_i_d, str(issue_date.day), color, font=font_day)
|
||
# 保存图片
|
||
path = f"/media/cert/{number}.jpg"
|
||
img.save(settings.BASE_DIR + path)
|
||
return path
|
||
|
||
def make_img(number, name, title, font_name_path):
|
||
# 打开底版图片
|
||
imageFile = settings.BASE_DIR + '/media/cert/template/background.jpg'
|
||
img = Image.open(imageFile)
|
||
# 选择字体与大小
|
||
font = ImageFont.truetype(settings.BASE_DIR+ font_name_path, 155)
|
||
font_title = ImageFont.truetype(settings.BASE_DIR + "/media/cert/template/siyuan.otf", 76)
|
||
font_number = ImageFont.truetype(settings.BASE_DIR + "/media/cert/template/timesbd.ttf", 58)
|
||
# print(font)
|
||
# 在图片上添加文字
|
||
# word = """
|
||
# 夜 归 小 朝
|
||
# 梦 鸟 舟 有 静
|
||
# 星 清 载 赤 安
|
||
# 河 风 我 羽 心
|
||
# 一 同 湖 暮 野
|
||
# 壶 桨 旋 落
|
||
# 茶 驻 停 霞
|
||
|
||
# ldc 2020-07-25
|
||
# """
|
||
word_number = number #"CTCZL20230001"
|
||
word_name = name #"曹前明"
|
||
word_title = title #"内审员、授权签字人、质量负责人、最高管理者"
|
||
# width = img.width
|
||
# height = img.height
|
||
# # 查看图片宽高
|
||
# print(width,height)
|
||
position_number = (1772, 645)
|
||
position_name = (628, 860)
|
||
position_title = (900, 1230)
|
||
color_name = (82, 68, 19)
|
||
color = (0,0,0)
|
||
draw = ImageDraw.Draw(img)
|
||
draw.text(position_name, word_name, color_name, font=font)
|
||
draw.text(position_title, word_title, color, font=font_title)
|
||
draw.text(position_number, word_number, color_name, font=font_number)
|
||
# 保存图片
|
||
path = f"/media/cert/{number}.jpg"
|
||
img.save(settings.BASE_DIR + path)
|
||
return path |