【办公类-109-07】20250823(有1寸照片)托小班新生的卡套长方形挂牌纸牌制作Python3.11.5 32(85*54mm横板和54*85mm竖版,一页9张)

📅 2026/7/21 17:21:08
【办公类-109-07】20250823(有1寸照片)托小班新生的卡套长方形挂牌纸牌制作Python3.11.5 32(85*54mm横板和54*85mm竖版,一页9张)
背景需求之前做了与卡套相同大小的名字信息卡。【办公类-109-04】20250807托小班新生的卡套长方形纸牌制作Python3.11.5 32(85*54mm横板和54*85mm竖版,一页9张)-CSDN博客文章浏览阅读996次,点赞31次,收藏12次。【办公类-109-04】20250807托小班新生的卡套长方形纸牌制作(85*54mm横板和54*85mm竖版,一页9张)https://blog.csdn.net/reasonsummer/article/details/150009366?spm=1011.2415.3001.5331今天上班了,有组长来要点名册我就把“点名册”“长方形卡套横竖卡”“圆形被子挂牌”都群发了10点开园区小会议,组长把资料群发了,看到手机的截图,老师们很惊讶:”这个真厉害,名字都有的!““为什么做拼音?”“啊呀,就是方便行政老师送被子、送小孩,能叫得出名字!”“你太厉害了!托小班孩子有的名字真不认识!”随后组长讨论了每个班级用什么颜色(四种浅色A4纸,小2分到浅蓝色A4)。她随后建议:“这卡片都是字,大人看没问题,小孩子不认识字,最好贴个照片!””照片贴哪里?“一位同事问,”这一面都是字,贴照片就把文字挡住了”我心里咯噔一下——我没有预留“贴照片”的位置,卡套里只能显示一面文字,不可能把照片贴在反面“大家先不要打印,我再做一份有照片位置的!”改进过程:1、照片的大小:卡套只有85*54mm,只能用1寸照片。查询大小2、预设做一张2.5*3.5CM的空白图片,中间写上“贴照片”横版:照片插入左侧竖版,照片插入园区下方主要就是调整文本位置+是否换行''' 1.制作20250901托小班长方形卡片,横版85*54mm和竖版54*85mm,一页9张单面 2.添加姓名拼音显示功能(拼音在姓名上方,带声调) 3.python 3.7.8 3. 横版布局:单列显示园区和班级,双列显示拼音、姓名和学号 4. 竖版布局:单列显示所有信息 5. 添加照片占位符:2.5cm宽*3.5cm高,黑色框线,中间写"贴照片" 豆包,deepseek,阿夏 20250826 ''' # ========== 记录程序开始时间 ========== import time start_time = time.time() # ========== 创建照片占位符图片 ========== import os from PIL import Image, ImageDraw, ImageFont import shutil import pandas as pd from pypinyin import pinyin, Style from docx import Document from docx.shared import Cm, Pt from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn from docx.oxml import OxmlElement import win32com.client import glob from PyPDF2 import PdfMerger def create_photo_placeholder(image_path): """创建照片占位符图片""" try: # 确保目录存在 os.makedirs(os.path.dirname(image_path), exist_ok=True) # 设置图片尺寸 (2.5cm x 3.5cm) width, height = int(2.5/2.54*300), int(3.5/2.54*300) # 转换为300dpi的像素 # 创建白色背景图片 img = Image.new('RGB', (width, height), 'white') draw = ImageDraw.Draw(img) # 绘制黑色边框 draw.rectangle([(10, 10), (width-10, height-10)], outline='black', width=2) # 添加文字 try: # 尝试使用微软雅黑字体 font = ImageFont.truetype("msyh.ttc", 20) except: # 如果找不到字体,使用默认字体 font = ImageFont.load_default() text = "贴照片" text_bbox = draw.textbbox((0, 0), text, font=font) text_width = text_bbox[2] - text_bbox[0] text_height = text_bbox[3] - text_bbox[1] text_x = (width - text_width) // 2 text_y = (height - text_height) // 2 draw.text((text_x, text_y), text, fill='black', font=font) # 保存图片 img.save(image_path) print(f"已创建照片占位符: {image_path}") return True except Exception as e: print(f"创建照片占位符失败: {str(e)}") return False # ========== 读取Excel数据 ========== def read_excel_data(file_path): """读取Excel文件所有工作表数据,返回字典{班级名: 数据列表}""" # 特殊姓氏读音字典 SPECIAL_SURNAMES = { "乐": "Yuè", "单": "Shàn", "解": "Xiè", "查": "Zhā", "盖": "Gě", "仇": "Qiú", "种": "Chóng", "朴": "Piáo", "翟": "Zhái", "区": "Ōu", "繁": "Pó", "覃": "Qín", "召": "Shào", "华": "Huà", "纪": "Jǐ", "曾": "Zēng", "缪": "Miào", "员": "Yùn", "车": "Chē", "过": "Guō", "尉": "Yù", "万": "Wàn" } # 复姓处理字典 COMPOUND_SURNAMES = { "欧阳": "Ōu yáng", "上官": "Shàng guān", "皇甫": "Huáng fǔ", "尉迟": "Yù chí", "万俟": "Mò qí", "长孙": "Zhǎng sūn", "司徒": "Sī tú", "司空": "Sī kōng", "司马": "Sī mǎ", "诸葛": "Zhū gě", "东方": "Dōng fāng", "独孤": "Dú gū", "慕容": "Mù róng", "宇文": "Yǔ wén" } def correct_surname_pinyin(name): """校正姓氏拼音,处理多音字问题""" if not name or not isinstance(name, str) or name.strip() == "": return "" name = name.strip() # 先检查复姓 for surname in COMPOUND_SURNAMES: if name.startswith(surname): surname_pinyin = COMPOUND_SURNAMES[surname] given_name = name[2:] given_pinyin = ' '.join([p[0] for p in pinyin(given_name, style=Style.TONE)]) return f"{surname_pinyin} {given_pinyin}" # 检查单姓 first_char = name[0] if first_char in SPECIAL_SURNAMES: surname_pinyin = SPECIAL_SURNAMES[first_char] given_name = name[1:] given_pinyin = ' '.join([p[0] for p in pinyin(given_name, style=Style.TONE)]) return f"{surname_pinyin} {given_pinyin}" return ' '.join([p[0] for p in pinyin(name, style=Style.TONE)]) try: xls = pd.ExcelFile(file_path) class_data = {} for sheet_name in xls.sheet_names: df = pd.read_excel( file_path, sheet_name=sheet_name, usecols=range(5), header=None, dtype={0: str} ) df = df.iloc[1:] data_list = [] for index, row in df.iterrows(): row_num = index + 2 raw_id = str(row[0]).strip() if pd.notna(row[0]) else "" if not raw_id.isdigit(): continue name = str(row[3]).strip() if pd.notna(row[3]) else "" if not name: continue try: id_num = int(raw_id) formatted_id = f"{id_num:02d}" campus = str(row[1]).strip() if pd.notna(row[1]) else "" class_name = str(row[2]).strip() if pd.notna(row[2]) else "" gender = str(row[4]).strip() if pd.notna(row[4]) else "" name_pinyin = correct_surname_pinyin(name) data_list.append({ 'id_display': f"{id_num}号", 'id_file': formatted_id, 'campus': campus, 'name': name, 'name_pinyin': name_pinyin, 'class_name': class_name, 'gender': gender }) except Exception as e: continue if data_list: class_data[sheet_name] = data_list return class_data except Exception as e: print(f"读取Excel文件失败:{str(e)}") return {} def create_word_documents(class_data, orientation, temp_dir, photo_path): """创建Word文档(横版或竖版)""" if orientation == "横版": return create_horizontal_documents(class_data, temp_dir, photo_path) else: return create_vertical_documents(class_data, t