from PIL import Image, ImageDraw, ImageFont


def create_student_card(name, student_id, major, photo_path, output_path):
    # 1. 创建或加载背景 (宽600, 高400)
    card_width = 600
    card_height = 380
    # 创建一个浅蓝色背景
    background = Image.new(
        'RGB', (card_width, card_height), color=(240, 248, 255))
    draw = ImageDraw.Draw(background)

    # 2. 绘制装饰性顶部栏
    draw.rectangle([0, 0, card_width, 80], fill=(0, 51, 102))

    # 3. 加载字体 (请确保路径下有该字体文件，或使用系统路径)
    try:
        # Windows常用黑体路径，Linux/Mac请替换为对应的 .ttf 或 .otf
        font_title = ImageFont.truetype("simhei.ttf", 35)
        font_text = ImageFont.truetype("simhei.ttf", 24)
        font_label = ImageFont.truetype("simhei.ttf", 20)
    except:
        print("字体加载失败，使用默认字体（可能不支持中文）")
        font_title = font_text = font_label = ImageFont.load_default()

    # 4. 写入标题
    draw.text((card_width//2 - 100, 20), "学生证", fill="white", font=font_title)

    # 5. 处理学生照片
    try:
        photo = Image.open(photo_path)
        # 调整照片大小 (宽150, 高200)
        photo = photo.resize((150, 200))
        # 将照片粘贴到背景上
        background.paste(photo, (40, 110))
    except Exception as e:
        print(f"照片加载失败: {e}")
        # 如果没照片，画个灰色框占位
        draw.rectangle([40, 110, 190, 310], outline="gray", width=2)

    # 6. 写入学生信息
    start_x = 230
    start_y = 130
    line_height = 45

    info = [
        ("姓名：", name),
        ("学号：", student_id),
        ("专业：", major),
        ("有效期：", "2023 - 2027")
    ]

    for i, (label, value) in enumerate(info):
        # 画标签
        draw.text((start_x, start_y + i*line_height), label,
                  fill=(100, 100, 100), font=font_label)
        # 画具体内容
        draw.text((start_x + 70, start_y + i*line_height - 4),
                  value, fill="black", font=font_text)

    # 7. 绘制底部的装饰线
    draw.line([230, 310, 550, 310], fill=(0, 51, 102), width=3)
    draw.text((450, 320), "XX大学教务处", fill=(150, 150, 150), font=font_label)

    # 8. 保存结果
    background.save(output_path)
    print(f"证件已生成: {output_path}")
    background.show()


# --- 使用示例 ---
if __name__ == "__main__":
    # 请确保当前目录下有一张名为 photo.jpg 的图片，或者修改路径
    # 如果没有图片，代码会生成一个带文字的空白证件
    create_student_card(
        name="张三",
        student_id="2023090144",
        major="计算机科学与技术",
        photo_path="photo.jpg",  # 替换为你的照片路径
        output_path="student_card_result.png"
    )
