cma_search/server/apps/edu/services.py

125 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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