
一、背景需求
昨天修改了四宫格数独的代码,把任务卡从一页6张改成一页2张
【教学类-52-10】20240919动物数独(4宫格)一页2张任务卡,有答案,最大图卡(最适合的商品)-CSDN博客文章浏览阅读553次,点赞12次,收藏6次。【教学类-52-10】20240919动物数独(4宫格)一页2张任务卡,有答案,最大图卡(最适合的商品)
https://blog.csdn.net/reasonsummer/article/details/142387324
同时在小红书里更改了商品图片


然后我想到一个问题:万一有客户对任务卡的大小(1页1图、1页2图、1页6图)或操作卡(1页1图、1页2图,1页6图)有不同的组合需求,那么我还要重新跑代码生成组合样式。
可是随机数独部分的代码生成时间实在太长了40分钟,跑一次太耗时。我想能不能直接做一套代码,自动生成所有可能生产的组合样式?
二、解题思路:
目前根据A4纸大小,共设计了三种图示大小




也就是说,在A4纸基础上,数独任务卡、动物操作卡、答案卡有三种样式:
1图19.6*19.6CM
2图14.1*14.1CM
6图9.39*9.39CM
各种大小的卡片的组合方式如下:
1、无答案组合(9种)

动物操作卡1图+任务卡1图
动物操作卡1图+任务卡2图
动物操作卡1图+任务卡6图
动物操作卡2图+任务卡1图
动物操作卡2图+任务卡2图
动物操作卡2图+任务卡6图
动物操作卡6图+任务卡1图
动物操作卡6图+任务卡2图
动物操作卡6图+任务卡6图
2、有答案组合27种(只要其中9种,任务卡和答案卡一样大,便于正反黏贴)

动物操作卡1图+任务卡1图+答案卡1图
动物操作卡1图+任务卡2图+答案卡2图
动物操作卡1图+任务卡6图+答案卡6图
动物操作卡2图+任务卡1图+答案卡1图
动物操作卡2图+任务卡2图+答案卡2图
动物操作卡2图+任务卡6图+答案卡6图
动物操作卡6图+任务卡1图+答案卡1图
动物操作卡6图+任务卡2图+答案卡2图
动物操作卡6图+任务卡6图+答案卡6图
三、设计结果
2024年9月22日,经过一整天的代码调式,终于把整个环节打通了。
# -*- coding:utf-8 -*-
'''
制作动物/脸谱数独4宫格的黏贴关卡 A4 1图2图6图的所有组合
1.无答案:9种3:3,两两组合
2.有答案:27种 3:3:3,三三组合(实际需要其中9种)
作者:AI对话大师,阿夏
时间:2024年9月19日
'''
print('-----第一板块、动物操作卡(大图片卡一页1图、1页2图 一页6图)-------')
# print('----1、读取行列-------')
import os,time
from docx import Document
from docx.shared import Cm
from docx2pdf import convert
from PyPDF2 import PdfMerger
import shutil
num=1
# int(input('生成几份\n'))
# 制作"单元格"# 几宫格
hsall=4
# int(input('请输入4或9\n'))
hs=hsall
path=fr'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独{hs}宫格'
psize=[19.6,14.1,9.39]
pg=[1,2,6]
gzs=[1,2,2]
for pt in range(len(pg)):
# # 新建一个”装N份word和PDF“的临时文件夹
imagePath=path+r'\\零时Word'
os.makedirs(imagePath,exist_ok=True) # 若图片文件夹不存在就创建
imagePathpaste=path+r'\\05操作卡pdf'
os.makedirs(imagePathpaste,exist_ok=True)
doc = Document(path +fr'\动物数独({hs}宫格横板){pg[pt]}图关卡.docx')
# 获取文档中的所有表格
tables = doc.tables
# 选择你需要读取的表格(在这种情况下是第1张表格)
target_table = tables[0]
# 获取所选表格的行数和列数
num_rows = len(target_table.rows)
num_columns = len(target_table.columns)
print("行数:", num_rows)
# 3
print("列数:", num_columns)
# # 2
print('----2、读取图片-------')
import os
# 指定文件夹路径
folder_path = path + r'\02动物图片'
pic_list = [os.path.join(folder_path, file_name) for file_name in os.listdir(folder_path)]*hs
# print(pic_list)
# print(len(pic_list))
groups = [pic_list[i:i + int(pg[pt])] for i in range(0, len(pic_list), int(pg[pt]))]
print(groups)
print(len(groups))
# # # print('----3、黏贴图片卡,一页1图、1页2图 一页6图-------')
# 处理每一组图片
for group_index, group in enumerate(groups):
# 创建新的Word文档
doc = Document(path + fr'\动物数独({hs}宫格横板){pg[pt]}图关卡.docx')
# print(group)
# 遍历每个单元格,并插入图片
for cell_index, image_file in enumerate(group):
# 计算图片长宽(单位:厘米)
cc=float(psize[pt])
# 插入图片到单元格
table = doc.tables[0]
cell = table.cell(int(cell_index / int(gzs[pt])), cell_index % int(gzs[pt]))
# # 如果第一行有4个格子,两个数字都写4
cell_paragraph = cell.paragraphs[0]
cell_paragraph.clear()
run = cell_paragraph.add_run()
run.add_picture(os.path.join(image_file), width=Cm(cc), height=Cm(cc))
cell_paragraph.alignment = 1 # 设置单元格中的文本居中
# 保存修改后的.docx文件
doc.save(imagePath + fr'\{group_index + 1:02d}页.docx')
# docx 文件另存为PDF文件
inputFile = imagePath + fr'\{group_index + 1:02d}页.docx' # 要转换的文件:已存在
outputFile = imagePath + fr'\{group_index + 1:02d}页.pdf' # 要生成的文件:不存在
convert(inputFile, outputFile)
time.sleep(8)
# 合并PDF文件
pdf_lst = [f for f in os.listdir(imagePath) if f.endswith('.pdf')]
pdf_lst = [os.path.join(imagePath, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfMerger()
for pdf in pdf_lst:
file_merger.append(pdf)
file_merger.write(imagePathpaste + fr"\03 {pg[pt]:02}图操作卡.pdf")