背景需求:
第一笔有客户购买“9图的数字像素图”,我都没有在百度网盘里备份。
打开代码文件夹,发现生成的PDF很多,不知道是哪一个?
找到是这份,可是里面有大1班了,客户不一定是大1班。所以word模版的班级要空着,就需要修改模版
删除中3的文字,按四个空格(2个汉字距离)此时9个格子变动了
关闭页眉,9个格子正好凑满一页
打开代码一看
【教学类-13-01】20221112《数字色块图5*7*9-A4竖版》(中大班主题《》)_数组织涂色方格-CSDN博客文章浏览阅读705次。【教学类-13-01】20221112《数字色块图5*7*9-A4竖版》(中大班主题《》)_数组织涂色方格https://blog.csdn.net/reasonsummer/article/details/1278217281.发现这个代码的路径非常长(以前不懂得用变量,都是写全部的路径)
2.文件名用的Format(写的很长),现在我都用f和{n}写名称(缩短字符)
基于以上诸多问题,需要重新生成一份
优化代码(默认30份)
'''
数字像素图(A4竖板5*7 9个表)
作者:星火讯飞、阿夏
20250115修改
'''
import os,random
num=30
# int(input('生成多少份\n'))
Number=9
# int(input('抽取几个数字(10个中取9个=9个)\n'))
size=25
# float(input('数字大小(最大28,建议25)\n'))
weight=5
# int(input('表格宽度(5格)\n'))
height=7
# int(input('表格长度高度(7格)\n'))
print('----------第1步:提取所有图案------------')
import random
# m数字位置上的数字
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\像素图'
ten_path=path+r'\零时Word'
os.makedirs(ten_path,exist_ok=True)
print('----------第3步:随机抽取8个不重复的图案 ------------')
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
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for z in range(0,num): #多少份
m=str(random.randint(0,4)) # 涂色部分数字和非涂色部分数字不能一样 0,1,2,3,4 共5个(小)
n=str(random.randint(5,9)) # 涂色部分数字和非涂色部分数字不能一样 5,6,7,8,9 工5个(大)
N=[]
def same():
for r in range(0,len(nn)):
nn1=int(nn[r][0])
nn2=int(nn[r][1])
for nnn in range(nn1,nn2):
N.append(n)
mm1=int(mm[r][0])
mm2=int(mm[r][1])
for mmm in range(mm1,mm2):
N.append(m)
# print(N)
# 数字1 的坐标位置列表值
nn=['06','04','04','04','03','06']
mm=['02','01','01','01','03','00']
same()
# 数字2 的坐标位置列表值
nn=['06','04','02','02','04','06']
mm=['03','01','03','01','03','00']
same()
# 数字3 的坐标位置列表值
nn=['06','04','02','04','02','06']
mm=['03','01','03','01','03','00']
same()
# 数字4 的坐标位置列表值
nn=['06','01','02','01','02','01','02','03','06']
mm=['01','01','01','01','01','01','04','01','00']
same()
# 数字5 的坐标位置列表值
nn=['06','02','04','04','02','06']
mm=['03','01','03','01','03','00']
same()
# 数字6 的坐标位置列表值
nn=['06','02','04','02','01','02','06']
mm=['03','01','03','01','01','03','00']
same()
# 数字7 的坐标位置列表值
nn=['06','04','04','04','04','06']
mm=['03','01','01','01','01','00']
same()
# 数字8 的坐标位置列表值
nn=['06','02','01','02','02','01','02','06']
mm=['03','01','01','03','01','01','03','00']
same()
# 数字9 的坐标位置列表值
nn=['06','02','01','02','04','02','06']
mm=['03','01','01','03','01','03','00']
same()
# 数字0 的坐标位置列表值
nn=['06','02','01','02','01','02','01','02','06']
mm=['03','01','01','01','01','01','01','03','00']
same()
Nall=[] # [[],[],[]]的样式
for aaa in range(0,int(len(N)/int(weight*height))): # 把35*10个数字,分割成35一组,35一组,一共10组(0-9)
aaaa=(N[aaa*int(weight*height):aaa*int(weight*height)+int(weight*height)])
Nall.append(aaaa) # 10组的35个数字
print(Nall)
nine=random.sample(Nall,Number) # 从10个中间随机抽9组(排序打乱,数字会少一个)
print(nine)
doc = Document(path+r'\数字像素图竖版9个.docx')
for numbg in range(0,len(nine)): # [[],[],[]]的样式的索引数字
# print(num1)
NUMnum=nine[numbg]
print(NUMnum)
# ['6', '6', '6', '6', '6', '6', '2', '2', '2', '6', '6', '6', '6', '2', '6', '6', '2', '2', '2', '6', '6', '2', '6', '6', '6', '6', '2', '2', '2', '6', '6', '6', '6', '6', '6']
# ['00', '01', '02', '03', '04', '10', '11', '12', '13', '14', '20', '21', '22', '23', '24', '30', '31', '32', '33', '34', '40', '41', '42', '43', '44', '50', '51', '52', '53', '54', '60', '61', '62', '63', '64']
# 确定8*4表格的表格单元格坐标(如第1行第1格是0,0 ,第2行第3格是(1,2)
bg=[]
for x in range(0,height):
for y in range(0,weight):
ww='{}{}'.format(x,y)
bg.append(ww)
print(bg)
# ['00', '01', '02', '03', '04', '05', '06', '07', '10', '11', '12', '13', '14', '15', '16', '17', '20', '21', '22', '23', '24', '25', '26', '27', '30', '31', '32', '33', '34', '35', '36', '37']
# 提取表格单元格坐标和图形的坐标
table = doc.tables[numbg] # 一共有9个表格
for t in range(0,len(NUMnum)): # 图案的长度为8*4=32个 遍历0-32(32个)
pp=int(bg[t][0]) # 提取表格bg里面每个元素的第0个数字==单元格X坐标 t=索引数字
qq=int(bg[t][1])
k=NUMnum[t] # 提取list图案列表里面每个图形 t=索引数字
print(pp,qq,k)
run=table.cell(pp,qq).paragraphs[0].add_run(k) # 在单元格0,0(第1行第1列)输入第0个图图案
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(size) #输入字体大小默认30号
run.font.color.rgb = RGBColor(200,200,200) #设置颜色浅灰
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
doc.save(ten_path+fr'\{z:02}.docx')#保存为XX学号的电话号码word
from docx2pdf import convert
# docx 文件另存为PDF文件
inputFile = ten_path+fr'\{z:02}.docx'
outputFile = ten_path+fr'\{z:02}.pdf'
# 先创建 不存在的 文件
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 = ten_path
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(path+fr'\20250115 像素图数字竖版{weight}乘{height}竖向{Number}图({num}份).pdf')
# doc.Close()
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree(ten_path) #递归删除文件夹,即:删除非空文件夹
我感觉这里的1,上面有勾,下面有横线,不好看,还是改成了竖条。
代码展示:
234324