【教学类-52-14】20240925动物数独(N宫格通用版)1图、2图、6图、有答案、无答案 组合版18套

背景需求:

制作了3-5宫格(1、2、6图)样式18组,它们用的都是(1、2、6图)的word模板,只是宫格数量不同,图片插入大小不同,是否可以做一个通用代码?

【教学类-52-11】20240919动物数独(4宫格)1图、2图、6图、有答案、无答案 组合版18套-CSDN博客文章浏览阅读1.7k次,点赞57次,收藏16次。【教学类-52-11】20240919动物数独(4宫格)1图、2图、6图、有答案、无答案 组合版18套https://blog.csdn.net/reasonsummer/article/details/142442572【教学类-52-13】20240924动物数独(5宫格)1图、2图、6图、有答案、无答案 组合版18套-CSDN博客文章浏览阅读636次,点赞19次,收藏4次。【教学类-52-13】20240924动物数独(5宫格)1图、2图、6图、有答案、无答案 组合版18套https://blog.csdn.net/reasonsummer/article/details/142497906【教学类-52-12】20240923动物数独(6宫格)1图、2图、6图、有答案、无答案 组合版18套-CSDN博客文章浏览阅读466次。【教学类-52-12】20240923动物数独(6宫格)1图、2图、6图、有答案、无答案 组合版18套https://blog.csdn.net/reasonsummer/article/details/142468814

通过修改名称,修改代码,实现这个需求。

0、材料准备

1、图片:

原来的四种动物是他人的(兔、猫、猴、猪)

为了做6宫格我又从网上下载了两个风格近似的图片——熊猫和狮子。

这次我想最多10宫格,所以需要10个动物,网上看看也配不齐同一个风格的。

为了避免版权问题,加上需要同样大小、同样风格的动物头像,我决定用通义万相生成的AI动物图片。

找到一套8月2日下载的彩色动物头像正面

从中挑选一些好看的头像(用ps把动物头像放大撑满画布,图案变大)选择了18种,大于10种。

为了了解生成一套要多少时间,添加了起始时间和终止时间

(星火讯飞生成)

from datetime import datetime# 记录程序开始时间
start_time = datetime.now()# 在这里编写你的程序代码# 记录程序结束时间
end_time = datetime.now()# 计算程序运行时间
elapsed_time = end_time - start_time# 打印程序运行时间
print("程序运行时间:", elapsed_time)

2、制作3-10宫格的模版(制作底图)

 3宫格基础模版

 4宫格基础模版

 5宫格基础模版

6宫格基础模版

7宫格基础模版

8宫格基础模版

9宫格基础模版

10宫格基础模版

3、关卡图:

1图关卡、2图关卡、6图关卡

代码解析:

通用代码中的N*N小图片大小需要预先设置好

代码展示


# -*- coding:utf-8 -*-'''
制作动物/脸谱数独N宫格通用版(3-10的黏贴关卡 A4 1图2图6图的所有组合 )
1.无答案:9种3:3,两两组合
2.有答案:27种 3:3:3,三三组合(实际需要其中9种)
作者:AI对话大师,阿夏
时间:2024年9月24日
'''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
from datetime import datetimenum=1
# int(input('生成几份\n'))
# 制作"单元格"# 几宫格
hsall=int(input('几宫格?(3-10)\n'))
# 程序开始的时间:start_time = datetime.now()# int(input('请输入4或9\n'))
hs=hsallpath=fr'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独N宫格'# 以下是1图、2图、6图的插入大小
psize=[19.6,14.1,9.39]
pg=[1,2,6]
gzs=[1,2,2]# 以下是3=10宫格word里面的图片大小尺寸
# 3=6.4 、4=4.8、5=4.2、6=3
gzsize=[6.4,4.8,3.84,3.2]
# 3=10宫格宫格
gzsgg=list(range(3, 11))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'\动物数独({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)# 3print("列数:", 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)]pic_list=pic_list[:hs]*hsprint(pic_list)print(len(pic_list))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('----3、黏贴图片卡,一页1图、1页2图 一页6图-------')# 处理每一组图片for group_index, group in enumerate(groups):# 创建新的Word文档doc = Document(path + fr'\动物数独({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个格子,两个数字都写4cell_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(hs)# 合并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")file_merger.close()# 删除零时文件夹shutil.rmtree(imagePath)print('-----第二板块、动物任务卡和答案卡一套,只要JPG-------')import random
from win32com.client import constants, gencache
from win32com.client.gencache import EnsureDispatch
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPHimport docxtpl
import pandas as pd
from docx2pdf import convertfrom docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
import copy# kk=int(input('空格数量,输入5,就是50%,就是空一半)\n'))print('------3-1、如果正好想生成1空、2空、3空、4空的数字,需要测算百分比的具体数字------')n=hsall
g=n*na=[]
for i in range(1,101):# 因为有100,所以三位数print(f'{n}宫格,难度{i:03d},抽取{i:03d}%:实际有{int(g*i/100):03d}空,已有图案{g-int(g*i/100):03d}')a.append(f'{n}宫格,难度{i:03d},抽取{i:03d}%:实际有{int(g*i/100):03d}空,已有图案{g-int(g*i/100):03d}')
print(a)
print(len(a))
# # 用冒号分割,如果0空,加入,# 创建一个空列表用于存储匹配的元素
b = []# 遍历原始列表
for element in a:# 如果找到匹配的元素,以":"为分隔符将字符串分割成两部分parts = element.split(":")# print(parts)# # 提取第一部分中包含的数字信息info = parts[1]b.append(info)
# 对列表b进行排序,并去除重复项
b = list(set(b))
b.sort(reverse=False)
print(b)f=[]
for d in range(len(b)):for c in a:# print(c)# 读取一个就中断if c[-15:]==b[d]:f.append(c)break
f.pop(0)
# 删除['6宫格,难度01,抽取1%:实际有00空,已有图案14', 
# f.pop(-1)
# # 删除'6宫格,难度100,抽取100%:实际有14空,已有图案00'
print(f)
# ['6宫格,难度007,抽取007%:实际有001空,已有图案015', '6宫格,难度013,抽取013%:实际有002空,已有图案014', '6宫格,难度019,抽取019%:实际有003空,已有图案013', '6宫格,难度025,抽取025%:实际有004空
# ,已有图案012', '6宫格,难度032,抽取032%:实际有005空,已有图案011', '6宫格,难度038,抽取038%:实际有004空,已有图案010', '6宫格,难度044,抽取044%:实际有007空,已有图案009', '6宫格,难度050,抽取050%:实际有008空,已有图案008', '6宫格,难度057,抽取057%:实际有009空,已有图案007', '6宫格,难度043,抽取043%:实际有010空,已有图案004', '6宫格,难度049,抽取049%:实际有011空,已有图案005', '6宫格,
# 难度075,抽取075%:实际有012空,已有图案004', '6宫格,难度082,抽取082%:实际有013空,已有图案003', '6宫格,难度088,抽取088%:实际有014空,已有图案002', '6宫格,难度094,抽取094%:实际有015空,已有图案
# 001']
print(len(f))
# 15
# 难度有15关# 提取百分数
g=[]
w=[]
for p in f:g.append(int(p[12:15]))    # 提取第4-7个数字=百分比数字w.append(int(p[20:23]))    # 提取空格数量
print(g)
# [7, 13, 19, 25, 32, 38, 44, 50, 57, 43, 49, 75, 82, 88, 94]
print(len(g))
# 15关
print(w)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
print(len(w))
# 34print('------2、制作6宫格随机数字------')# 制作"单元格"# 几宫格
for kk in range(len(g)):
# hs=int(input('请输入宫格数量(3,5.4,7,8,)\n'))#  因为有3-9的不同word模板,所以有不同的套数和字体大小ll=['3','5','6','7','8','10',] # 如果输入345mm=['53','32','32','32','32','32',]# 3对应的套数是4*3套nn=['36','36','36','24','24','22']# 3对应的写入单元格的数字大小36磅 # 因为有3-9的不同word模板,所以有不同的套数和字体大小ll=['{}'.format(hs)] # 如果输入345mm=['11']# 3对应的套数是4*3套nn=['36']# 3对应的写入单元格的数字大小34磅 for r in range(len(ll)):if hs ==int(ll[r]):# 底边几套.底边看有2份db=int(mm[r][0])# int(input('底边几套? 3\n'))# 侧边几套 侧边看也是2份print(db )        cb=int(mm[r][1])# int(input('侧边几套? 2\n'))print(cb)size=int(nn[r])print(size)        # 写入单元格数字的大小(撑满格子)# path=fr'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独{hs}宫格'# 新建一个”装N份word和PDF“的临时文件夹imagePath=path+r'\\零时Word'os.makedirs(imagePath,exist_ok=True) imagePatha=path+r'\06答案卡'imagePathq=path+r'\07任务卡'os.makedirs(imagePatha,exist_ok=True)os.makedirs(imagePathq,exist_ok=True)# 计算不同模板中的单元格坐标,放在bg里# 棋盘格子数量,# 如果长方形:底边3*侧边2,3*2=4套 ,就是10*10宫格,底边格子数量就是10*3=30,侧边格子数量就是10*2=20,# if db==cb:db_size = hs*dbcb_size=  hs*cbprint('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))# 确定每个宫格的左上角坐标 00 04 40  44 中间没有分栏的空格了,所以hs不用+1bgszm=[]for a in range(0,cb_size,hs):    # 0-11每隔4,写一个坐标  侧边yfor b in range(0,db_size,hs):  # 0-11每隔4,写一个坐标  侧边xbgszm.append('{}{}'.format('%02d'%a,'%02d'%b))print(bgszm)# 10宫格排列底3侧2共4套,底边格子数30# 10宫格排列底3侧2共4套,侧边格子数20# 10宫格排列底3侧2共4套,侧边格子数20# ['0000', '0010', '0020', '1000', '1010', '1020']# 转为元祖start_coordinates = [(int(s[0:2]), int(s[2:4])) for s in bgszm]cell_coordinates = []# 推算每个起始格子后面的单元格数字for start_coord in start_coordinates:i, j = start_coordsubgrid_coordinates = []for x in range(hs):for y in range(hs):subgrid_coordinates.append((i + x, j + y))cell_coordinates.append(subgrid_coordinates)# 打印结果(元祖样式)bg=[]for coordinates in cell_coordinates:# print(coordinates)     # [(4, 8), (4, 9), (4, 10), (5, 8), (5, 9), (5, 10), (4, 8), (4, 9), (4, 10)]for c in  coordinates:print(c)        # 元组 (1, 2) 样式s = ''.join(str(num).zfill(2) for num in c)   # zfill将元组 (1, 2) 转换为字符串 '0102' 特别是(5,10)这种必须转成2个数字0510print(str(s))        #  '12'bg.append(s)  #  '0102'print(bg)# 生成PDfP=[] for z in range(num):  P.clear()#    制作4份数据for j in range(db*cb):    #  3宫格,4*3=12套def generate_sudoku_board():# 创建一个9x9的二维列表,表示数独棋盘board = [[0] * hs for _ in range(hs)]# 递归函数,用于填充数独棋盘的每个单元格def filling_board(row, col):# 检查是否填充完成整个数独棋盘if row == hs:return True# 计算下一个单元格的行和列索引next_row = row if col < hs-1 else row + 1next_col = (col + 1) % hsimport mathr = int(math.sqrt(hs))print(r)# 获取当前单元格在小九宫格中的索引box_row = row // rbox_col = col // r# 随机生成1到9的数字numbers = random.sample(range(1, hs+1), hs)for num in numbers:# 检查行、列、小九宫格是否已经存在相同的数字if hs==4 or hs==9:if num not in board[row] and all(board[i][col] != num for i in range(hs)) and all(num != board[i][j] for i in range(box_row*r, box_row*r+r) for j in range(box_col*r, box_col*r+r)):board[row][col] = num# 递归填充下一个单元格if filling_board(next_row, next_col):return True# 回溯,将当前单元格重置为0board[row][col] = 0else:               # 检查行、列、小九宫格是否已经存在相同的数字if num not in board[row] and all(board[i][col] != num for i in range(hs)) and all(num != board[i][j] for i in range(box_row, box_row) for j in range(box_col, box_col)):board[row][col] = num# 递归填充下一个单元格if filling_board(next_row, next_col):return True# 回溯,将当前单元格重置为0board[row][col] = 0return False# 填充数独棋盘filling_board(0, 0)return board# 第一种是出现全部数字,也就是出现全部图案board1 = generate_sudoku_board()# 定义类型1def create_board1():                return board1# 定义类型2def create_board2(): # level数字越大代表游戏难度越大"""生成一个随机的数独棋盘,空白格少"""global board1  # 全局变量# 第二种定量出现空白格子board2 =  copy.deepcopy(board1)ggg=int(g[kk])blanks = random.sample(range(hs*hs), int(float(hs*hs*ggg)/100))  # 16*97/100=15.52是浮点数,然后再转成整数# blanks = 0for i in blanks:row = i // hscol = i % hsboard2[row][col] = 0# if random.randint(0, hs) < level:#     board1[row][col] = 0return board2# 16个数字v1 = create_board1()    # 16-X个数字    v2 = create_board2()v=v1+v2print(v)# [[1, 4, 2, 3], [3, 2, 4, 1], [4, 1, 3, 2], [2, 3, 1, 4], [1, 4, 2, 3], [3, 2, 4, 1], [4, 1, 3, 2], [0, 3, 1, 4]]# 提取每个数字P = ['' if a2 == 0 else a2 for a1 in v for a2 in a1]print(P)print(len(P))# [1, 4, 2, 3, 3, 2, 4, 1, 4, 1, 3, 2, 2, 3, 1, 4, 1, 4, 2, 3, 3, 2, 4, 1, 4, 1, 3, 2, '', 3, 1, 4]half_len = int(len(P) // 2)Q = [P[i:i+half_len] for i in range(0, len(P), half_len)]print(Q)# [[1, 4, 2, 3, 3, 2, 4, 1, 4, 1, 3, 2, 2, 3, 1, ],[4, 1, 4, 2, 3, 3, 2, 4, 1, 4, 1, 3, 2, '', 3, 1, 4]]time.sleep(hs)          print('------答案卡和题目卡------')  title=['答案卡','任务卡']imagePath1=path+r'\答案卡1'imagePath2=path+r'\任务卡1'os.makedirs(imagePath1,exist_ok=True)os.makedirs(imagePath2,exist_ok=True)ti=[path+r'\答案卡1',path+r'\任务卡1']       for tt in range(len(Q)):          doc = Document(path+fr'\动物数独(横板{hs}宫格).docx')  # 获取第一个表格,写难度用的table = doc.tables[0]for b1 in range(0,1):# 在'00'单元格中插入文本cell_00 = table.cell(0, b1)cell_00_paragraph = cell_00.paragraphs[0]cell_00_paragraph.text =f"动物数独 {hs}*{hs}  宫格 第 {kk+1} 关 {title[tt]}"cell_00_paragraph.style.font.bold = Truecell_00_paragraph.style.font.size = Pt(24)cell_00_paragraph.style.font.name = "黑体"cell_00_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#    table = doc.tables[1]          # 表0,表2 写标题用的# 标题写入3、5单元格  for t in range(0,len(bg)):             # 0-5是最下面一行,用来写关卡数字pp=int(bg[t][0:2])     # qq=int(bg[t][2:4])k=str(Q[tt][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(44)  #输入字体大小默认30号 换行(一页一份大卡片run.font.size = Pt(size) #是否加粗# run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255run.bold=True# paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距r = run._elementr.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  doc.save(ti[tt]+fr'\{z+1:02d}.docx')time.sleep(hs)print('------4、每张word转为pdf----')      from docx import Documentfrom docx.shared import Cm# 读取四张卡通动物的文件名animal_path = path+r'\02动物图片'  # 替换为实际的文件夹路径# 获取文件夹中所有文件的完整路径file_paths = [os.path.join(animal_path, file_name) for file_name in os.listdir(animal_path)]print(file_paths)doc = Document(ti[tt]+fr'\{z+1:02d}.docx')# 获取所有表格tables = doc.tables# 遍历每个表格for table in tables:# 遍历表格的行for i, row in enumerate(table.rows):# 遍历行的单元格for j, cell in enumerate(row.cells):# 读取单元格的文本值cell_text = cell.textfor x in range(0,hs):# 判断单元格的值是否为1if cell_text == f'{x+1}':# 删除原来的文本cell.text = ''# 插入图片run = cell.paragraphs[0].add_run()# 4.8格子for n in range(len(gzsgg)):if hs==gzsgg[n]:run.add_picture(file_paths[x], width=Cm(gzsize[n]), height=Cm(gzsize[n]))# 设置图片对齐方式为居中run.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER# 设置单元格的水平和垂直对齐方式为居中cell.vertical_alignment = WD_ALIGN_PARAGRAPH.CENTERcell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER# 保存修改后的文档doc.save(ti[tt]+fr'\{z+1:02d}.docx')time.sleep(hs)# # 关闭Word文档# doc.close()from docx2pdf import convert# docx 文件另存为PDF文件inputFile = ti[tt]+fr'\{z+1:02d}.docx'outputFile =ti[tt]+fr'\{z+1:02d}.pdf'# 先创建 不存在的 文件Af1 = open(outputFile, 'w')f1.close()# 再转换往PDF中写入内容convert(inputFile, outputFile)time.sleep(hs)       print('----------更改pdf新名字------------')                    # 两个pdfimport osfrom PyPDF2 import PdfFileReader, PdfFileWritertii=[path+r'\06答案卡',path+r'\07任务卡']for t3 in range(len(tii)):pdf_lst = [f for f in os.listdir(ti[t3]) if f.endswith('.pdf')]pdf_path = os.path.join(ti[t3], pdf_lst[0]) print(pdf_path)         # 源头文件名C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格\答案卡1\01.pdf    new_file_name = f"{title[t3]} 动物拼图{hs}宫格 难度{kk+1:02d} 空{int(w[kk]):03d}格({db}乘{cb}等于{num}份{db*cb}张).pdf"  # 重命名并移动文件到imagePatha文件夹下output_path = os.path.join(tii[t3], new_file_name)print(output_path)# 目标文件名C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格\答案卡\答案卡 动物拼图6宫格 难度01 空001格(1乘1等于1份1张).pdfos.rename(pdf_path, output_path)            # 源文件名,目标文件名time.sleep(hs)   shutil.rmtree(ti[t3]) #递归删除文件夹,即:删除非空文件夹time.sleep(hs)    # 防止转换时报错,预留生成时间print('----------第4步:把都有16管PDF关卡变png------------')#coding=utf-8
from win32com.client import Dispatch
import os
import re
import fitzwdFormatPDF = 17 #转换的类型
zoom_x=2 #尺寸大小,越大图片越清晰 5超大,这里改成2
zoom_y=2 #尺寸大小,越大图片越清晰,长宽保持一致
rotation_angle=0#旋转的角度,0为不旋转li=[path+r'\06答案卡',path+r'\07任务卡']
for l in li:for root, dirs, files in os.walk(l):for file in files:if re.search('\.pdf$', file):filename = os.path.abspath(root + "\\" + file)print(filename)# 打开PDF文件pdf = fitz.open(filename)# 逐页读取PDFfor pg in range(0, pdf.pageCount):page = pdf[pg]# 设置缩放和旋转系数trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)pm = page.getPixmap(matrix=trans, alpha=True)# 开始写图像pm.writePNG(filename.replace('.pdf', '') + str(pg+1) + ".png")pdf.close()# 删除生成文件PDF  for parent, dirnames, filenames in os.walk(l):for fn in filenames:if fn.lower().endswith('.pdf'):os.remove(os.path.join(parent, fn))print('-----第三板块、把动物任务卡和答案卡一套分别做成1页1份,1页2份,1页6份的pdf-------')psize=[9.39,9.39,14.1,14.1,19.6,19.6]
# ,
pg=[6,6,2,2,1,1]
# ,'2',
gzs=[2,2,2,2,1,1]
# '1','2',
nh=[1,2,1,2,1,2]# print('----1、读取行列-------')
from docx import Document
from docx.shared import Cm
import osfor x in range(len(pg)):    # # 新建一个”装N份word和PDF“的临时文件夹    imagePath11=path+r'\08答案卡pdf'imagePath22=path+r'\09任务卡pdf'os.makedirs(imagePath11,exist_ok=True)os.makedirs(imagePath22,exist_ok=True)tiii=[path+r'\08答案卡pdf',path+r'\09任务卡pdf',path+r'\08答案卡pdf',path+r'\09任务卡pdf',path+r'\08答案卡pdf',path+r'\09任务卡pdf']tii=[path+r'\06答案卡',path+r'\07任务卡',path+r'\06答案卡',path+r'\07任务卡',path+r'\06答案卡',path+r'\07任务卡']title=['答案卡','任务卡','答案卡','任务卡','答案卡','任务卡']# for x in range(len(tiii)):imagePath=path+r'\\零时Word'os.makedirs(imagePath,exist_ok=True)  # 若图片文件夹不存在就创建# 打开.docx文件doc = Document(path +fr'\动物数独({pg[x]}图关卡).docx')# 获取文档中的所有表格tables = doc.tables[0]import os           
#       file_paths = [os.path.join(tii[x], file) for file in os.listdir(tii[x])]# file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(tii[x]) for file in files]      pic_list_six = [file_paths[i:i+int(pg[x])] for i in range(0, len(file_paths), int(pg[x]))]print(pic_list_six)print(len(pic_list_six))# # # print('----3、黏贴图片卡,一页1图、1页2图 一页6图-------')# 处理每一组图片for group_index, group in enumerate(pic_list_six):# 创建新的Word文档doc = Document(path + fr'\动物数独({pg[x]}图关卡).docx')# print(group)# 遍历每个单元格,并插入图片for cell_index, image_file in enumerate(group):# 计算图片长宽(单位:厘米)cc=float(psize[x])# 插入图片到单元格table = doc.tables[0]cell = table.cell(int(cell_index /gzs[x]), cell_index % gzs[x])#         # 如果第一行有4个格子,两个数字都写4cell_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(hs+2)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:print(pdf)file_merger.append(pdf)# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大班A整页描字帖2乘5加表格-4名字-({}人).pdf".format(num))file_merger.write(tiii[x]+ fr"\{nh[x]:02} {pg[x]:02}图{title[x]}.pdf")# 01 06图答题卡.pdf# 02 06图任务卡.pdffile_merger.close()# doc.Close()# # print('----------第5步:删除临时文件夹------------')    import shutilshutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹print('-----第四板块、交叉合并有答案6套,无答案6套(1-1-1、1-1,1-2-2,1-2,2-1-1,2-1……----')
# 无答案:对09、05、文件夹(每份3个文件),进行交叉组合
import os
from PyPDF2 import PdfFileMergernewgz=path+fr'\(打印)动物数独{hs}宫格18套'
os.makedirs(newgz,exist_ok=True)address=[]
# '08答案卡pdf',
all=['09任务卡pdf','05操作卡pdf']
for y in all:new=path+fr'\{y}'   file_new = [os.path.join(new, f) for f in os.listdir(new)]# print(file_new)address.append(file_new)
print(address)# 推导公式
combinations = [[x, y] for x in address[0] for y in address[1]]
print(combinations)import PyPDF2for files in combinations:print(files)pdf_merger = PyPDF2.PdfFileMerger()for file in files:pdf_merger.append(file)output_file = newgz+fr"\动物数独{hs}宫格(无答案) {files[0][-9:-4] } {files[1][-9:-4] }.pdf"pdf_merger.write(output_file)pdf_merger.close()# 有答案:对08、09、05、文件夹(每份3个文件),进行交叉组合import os
from PyPDF2 import PdfFileMergeraddress=[]all=['08答案卡pdf','09任务卡pdf','05操作卡pdf']
for y in all:new=path+fr'\{y}'   file_new = [os.path.join(new, f) for f in os.listdir(new)]# print(file_new)address.append(file_new)
print(address)
print(len(address))# 推导公式
combinations = []for i in address[0]:for j in address[1]:for k in address[2]:combinations.append([i, j, k])
print(combinations)
print(len(combinations))import PyPDF2for files in combinations:print(files)pdf_merger = PyPDF2.PdfFileMerger()for file in files:pdf_merger.append(file)output_file = newgz+fr"\动物数独{hs}宫格(有答案) {files[0][-9:-4] } {files[1][-9:-4]} {files[2][-9:-4]}.pdf"pdf_merger.write(output_file)pdf_merger.close()# 删除答案卡任务卡样式不一致的import os
import shutil# 遍历文件夹下的所有文件
for file_name in os.listdir(newgz):# 检查文件是否为PDF格式if file_name.endswith(".pdf"):# 获取文件名前五个字符# 判断文件名是否符合条件if f"动物数独{hs}宫格(有答案)" in file_name:# 读取PDF文件内容# with open(os.path.join(folder_path, file_name), 'rb') as f:#     content = f.read()if  hs<10:   # 宫格数1-9,一位数# 检查第10和第15个字符是否相同if file_name[-15] == file_name[-21]:# 保留符合条件的PDF文件print(f"保留文件:{file_name}")else:# 删除不符合条件的PDF文件os.remove(os.path.join(newgz, file_name))print(f"删除文件:{file_name}")# # 分段测试用
# imagePath11=path+r'\08答案卡pdf'
# imagePath22=path+r'\09任务卡pdf'
# # imagePath=path+r'\零时Word'
# imagePatha=path+r'\06答案卡'
# imagePathq=path+r'\07任务卡'
# imagePathpaste=path+r'\05操作卡pdf'shutil.rmtree(imagePath11) #递归删除文件夹,即:删除非空文件夹   
shutil.rmtree(imagePath22) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePatha) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePathq) #递归删除文件夹,即:删除非空文件
shutil.rmtree(imagePathpaste)# 记录程序结束时间
end_time = datetime.now()# 计算程序运行时间
elapsed_time = end_time - start_timeprint(f"动物数独{hs}宫格程序开始时间:{start_time}")
print(f"动物数独{hs}宫格程序结束时间:{end_time}")# 打印程序运行时间
print("程序运行时间:", elapsed_time)

3宫格大约16分钟

3宫格提取前3张图片

4宫格大约19分钟

5宫格大约19分钟

报错了,下次再补时长

6宫格大约88分钟(间隔是6秒)

生成一次时间太长了,动不动就保存时间不够,总是报错,20240925生成3-6宫格,明天再做7-10宫格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431873.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13.第二阶段x86游戏实战2-动态模块地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例

轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、l…

2024.9.25 作业和思维导图

栈 #include <iostream> #include <stdexcept> using namespace std;class My_stack { private:int * data; //栈空间int capacity;int top; //栈顶元素的下标 protected:public:/******************成员函数*************///构造函数My_stack(int c 10):capac…

利士策分享,动摇时刻的自我救赎

利士策分享&#xff0c;动摇时刻的自我救赎 在人生的长河中&#xff0c;我们每个人都会面临各种挑战与抉择&#xff0c; 那些让人心生动摇的瞬间&#xff0c;如同夜空中偶尔掠过的乌云&#xff0c;遮蔽了前行的星光。 但正是这些动摇&#xff0c;构成了我们成长的轨迹&#x…

C++/CLI编程知识点小记

1.前言 本篇博文并非详细的C/CLI教程&#xff0c;仅是博主就学习和实践总结的部分知识点记录。 第一次接触C/CLI是2017年了&#xff0c;用C编写底层库&#xff0c;C/CLI编写wrapper层&#xff0c;在C#项目中进行调用&#xff0c;开发应用。 2.内容 C/CLI是一种混合编程&…

使用Maven创建一个Java项目并在repository中使用

JDK环境&#xff1a;1.8.0_371 Maven环境 &#xff1a;Apache Maven 3.6.3 配置完成jdk和mvn后&#xff0c;进入到指定文件夹下执行如下语句&#xff1a; mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…

Android开发okhttp下载图片带进度

Android开发okhttp下载图片带进度 下载网络图片的方法有很多&#xff0c;这次介绍写用okhttp来下载网络图片&#xff0c;主要我看中的是用okhttp下载有进度返回&#xff0c;提示下用户 一、思路&#xff1a; 用OkHttpClient().newCall(request) 二、效果图&#xff1a; 三、…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展&#xff0c;越来越多的应用层出不穷&#xff0c;伴随着数据应用的需求变多&#xff0c;为快速响应业务需求&#xff0c;很多企业在初期没有很好的规划的情况下&#xff0c;存在不同程度的烟囱式的开发模式&#xff0c;这样会导致企业不同业务线的数据…

分布式Id生成策略-美团Leaf

之前在做物流相关的项目时候&#xff0c;需要在分布式系统生成运单的id。 1.需求&#xff1a; 1.全局唯一性&#xff1a;不能出现重复的ID。&#xff08;基本要求&#xff09; 2.递增&#xff1a;大多数关系型数据库&#xff08;如 MySQL&#xff09;使用 B 树作为索引结构。…

大数据 flink 01 | 从零环境搭建 简单Demo 运行

什么是Flink Flink是一个开源的流处理和批处理框架,它能够处理无界和有界的数据流&#xff0c;具有高吞吐量、低延迟和容错性等特点 Flink 可以应用于多个领域如&#xff1a;实时数据处理、数据分析、机器学习、事件驱动等。 什么是流式处理&#xff1f;什么是批处理 流处理…

吴师兄:非科班程序员,创作出Github标星75.3K的宝藏项目,一周爆火……

这是《开发者说》的第18期&#xff0c;今天我们采访的是在Github上传LeetCode动画题解&#xff0c;获得75.3K标星宝藏项目的程序员吴师兄。 吴师兄从985大学毕业&#xff0c;从通信工程外包零基础转码程序员&#xff0c;逐渐进入一些中厂和大厂&#xff0c;工资也从三四千起步…

Elasticsearch——介绍、安装与初步使用

目录 1.初识 Elasticsearch1.1.了解 ES1.1.1.Elasticsearch 的作用1.1.2.ELK技术栈1.1.3.Elasticsearch 和 Lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3.Elasticsearch 的一些概念1.3.1.文档和字…

C++之stack 和 queue

目录 前言 1.stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack 的模拟 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2.3 queue的模拟 3.适配器 3.1 什么是适配器 3.2 STL标准库中stack和queue的底层结构 3.3 deque 的介绍&#xff08;了解&…

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

一日连发两款视频大模型,火山引擎杀疯了!

9月24日&#xff0c;字节跳动旗下火山引擎在深圳举办AI创新巡展&#xff0c;并首次对外发布豆包视频生成-PixelDance、豆包视频生成-Seaweed两款AI大模型&#xff0c;并公布了多项AI大模型的全新升级&#xff0c;以一种全新的姿态迎接AI时代的到来。 雷科技此次受邀参与巡展&a…

David律所代理Jose Martin幽默水果版权首发维权,尚未TRO

案件基本情况&#xff1a;起诉时间&#xff1a;2024/9/18案件号&#xff1a;2024-cv-08484原告&#xff1a;Jose Martin原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;西班牙的卓越艺术家Jose Martin以他非…

深度学习:常见损失函数简介--名称、作用和用法

目录 1. L1 Loss 2. NLL Loss (Negative Log Likelihood Loss) 3. NLLLoss2d 4. Gaussian NLL Loss 5. MSE Loss (Mean Squared Error Loss) 6. BCE Loss (Binary Cross-Entropy Loss) 7. Smooth L1 Loss 8. Cross Entropy Loss 1. L1 Loss 作用&#xff1a;计算预测值…

数据结构(Day18)

一、周学习内容 1、9.18 数据结构&#xff08;Day15&#xff09;-CSDN博客 2、9.19 数据结构&#xff08;Day16&#xff09;-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点&#xff08;元素&#xff09;。 不需要预估存储空间大小&#xff0c;长度动态增长或减小。…

jQuery——jQuery的2把利器

1、jQuery 核心函数 ① 简称&#xff1a;jQuery 函数&#xff0c;即为 $ 或者 jQuery ② jQuery 库向外直接暴露的是 $ 或者 jQuery ③ 引入 jQuery 库后&#xff0c;直接使用 $ 即可 当函数用&#xff1a;$&#xff08;xxx&#xff09; 当对象用&#xff1a;$.xxx&#x…

类与对象—python

一、类的含义 1.1类的作用&#xff08;理解&#xff09; 收集学生信息时&#xff0c;如果让同学们自主填写&#xff0c;信息的顺序、格式不一&#xff0c;内容混乱。如果发给同学们既定的表格&#xff0c;同学们按照规定的顺序、格式进行填写&#xff0c;那信息就会一目了然&…