背景需求
大班毕业在即,需要打印大班幼儿毕业证书。(已有打印好的彩色证书)
常规操作模式:
1,统一盖章,反复签字
200份证书,每张证书上需要盖园所章、园长签字200次
2. 每个班主任自己领取班级人数的毕业证书纸张,制作Word模板
(1)模板固定的信息:年龄、毕业年份、学校、日期,
(2)模板中替换的信息:幼儿名字、性别,需要打印一份,然后再修改名字和性别,再打印一份)
存在问题:
1、重复盖章、签字,费时费力:总务老师盖章、手都酸了。园长签字,手指麻了。
2、教师打印替换名字,费时费力:去年我也是大班老师,手动操作修改名字,再一个一个打印,不仅担心打印错误。还需要两位老师共同配合,一张一张放纸(证书纸不多)
小结:传统毕业证打印,存在耗费人工的问题(批量盖章、批量签名、分散替换打印)。
因此我希望用Python批量功能,实现200多份名册的批量打印。
材料准备:
一、扫描图片准备(签名、公章、毕业证图片版)
二、WORD模板准备
(1)插入证书模板
(2)在Word里插入文本框,摆放在相应的位置上。
姓名、性别用{{name}}{{sex}},年龄、毕业日期、学校、证书日期都是固定不修改的,就用预设文字、数字
(3)插入“”公章PNG格式”和“签名png格式”
模板做好了
三、EXCLE模板准备
收集所有班级的毕业证名单(一共8个大班)
EXCLE内部样式:
三、代码展示:
(一)单份EXCLE文件读取生成PDF:
用法:选择一个大班的EXCLe模板,输入一个班级的所有名单PDF。
代码展示:
# -*- coding:utf-8 -*- 1
'''
目的:大班毕业证书(一个班级单独打印)
作者:阿夏
日期:2023年6月12日 21:54
'''
# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import time
#
numnum=int(input('班级(阿拉伯数字1,2,3,4,5,7,8,9)\n'))
zpath=os.getcwd()+'\\'
zpath=r'D:\test\03办公类\11毕业册'+'\\'
file_path=zpath+r'\零时Word'
# 二、遍历excel,逐个生成word(form.docx是前面的模板)
try:
os.mkdir(file_path)
except:
pass
tpl = DocxTemplate(zpath+'毕业证书模板.docx')
IDcard = pd.read_excel(zpath+'(模板)大{}班毕业证名单.xlsx'.format(numnum))
nu=IDcard["nu"]
name = IDcard["name"]
sex =IDcard["sex"] # str.rstrip()用于去掉换行符
# math = autho['math']
# eng = autho['eng']
# 遍历excel行,逐个生成
num = IDcard.shape[0]
for i in range(num):
context = {
"nu": nu[i],
"name": name[i],
"sex": sex[i],
}
tpl = DocxTemplate(zpath+'毕业证书模板.docx')
tpl.render(context)
# tpl.save(file_path+r"\{} 的身份证.docx".format(name[i]))
#
tpl.save(r'D:\test\03办公类\11毕业册\零时Word\{}.docx'.format('%02d'%nu[i]))
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = r"D:\test\03办公类\11毕业册/零时Word/{}.docx".format('%02d'%nu[i]) # 要转换的文件:已存在
outputFile = r"D:\test\03办公类\11毕业册/零时Word/{}.pdf".format('%02d'%nu[i]) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = 'D:/test/03办公类/11毕业册/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfFileMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/下载幼儿姓氏笔画/(打印合集)自己写3个 中6姓名名笔画字帖(28人共{}张).pdf".format(int(len(path))))
file_merger.write("D:/test/03办公类/11毕业册/(打印合集)大{}班毕业证书人.pdf".format(numnum))
file_merger.close()
# doc.Close()
# print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('D:/test/03办公类/11毕业册/零时Word') #递归删除文件夹,即:删除非空文件夹
终端输入:
结果显示:
打印效果:
(二)多份EXCLE名单读取并生成PDF(批量):
用法:在所有大班信息都收集完成后,读取文件名字中的数字((模板)大1班毕业证名单、(模板)大2班毕业证名单)”,循环读取并自动生成。
代码展示:
# -*- coding:utf-8 -*- 1
'''
目的:大班毕业证书(所有大名单都收集后的批量打印)
作者:阿夏
日期:2023年6月12日 21:54
'''
# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
# numnum=int(input('班级(阿拉伯数字1,2,3,4,5,7,8,9)\n'))
Numnum=['1','2','3','4','5','7','8','9']
for numnum in Numnum:
zpath=os.getcwd()+'\\'
zpath=r'D:\test\03办公类\11毕业册'+'\\'
file_path=zpath+r'\零时Word'
# 二、遍历excel,逐个生成word(form.docx是前面的模板)
try:
os.mkdir(file_path)
except:
pass
tpl = DocxTemplate(zpath+'毕业证书模板.docx')
IDcard = pd.read_excel(zpath+'(模板)大{}班毕业证名单.xlsx'.format(numnum))
nu=IDcard["nu"]
name = IDcard["name"]
sex =IDcard["sex"] # str.rstrip()用于去掉换行符
# math = autho['math']
# eng = autho['eng']
# 遍历excel行,逐个生成
num = IDcard.shape[0]
for i in range(num):
context = {
"nu": nu[i],
"name": name[i],
"sex": sex[i],
}
tpl = DocxTemplate(zpath+'毕业证书模板.docx')
tpl.render(context)
# tpl.save(file_path+r"\{} 的身份证.docx".format(name[i]))
#
tpl.save(r'D:\test\03办公类\11毕业册\零时Word\{}.docx'.format('%02d'%nu[i]))
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = r"D:\test\03办公类\11毕业册/零时Word/{}.docx".format('%02d'%nu[i]) # 要转换的文件:已存在
outputFile = r"D:\test\03办公类\11毕业册/零时Word/{}.pdf".format('%02d'%nu[i]) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = 'D:/test/03办公类/11毕业册/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfFileMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/下载幼儿姓氏笔画/(打印合集)自己写3个 中6姓名名笔画字帖(28人共{}张).pdf".format(int(len(path))))
file_merger.write("D:/test/03办公类/11毕业册/(打印合集)大{}班毕业证书人.pdf".format(numnum))
file_merger.close()
# doc.Close()
# print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('D:/test/03办公类/11毕业册/零时Word') #递归删除文件夹,即:删除非空文件夹
终端显示(不用输入信息,直接运行即可)
最后生成的结果——8个班级的PDF格式
PDF样式:
使用反馈
前来领取证书的大班老师纷纷表示感谢:
1、不用手动修改:“你这样打掉了,我们就不用一个名字一个名字修改了,不用担心打错了,没有证书纸!”
2、不用等候盖章:“这下,不用把证书拿去给领导敲章、签名,方便多了!”
3、生成速度极快:“这么快就打好了?你真牛!”(运行程序1分钟,打印1分钟)