成品样式:
背景需求:
49号字体和60号字体可以批量出2*7个名字,但是一些孩子的名字笔画很多,如果用60号字体不容易画清里面的所有笔画。所以需要将名字的字号变大。
选了一些复杂的名字做样板,延时1*6个名字的批量设置方式。
word表格设置
不用分栏
EXCLE设置:
表格放在第一个
代码发布:
'''
作者:阿夏
时间:2022年11月19日
名称:大班学具描字帖A4全版 1*6个字 字号95
'''
import xlwt
import xlrd
import os
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
# hs=int(input('一行2个,需要几行(6行)\n'))
print('----------第1步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word')
wb= xlrd.open_workbook(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\学生名单.xlsx") #打开文件并返回一个工作蒲对象。open_workbook可以点进去看看函数里面的参数的含义之类的,很详细,英语不好的可以百度翻译,翻译出来的结果差不多。
sheet=wb.sheet_by_index(0) #通过索引的方式获取到某一个sheet,现在是获取的第一个sheet页,也可以通过sheet的名称进行获取,sheet_by_name('sheet名称')
col1=sheet.col_values(0)# 学号
col2=sheet.col_values(1)# 名字
num=len(col1)-1 # 第一列去掉第一行
# for z in range(0,num): #多少份
list=[]
nb=[]
nb2=[]
# 生成 基本组:“学号+名字“
for num in range(1,len(col1)):
doc = docx.Document(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\学生名单A4.docx")
name='{}{}'.format ('%02d'%int(col1[num]),col2[num]) #吧学号和名字拼在一起, 01张三
names=name
print(names)
for nn in range(6):
doc.add_paragraph(names)
# 字体这一段一定要再写一次
for paragraph in doc.paragraphs:
for run in paragraph.runs:
run.font.size = Pt(95) # 数字题目字体大小
run.font.bold = False #数字题目字体是否加粗 不加粗,5*8再加粗比较满,压抑了
run.font.name = 'Arial' # 控制是英文时的字体
run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 控制数字是中文时的字体
# paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置数字页眉居中对齐
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置数字页眉居中对齐
run.font.color.rgb = RGBColor(200,200,200) #设置颜色浅灰
# paragraph.paragraph_format.line_spacing=1.5 #数字中文字的段行距
paragraph.paragraph_format.line_spacing = Pt(115) #数字段间距
# 设置主要页边距 5
from docx.shared import Cm # 导入cm模块
doc.sections[0].top_margin = Cm(1)# sections[1]是第二节=第二页 上边距
doc.sections[0].bottom_margin = Cm(1)# sections[1]是第二节=第二页 下边距
doc.sections[0].left_margin = Cm(1) # sections[1]是第二节=第二页 左边距
doc.sections[0].right_margin = Cm(1)# sections[1]是第二节=第二页 右边距
# 设置其他页边距
doc.sections[0].gutter=Cm(0)# sections[1]是第二节=第二页 装订线 默认为0 左
doc.sections[0].header_distance=Cm(0.8)# sections[1]是第二节=第二页 页眉边距
doc.sections[0].footer_distance=Cm(1.3)# sections[1]是第二节=第二页 页脚边距
# 装订线还有一个位置属性,暂时未发现如何设置,默认为左,如果需求设置成右,可以建个模板docx文档导入。
# 设置纸张方向和大小 LANDSCAPE=横 PORTRAIT纵 默认信纸 纵
from docx.shared import Cm # 导入CM #
from docx.enum.section import WD_ORIENTATION # 导入纸张方向
doc.sections[0].page_height = Cm(29.7) # 设置A4纸的高度
doc.sections[0].page_width = Cm(21) # 设置A4纸的宽
doc.sections[0].orientation = WD_ORIENTATION.LANDSCAPE # 设置纸张方向为横向 L
# 设置分栏 如果不要,就把数字该为为1
from docx.oxml.ns import qn
doc.sections[0]._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '1') #把第二节页设置为2栏
doc.save(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word\{}.docx".format('%02d'%num))
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时Word/{}.docx".format('%02d'%num)# 要转换的文件:已存在
outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时Word/{}.pdf".format('%02d'%num) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = 'C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时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/桌面/描字帖/(打印合集)大班A整页描字帖1乘6笔画多名字-({}人).pdf".format(num))
file_merger.close()
# doc.Close()
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时Word') #递归删除文件夹,即:删除非空文件夹
重点说明:
作品展示:
感悟:
修改字体大小和段间距,来把字帖尽量控制在1页A4内。