【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴 ...

打印 上一主题 下一主题

主题 527|帖子 527|积分 1581


配景需求:

前文提到6宫格数独的图片6*6=36图,假如将6张任务卡放在一个A4上,看上去6种动物很小,所以我换了一个word模板,变成了2张任务卡放在一个A4上。

【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案-CSDN博客文章浏览阅读846次,点赞25次,收藏6次。【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案
https://blog.csdn.net/reasonsummer/article/details/141903770

但是我没有放大贴图卡片,照旧每张10*10CM。


我想,假如将动物数独用于公开课,就必要比较大的学具,也就是1关任务卡贴1张A4,约莫是21*21CM一张,而动物贴图卡片也必要1张A4,约莫是21*21CM一张。

也就是自制KT 版的巨细是 6宫格图(20*6=120*120CM)


我们幼儿园用的KT版是1.2*2.4M,,恰好切出一个6宫格图案,可以用来撑满个别化的墙面。



话不多说,直接进上代码

  1. # 测试11*11格,2*2一共4套3*3 宫格
  2. '''
  3. 动物6宫格 任务卡一页一张(36张),答案卡一页一张(36张),贴图一页一张(36张)
  4. 108张很浪费彩墨,但是如果是公开课,还是值得的。
  5. 生成时间90分钟
  6. 动物数独 6宫格,
  7. 1、大卡片9.84CM一行,A4一页4张
  8. 2、参考图(空1格到空34格子,生成PDF,转为png
  9. 3、将png关卡图片做成8.82*9.7的小图卡(A4一页4张)
  10. 4、图片卡和关卡图合并在一个PDF
  11. 5、有答案
  12. 关卡图1张一页,最大化19.6
  13. 时间:2024年4月12日
  14. 作者:「Vaeeeeeee」,AI对话大师,阿夏
  15. 时间:2024年4月12日 13:35
  16. '''
  17. print('-----0、生成大图片卡-------')
  18.    
  19. # -*- coding:utf-8 -*-
  20. '''
  21. 制作动物/脸谱数独的黏贴关卡 A4一页4张图片 9.85CM
  22. 作者:AI对话大师,阿夏
  23. 时间:2024年6月3日
  24. # '''
  25. # print('----1、读取行列-------')
  26. import os,time
  27. from docx import Document
  28. from docx.shared import Cm
  29. from docx2pdf import convert
  30. from PyPDF2 import PdfMerger
  31. import shutil
  32. path=r'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格'
  33. # # 新建一个”装N份word和PDF“的临时文件夹
  34. imagePath=path+r'\\零时Word'
  35. os.makedirs(imagePath,exist_ok=True)  # 若图片文件夹不存在就创建
  36. imagePath4=path+r'\\汇总'
  37. os.makedirs(imagePath4,exist_ok=True)
  38. doc = Document(path +r'\动物数独(6宫格横板)1图关卡.docx')
  39. # 获取文档中的所有表格
  40. tables = doc.tables
  41. # 选择你需要读取的表格(在这种情况下是第1张表格)
  42. target_table = tables[0]
  43. # 获取所选表格的行数和列数
  44. num_rows = len(target_table.rows)
  45. num_columns = len(target_table.columns)
  46. print("行数:", num_rows)
  47. # 3
  48. print("列数:", num_columns)
  49. # # 2
  50. print('----2、读取图片-------')
  51. import os
  52. # 指定文件夹路径
  53. folder_path = path + r'\02动物图片'
  54. # 读取文件夹中所有文件的名称并加上路径
  55. pic_list = [os.path.join(root, file) for root, dirs, files in os.walk(folder_path) for file in files]*6
  56. # 打印文件名称和路径
  57. print(pic_list)
  58. print(len(pic_list))
  59. # print('----3、插入六套大图片-------')
  60. for f in range(len(pic_list)):
  61.     # 打开.docx文件
  62.     doc = Document(path + r'\动物数独(6宫格横板)1图关卡.docx')
  63.     # 获取文档中的所有表格
  64.     table = doc.tables[0]
  65.     # 遍历表格的所有行和单元格
  66.     i = 0
  67.     for row in table.rows:
  68.         for cell in row.cells:
  69.             # 在单元格中插入图片
  70.             cell_paragraph = cell.paragraphs[0]
  71.             run = cell_paragraph.add_run()
  72.             run.add_picture(pic_list[f], width=Cm(19.6), height=Cm(19.6))
  73.             cell_paragraph.alignment = 1  # 设置单元格中的文本居中
  74.             i += 1  # 移动到下一个图片路径
  75.     # 保存修改后的.docx文件
  76.     doc.save(imagePath + fr'\{f:02d}页.docx')
  77.     # docx 文件另存为PDF文件
  78.     inputFile = imagePath + fr'\{f:02d}页.docx'  # 要转换的文件:已存在
  79.     outputFile = imagePath + fr'\{f:02d}页.pdf'  # 要生成的文件:不存在
  80.     convert(inputFile, outputFile)
  81.     time.sleep(5)
  82. # 合并PDF文件
  83. pdf_lst = [f for f in os.listdir(imagePath) if f.endswith('.pdf')]
  84. pdf_lst = [os.path.join(imagePath, filename) for filename in pdf_lst]
  85. pdf_lst.sort()
  86. file_merger = PdfMerger()
  87. for pdf in pdf_lst:
  88.     file_merger.append(pdf)
  89. file_merger.write(imagePath4 + r"\02操作卡.pdf")
  90. file_merger.close()
  91. # 第5步
  92. shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
  93. print('----3、制作空白题卡-------')
  94. import random
  95. from win32com.client import constants, gencache
  96. from win32com.client.gencache import EnsureDispatch
  97. from docx import Document
  98. from docx.shared import Pt, RGBColor
  99. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  100. from docx.oxml.ns import qn
  101. from docx.enum.text import WD_ALIGN_PARAGRAPH
  102. import docxtpl
  103. import pandas as pd
  104. from docx2pdf import convert
  105. from docx.oxml.ns import nsdecls
  106. from docx.oxml import parse_xml
  107. import copy
  108. num=1
  109. # int(input('生成几份\n'))
  110. # 制作"单元格"# 几宫格
  111. hsall=6
  112. # int(input('请输入4或9\n'))
  113. hs=hsall
  114. # kk=int(input('空格数量,输入5,就是50%,就是空一半)\n'))
  115. print('------1、如果正好想生成1空、2空、3空、4空的数字,需要测算百分比的具体数字------')
  116. n=hsall
  117. g=n*n
  118. a=[]
  119. for i in range(1,101):
  120.     # 因为有100,所以三位数
  121.    
  122.     print(f'{n}宫格,难度{i:03d},抽取{i:03d}%:实际有{int(g*i/100):03d}空,已有图案{g-int(g*i/100):03d}')
  123.     a.append(f'{n}宫格,难度{i:03d},抽取{i:03d}%:实际有{int(g*i/100):03d}空,已有图案{g-int(g*i/100):03d}')
  124. print(a)
  125. print(len(a))
  126. # # 用冒号分割,如果0空,加入,
  127. # 创建一个空列表用于存储匹配的元素
  128. b = []
  129. # 遍历原始列表
  130. for element in a:
  131.     # 如果找到匹配的元素,以":"为分隔符将字符串分割成两部分
  132.     parts = element.split(":")
  133.     # print(parts)
  134.     # # 提取第一部分中包含的数字信息
  135.     info = parts[1]
  136.     b.append(info)
  137. # 对列表b进行排序,并去除重复项
  138. b = list(set(b))
  139. b.sort(reverse=False)
  140. print(b)
  141. f=[]
  142. for d in range(len(b)):
  143.     for c in a:
  144.         # print(c)
  145.         # 读取一个就中断
  146.         if c[-15:]==b[d]:
  147.             f.append(c)
  148.             break
  149. f.pop(0)
  150. # 删除['6宫格,难度01,抽取1%:实际有00空,已有图案14',
  151. # f.pop(-1)
  152. # # 删除'6宫格,难度100,抽取100%:实际有14空,已有图案00'
  153. print(f)
  154. # ['6宫格,难度007,抽取007%:实际有001空,已有图案015', '6宫格,难度013,抽取013%:实际有002空,已有图案014', '6宫格,难度019,抽取019%:实际有003空,已有图案013', '6宫格,难度025,抽取025%:实际有004空
  155. # ,已有图案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宫格,
  156. # 难度075,抽取075%:实际有012空,已有图案004', '6宫格,难度082,抽取082%:实际有013空,已有图案003', '6宫格,难度088,抽取088%:实际有014空,已有图案002', '6宫格,难度094,抽取094%:实际有015空,已有图案
  157. # 001']
  158. print(len(f))
  159. # 15
  160. # 难度有15关
  161. # 提取百分数
  162. g=[]
  163. w=[]
  164. for p in f:
  165.     g.append(int(p[12:15]))    # 提取第4-7个数字=百分比数字
  166.     w.append(int(p[20:23]))    # 提取空格数量
  167. print(g)
  168. # [7, 13, 19, 25, 32, 38, 44, 50, 57, 43, 49, 75, 82, 88, 94]
  169. print(len(g))
  170. # 15关
  171. print(w)
  172. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
  173. print(len(w))
  174. # 34
  175. print('------2、制作6宫格随机数字------')
  176. # 制作"单元格"# 几宫格
  177. for kk in range(len(g)):
  178. # hs=int(input('请输入宫格数量(3,5.6,7,8,)\n'))
  179.    
  180.     # 因为有3-9的不同word模板,所以有不同的套数和字体大小
  181.     ll=['6'] # 如果输入345
  182.     mm=['11']# 3对应的套数是4*3套
  183.     nn=['36']# 3对应的写入单元格的数字大小36磅
  184.     for r in range(len(ll)):
  185.         if hs ==int(ll[r]):
  186.             # 底边几套.底边看有2份
  187.             db=int(mm[r][0])
  188.             # int(input('底边几套? 3\n'))
  189.             # 侧边几套 侧边看也是2份
  190.             print(db )        
  191.             cb=int(mm[r][1])
  192.             # int(input('侧边几套? 2\n'))
  193.             print(cb)
  194.             size=int(nn[r])
  195.             print(size)        # 写入单元格数字的大小(撑满格子)
  196.     path=r'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格'
  197.     # 新建一个”装N份word和PDF“的临时文件夹
  198.     imagePath=path+r'\\零时Word'
  199.     os.makedirs(imagePath,exist_ok=True)
  200.     # imagePath2=path+r'\\零时jpg1'
  201.     # os.makedirs(imagePath2,exist_ok=True)
  202.     # imagePath3=path+r'\\零时jpg2'
  203.     # os.makedirs(imagePath3,exist_ok=True)
  204.     imagePath4=path+r'\\汇总'
  205.     os.makedirs(imagePath4,exist_ok=True)
  206.     imagePatha=path+r'\答案'
  207.     imagePathq=path+r'\题目'
  208.     os.makedirs(imagePatha,exist_ok=True)
  209.     os.makedirs(imagePathq,exist_ok=True)
  210.     # 计算不同模板中的单元格坐标,放在bg里
  211.     # 棋盘格子数量,
  212.     # 如果长方形:底边3*侧边2,3*2=4套 ,就是10*10宫格,底边格子数量就是10*3=30,侧边格子数量就是10*2=20,
  213.     # if db==cb:
  214.     db_size = hs*db
  215.     cb_size=  hs*cb
  216.     print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
  217.     print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))
  218.     # 确定每个宫格的左上角坐标 00 04 40  44 中间没有分栏的空格了,所以hs不用+1
  219.     bgszm=[]
  220.     for a in range(0,cb_size,hs):    # 0-11每隔4,写一个坐标  侧边y
  221.         for b in range(0,db_size,hs):  # 0-11每隔4,写一个坐标  侧边x
  222.             bgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
  223.     print(bgszm)
  224.     # 10宫格排列底3侧2共4套,底边格子数30
  225.     # 10宫格排列底3侧2共4套,侧边格子数20
  226.     # 10宫格排列底3侧2共4套,侧边格子数20
  227.     # ['0000', '0010', '0020', '1000', '1010', '1020']
  228.         
  229.     # 转为元祖
  230.     start_coordinates = [(int(s[0:2]), int(s[2:4])) for s in bgszm]
  231.     cell_coordinates = []
  232.     # 推算每个起始格子后面的单元格数字
  233.     for start_coord in start_coordinates:
  234.         i, j = start_coord
  235.         subgrid_coordinates = []
  236.         for x in range(hs):
  237.             for y in range(hs):
  238.                 subgrid_coordinates.append((i + x, j + y))
  239.         cell_coordinates.append(subgrid_coordinates)
  240.     # 打印结果(元祖样式)
  241.     bg=[]
  242.     for coordinates in cell_coordinates:
  243.         # print(coordinates)     # [(4, 8), (4, 9), (4, 10), (5, 8), (5, 9), (5, 10), (4, 8), (4, 9), (4, 10)]
  244.         for c in  coordinates:
  245.             print(c)        # 元组 (1, 2) 样式
  246.             s = ''.join(str(num).zfill(2) for num in c)   # zfill将元组 (1, 2) 转换为字符串 '0102' 特别是(5,10)这种必须转成2个数字0510
  247.             print(str(s))        #  '12'
  248.             bg.append(s)  #  '0102'
  249.     print(bg)
  250.     P=[]
  251.     for z in range(num):  
  252.         P.clear()
  253.         #    制作4份数据
  254.         for j in range(db*cb):    #  3宫格,4*3=12套
  255.         
  256.         # ————————————————生成随机宫格,按比例空缺格子
  257.         # 版权声明:本文为CSDN博主「Vaeeeeeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  258.         # 原文链接:https://blog.csdn.net/m0_46366547/article/details/131334720
  259.             def generate_sudoku_board():
  260.                 # 函数体生成数独库表盘
  261.                 # 创建一个9x9的二维列表,表示数独棋盘
  262.                 board = [[0] * hs for _ in range(hs)]
  263.                 # 递归函数,用于填充数独棋盘的每个单元格
  264.                 def filling_board(row, col):
  265.                     # 检查是否填充完成整个数独棋盘
  266.                     if row == hs:
  267.                         return True
  268.                     
  269.                     # 计算下一个单元格的行和列索引
  270.                     next_row = row if col < hs-1 else row + 1
  271.                     next_col = (col + 1) % hs
  272.                     # 获取当前单元格在小九宫格中的索引
  273.                     box_row = row
  274.                     box_col = col
  275.                     # 随机生成1到9的数字
  276.                     numbers = random.sample(range(1, hs+1), hs)
  277.                     for num in numbers:
  278.                         # 检查行、列、小九宫格是否已经存在相同的数字
  279.                         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)):
  280.                             board[row][col] = num
  281.                             # 递归填充下一个单元格
  282.                             if filling_board(next_row, next_col):
  283.                                 return True
  284.                             # 回溯,将当前单元格重置为0
  285.                             board[row][col] = 0
  286.                     return False
  287.                 # 填充数独棋盘
  288.                 filling_board(0, 0)
  289.                 return board   
  290.                
  291.             # 第一种是出现全部数字,也就是出现全部图案
  292.             board1 = generate_sudoku_board()
  293.             # 定义类型1
  294.             def create_board1():               
  295.                 return board1
  296.             # 定义类型2
  297.             def create_board2(): # level数字越大代表游戏难度越大
  298.                 """
  299.                 生成一个随机的数独棋盘,空白格少
  300.                 """
  301.                 global board1  # 全局变量
  302.                
  303.                 # 第二种定量出现空白格子
  304.                 board2 =  copy.deepcopy(board1)
  305.                 ggg=int(g[kk])
  306.                 blanks = random.sample(range(hs*hs), int(float(hs*hs*ggg)/100))  # 16*97/100=15.52是浮点数,然后再转成整数
  307.                 # blanks = 0
  308.                 for i in blanks:
  309.                     row = i // hs
  310.                     col = i % hs
  311.                     board2[row][col] = 0
  312.                         
  313.                     # if random.randint(0, hs) < level:
  314.                     #     board1[row][col] = 0
  315.                 return board2
  316.             # 16个数字
  317.             v1 = create_board1()   
  318.             # 16-X个数字   
  319.             v2 = create_board2()
  320.             v=v1+v2
  321.             print(v)
  322.             # [[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]]
  323.             
  324.             # 提取每个数字
  325.             P = ['' if a2 == 0 else a2 for a1 in v for a2 in a1]
  326.             print(P)
  327.             print(len(P))
  328.             # [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]
  329.             
  330.             half_len = int(len(P) // 2)
  331.             Q = [P[i:i+half_len] for i in range(0, len(P), half_len)]
  332.             print(Q)
  333.             # [[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]]
  334.             
  335.             time.sleep(10)         
  336.                   
  337.         print('------答案卡和题目卡------')  
  338.         
  339.         title=['答案','题目']
  340.         imagePath1=path+r'\答案1'
  341.         imagePath2=path+r'\题目1'
  342.         os.makedirs(imagePath1,exist_ok=True)
  343.         os.makedirs(imagePath2,exist_ok=True)
  344.       
  345.                
  346.         ti=[path+r'\答案1',path+r'\题目1']      
  347.         
  348.         for tt in range(len(Q)):         
  349.             doc = Document(path+r'\动物数独(6宫格横板).docx')  
  350.             # 获取第一个表格,写难度用的
  351.             table = doc.tables[0]
  352.             for b1 in range(0,1):
  353.                 # 在'00'单元格中插入文本
  354.                 cell_00 = table.cell(0, b1)
  355.                 cell_00_paragraph = cell_00.paragraphs[0]
  356.                 cell_00_paragraph.text =f"第 {kk+1} 关 {title[tt]}"
  357.                 cell_00_paragraph.style.font.bold = True
  358.                 cell_00_paragraph.style.font.size = Pt(24)
  359.                 cell_00_paragraph.style.font.name = "黑体"
  360.                 cell_00_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  361.             #   
  362.             table = doc.tables[1]          # 表0,表2 写标题用的
  363.             # 标题写入3、5单元格  
  364.             for t in range(0,len(bg)):             # 0-5是最下面一行,用来写关卡数字
  365.                 pp=int(bg[t][0:2])     #
  366.                 qq=int(bg[t][2:4])
  367.                 k=str(Q[tt][t])              # 提取list图案列表里面每个图形  t=索引数字
  368.                 print(pp,qq,k)
  369.                 # 图案符号的字体、大小参数
  370.                 run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个图图案
  371.                 run.font.name = '黑体'#输入时默认华文彩云字体
  372.                 # run.font.size = Pt(44)  #输入字体大小默认30号 换行(一页一份大卡片
  373.                 run.font.size = Pt(size) #是否加粗
  374.                 # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
  375.                 run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255
  376.                 run.bold=True
  377.                 # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
  378.             
  379.                 r = run._element
  380.                 r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
  381.                 table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  
  382.             doc.save(ti[tt]+fr'\{z+1:02d}.docx')
  383.             time.sleep(3)
  384.         
  385.             print('------4、每张word转为pdf----')      
  386.             from docx import Document
  387.             from docx.shared import Cm
  388.             # 读取四张卡通动物的文件名
  389.             animal_path = path+r'\02动物图片'  # 替换为实际的文件夹路径
  390.             # 获取文件夹中所有文件的完整路径
  391.             file_paths = [os.path.join(animal_path, file_name) for file_name in os.listdir(animal_path)]
  392.             print(file_paths)
  393.         
  394.             doc = Document(ti[tt]+fr'\{z+1:02d}.docx')
  395.            
  396.             # 获取所有表格
  397.             tables = doc.tables
  398.             # 遍历每个表格
  399.             for table in tables:
  400.                 # 遍历表格的行
  401.                 for i, row in enumerate(table.rows):
  402.                     # 遍历行的单元格
  403.                     for j, cell in enumerate(row.cells):
  404.                         # 读取单元格的文本值
  405.                         cell_text = cell.text
  406.                         for x in range(0,hs):
  407.                         # 判断单元格的值是否为1
  408.                             if cell_text == f'{x+1}':
  409.                                 # 删除原来的文本
  410.                                 cell.text = ''
  411.                                 # 插入图片
  412.                                 run = cell.paragraphs[0].add_run()
  413.                                 # 4.8格子
  414.                                 run.add_picture(file_paths[x], width=Cm(3), height=Cm(3))
  415.                                     # 设置图片对齐方式为居中
  416.                                 run.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  417.                                 # 设置单元格的水平和垂直对齐方式为居中
  418.                                 cell.vertical_alignment = WD_ALIGN_PARAGRAPH.CENTER
  419.                                 cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
  420.                            
  421.             # 保存修改后的文档
  422.             doc.save(ti[tt]+fr'\{z+1:02d}.docx')
  423.             time.sleep(2)
  424.             # # 关闭Word文档
  425.             # doc.close()
  426.             
  427.             from docx2pdf import convert
  428.             # docx 文件另存为PDF文件
  429.             inputFile = ti[tt]+fr'\{z+1:02d}.docx'
  430.             outputFile =ti[tt]+fr'\{z+1:02d}.pdf'
  431.             # 先创建 不存在的 文件
  432.             f1 = open(outputFile, 'w')
  433.             f1.close()
  434.             # 再转换往PDF中写入内容
  435.             convert(inputFile, outputFile)
  436.             time.sleep(10)      
  437.             
  438.         print('----------更改pdf新名字------------')                    
  439.         # 两个pdf
  440.         import os
  441.         from PyPDF2 import PdfFileReader, PdfFileWriter
  442.         
  443.         tii=[path+r'\答案',path+r'\题目']
  444.         
  445.         for t3 in range(len(tii)):
  446.             pdf_lst = [f for f in os.listdir(ti[t3]) if f.endswith('.pdf')]
  447.             pdf_path = os.path.join(ti[t3], pdf_lst[0])
  448.             print(pdf_path)         
  449.             # 源头文件名C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格\答案1\01.pdf   
  450.             new_file_name = f"{title[t3]} 动物拼图{hs}宫格 难度{kk+1:02d} 空{int(w[kk]):03d}格({db}乘{cb}等于{num}份{db*cb}张).pdf"  
  451.             
  452.             # 重命名并移动文件到imagePatha文件夹下
  453.             output_path = os.path.join(tii[t3], new_file_name)
  454.             print(output_path)
  455.             # 目标文件名C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格\答案\答案 动物拼图6宫格 难度01 空001格(1乘1等于1份1张).pdf
  456.             os.rename(pdf_path, output_path)            # 源文件名,目标文件名
  457.             time.sleep(5)   
  458.             
  459.             shutil.rmtree(ti[t3]) #递归删除文件夹,即:删除非空文件夹
  460.             time.sleep(2)    # 防止转换时报错,预留生成时间
  461. # print('----------第4步:把都有16管PDF关卡变png------------')
  462. #coding=utf-8
  463. from win32com.client import Dispatch
  464. import os
  465. import re
  466. import fitz
  467. wdFormatPDF = 17 #转换的类型
  468. zoom_x=2 #尺寸大小,越大图片越清晰 5超大,这里改成2
  469. zoom_y=2 #尺寸大小,越大图片越清晰,长宽保持一致
  470. rotation_angle=0#旋转的角度,0为不旋转
  471. li=[path+r'\答案',path+r'\题目']
  472. for l in li:
  473.     for root, dirs, files in os.walk(l):
  474.         for file in files:
  475.             if re.search('\.pdf$', file):
  476.                 filename = os.path.abspath(root + "\" + file)
  477.                 print(filename)
  478.                 # 打开PDF文件
  479.                 pdf = fitz.open(filename)
  480.                 # 逐页读取PDF
  481.                 for pg in range(0, pdf.pageCount):
  482.                     page = pdf[pg]
  483.                     # 设置缩放和旋转系数
  484.                     trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
  485.                     pm = page.getPixmap(matrix=trans, alpha=True)
  486.                     # 开始写图像
  487.                     pm.writePNG(filename.replace('.pdf', '') + str(pg+1) + ".png")
  488.                 pdf.close()
  489.     # 删除生成文件PDF  
  490.     for parent, dirnames, filenames in os.walk(l):
  491.         for fn in filenames:
  492.             if fn.lower().endswith('.pdf'):
  493.                 os.remove(os.path.join(parent, fn))
  494. print('----------第7步:把关卡png六张六张写入docx,转pdf------------')
  495.    
  496. # -*- coding:utf-8 -*-
  497. # print('----1、读取行列-------')
  498. from docx import Document
  499. from docx.shared import Cm
  500. import os
  501. # # 新建一个”装N份word和PDF“的临时文件夹
  502. imagePath11=path+r'\零时Word11'
  503. imagePath22=path+r'\零时Word22'
  504. os.makedirs(imagePath11,exist_ok=True)
  505. os.makedirs(imagePath22,exist_ok=True)
  506. tiii=[path+r'\零时Word11',path+r'\零时Word22']
  507. tii=[path+r'\答案',path+r'\题目']
  508. title=['答案','题目']
  509. for t4 in range(len(tiii)):
  510. # 打开.docx文件
  511.     doc = Document(path +r'\动物数独(6宫格横板)1图关卡.docx')
  512.     # 获取文档中的所有表格
  513.     tables = doc.tables
  514.     # 选择你需要读取的表格(在这种情况下是第1张表格)
  515.     target_table = tables[0]
  516.     # 获取所选表格的行数和列数
  517.     num_rows = len(target_table.rows)
  518.     num_columns = len(target_table.columns)
  519.     print("行数:", num_rows)
  520.     # 3
  521.     print("列数:", num_columns)
  522.     # # 2
  523.    
  524.     import os
  525.    
  526.     # 读取文件夹中所有文件的名称并加上路径
  527.     file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(tii[t4]) for file in files]
  528.     print(file_paths)
  529.     print(len(file_paths))
  530.     pic_list_six = [file_paths[i:i+1] for i in range(0, len(file_paths), 1)]
  531.     # print('----3、插入图片-------')
  532.     for f in range(len(pic_list_six)):
  533.     # # 打开.docx文件
  534.         doc = Document(path +r'\动物数独(6宫格横板)1图关卡.docx')
  535.         # 获取文档中的所有表格
  536.         tables = doc.tables
  537.         # 获取第一个表格
  538.         table = tables[0]   
  539.         # 遍历表格的所有行和单元格   
  540.         i = 0
  541.         for row in table.rows:
  542.             for cell in row.cells:
  543.                 # 在单元格中插入图片
  544.                 cell_paragraph = cell.paragraphs[0]
  545.                 run = cell_paragraph.add_run()
  546.                 run.add_picture(pic_list_six[f][i], width=Cm(19.6), height=Cm(19.6))
  547.                 # Cm(9.84), height=Cm(9.84))
  548.                 cell_paragraph.alignment = 1  # 设置单元格中的文本居中
  549.                 i += 1
  550.                
  551.                
  552.         # 保存修改后的.docx文件
  553.         doc.save(tiii[t4] + fr'\{f:02d}页.docx')
  554.         from docx2pdf import convert
  555.         # docx 文件另存为PDF文件
  556.         inputFile =tiii[t4] + fr'\{f:02d}页.docx'
  557.         outputFile =tiii[t4] + fr'\{f:02d}页.pdf'
  558.         # 先创建 不存在的 文件
  559.         f1 = open(outputFile,'w')
  560.         f1.close()
  561.         # 再转换往PDF中写入内容
  562.         convert(inputFile, outputFile)
  563.     pdf_lst = [f for f in os.listdir(tiii[t4]) if f.endswith('.pdf')]
  564.     pdf_lst = [os.path.join(tiii[t4], filename) for filename in pdf_lst]
  565.     pdf_lst.sort()
  566.     file_merger = PdfMerger()
  567.     for pdf in pdf_lst:
  568.         print(pdf)
  569.         file_merger.append(pdf)
  570.     # file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大班A整页描字帖2乘5加表格-4名字-({}人).pdf".format(num))
  571.     file_merger.write(imagePath4+fr"\{t4:02d}{title[t4]}.pdf")
  572.     file_merger.close()
  573.         # doc.Close()
  574.     # # # print('----------第5步:删除临时文件夹------------')   
  575.     # import shutil
  576.     # shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
  577.     # import shutil
  578.     # shutil.rmtree(imagePath2) #递归删除文件夹,即:删除非空文件夹
  579.     print('----------第8步:把关卡pdf和图卡pdf合并在一起------------')
  580. # 最后把PDF合并
  581. import os
  582. from PyPDF2 import PdfMerger, PdfFileReader
  583. # 创建一个PdfMerger对象
  584. merger = PdfMerger()
  585. # 遍历文件夹中的所有PDF文件
  586. folder_path = path
  587. for filename in os.listdir(imagePath4):
  588.     if filename.endswith('.pdf'):
  589.         # 打开PDF文件z
  590.         pdf_path = os.path.join(imagePath4, filename)
  591.         pdf_file = open(pdf_path, 'rb')
  592.         pdf_reader = PdfFileReader(pdf_file)
  593.    
  594.         # 将PDF文件添加到合并器中
  595.         merger.append(pdf_reader)
  596.         
  597.         # 关闭当前打开的PDF文件
  598.         pdf_file.close()
  599. # 保存合并后的PDF文件
  600. output_path = path+fr"\动物数独{hs}宫格(空格1-{len(w)}({len(w)}关卡图1图一页和{hs*hs}大图卡和{hs*hs}答案卡 最大号图片).pdf"
  601. merger.write(output_path)
  602. merger.close()
  603. time.sleep(3)
  604. print("PDF文件合并完成!")
  605. shutil.rmtree(imagePath4) #递归删除文件夹,即:删除非空文件夹
  606. shutil.rmtree(imagePath22) #递归删除文件夹,即:删除非空文件夹
  607. shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
  608. shutil.rmtree(imagePatha) #递归删除文件夹,即:删除非空文件夹
  609. shutil.rmtree(imagePathq) #递归删除文件夹,即:删除非空文件夹
  610. shutil.rmtree(imagePath11) #递归删除文件夹,即:删除非空文件夹   
复制代码
由于是最大的图篇,所以生成了快90分钟!o(╥﹏╥)o



一页贴一张,图片容量大,所以保存的时间要延伸。部分延时time.sleep(10)边长。




作品展示



贴图卡 36张(一张A4一个动物)一个动物约莫20CM,6个动物就是120CM(1,2米)


任务卡:


答案卡



对比



这是最大号的





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表