【教学类-52-07】20240903动物数独(6宫格)一页2张任务卡,无答案

背景需求:

今天有客户买一了一份6宫格动物数独卡片(无答案),并提出一个需求:

一页6张任务卡,感觉卡片太小了,需要放大,如何处理。

我找到原来的代码

【教学类-52-06】20240422动物数独(6宫格) 打印版_动物类的数独-CSDN博客文章浏览阅读1.1k次,点赞34次,收藏19次。【教学类-52-06】20240422动物数独(6宫格) 打印版_动物类的数独https://blog.csdn.net/reasonsummer/article/details/138130758

四宫格和六宫格都是一页6张任务卡,比较起来,六宫格的每个格子的动物图案会变小,的确需要放大。

于是我做了一页两份

核心就是将1张竖板2*3单元格白城一张竖板1*2单元格(大约是14.1CM)

代码里面修改(更换模版,修改参数)

# 测试11*11格,2*2一共4套3*3 宫格
'''
动物数独 6宫格,

1、大卡片9.84CM一行,A4一页6张
2、参考图(空1格到空36格子,生成PDF,转为png
3、将png任务图片做成8.82*9.7的小图卡(A4一页6张)
4、图片卡和任务图合并在一个PDF

因为是6宫格,做成一页6张,图片太小,所以改成一页2张

时间:2024年4月12日
作者:「Vaeeeeeee」,AI对话大师,阿夏
时间:2024年9月3日 21:03






'''



print('-----0、生成大图片卡-------')

    
# -*- coding:utf-8 -*-

'''
制作动物数独的黏贴卡片 A4一页6张图片 9.85CM
作者:AI对话大师,阿夏
时间:2024年4月11日
# '''

# print('----1、读取行列-------')
from docx import Document
from docx.shared import Cm
import os,time

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格'

# # 新建一个”装N份word和PDF“的临时文件夹
imagePath=path+r'\\零时Word'
os.makedirs(imagePath,exist_ok=True)  # 若图片文件夹不存在就创建

imagePath3=path+r'\\汇总'
os.makedirs(imagePath3,exist_ok=True) 
# 打开.docx文件

doc = Document(path +r'\动物数独(6宫格竖版)大卡片.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



# # 测算4类图片每种几张
# sum=int(num_rows*num_columns)
# print(sum)
# 

print('----2、生成足够数量的图片-------')

import os

# 指定文件夹路径
folder_path =path+r'\02动物图片'

# 读取文件夹中所有文件的名称并加上路径
file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(folder_path) for file in files]
print(file_paths)
file_paths=file_paths
pic_list=[]
# 打印文件名称和路径
for file_path in file_paths:
    # for i in range(sum):
    pic_list.append(file_path)
print(pic_list)
print(len(pic_list))
# # 5



print('----3、插入图片-------')
for f in range(6):
# 打开.docx文件
    doc = Document(path+r'\动物数独(6宫格竖版)大卡片.docx')

    # 获取文档中的所有表格
    tables = doc.tables

    # 获取第一个表格
    table = tables[0]
    
    # 遍历表格的所有行和单元格
    i = 0
    for row in table.rows:
        for cell in row.cells:
            # 在单元格中插入图片
            cell_paragraph = cell.paragraphs[0]
            run = cell_paragraph.add_run()
            run.add_picture(pic_list[i], width=Cm(9.84), height=Cm(9.84))
            cell_paragraph.alignment = 1  # 设置单元格中的文本居中
            i += 1  # 移动到下一个图片路径

    # 保存修改后的.docx文件
    doc.save(imagePath + fr'\动物数独卡片{f:02d}页.docx')
    from docx2pdf import convert
    # docx 文件另存为PDF文件
    inputFile =imagePath + fr'\动物数独卡片{f:02d}页.docx'# 要转换的文件:已存在
    outputFile = imagePath + fr'\动物数独卡片{f:02d}页.pdf' # 要生成的文件:不存在
    # 先创建 不存在的 文件
    f1 = open(outputFile,'w')
    f1.close()
    # 再转换往PDF中写入内容
    convert(inputFile, outputFile)
    time.sleep(2)

    from docx2pdf import convert


    
import os
from PyPDF2 import PdfMerger

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(imagePath3+r"\02大卡片.pdf")
file_merger.close()
# doc.Close()

# # print('----------第5步:删除临时文件夹------------')    
import shutil
shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹

import random,time
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

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_PARAGRAPH_ALIGNMENT



from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml


# 生成题库
import random
import copy


num=1
# int(input('生成几份\n'))
# 制作"单元格"# 几宫格
hsall=6
# int(input('请输入4或9\n'))
hs=hsall

# kk=int(input('空格数量,输入5,就是50%,就是空一半)\n'))

print('------1、如果正好想生成1空、2空、3空、4空的数字,需要测算百分比的具体数字------')

n=hsall
g=n*n

a=[]
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)
# 删除['4宫格,难度01,抽取1%:实际有00空,已有图案16', 
# f.pop(-1)
# # 删除'4宫格,难度100,抽取100%:实际有16空,已有图案00'
print(f)
# ['4宫格,难度007,抽取007%:实际有001空,已有图案015', '4宫格,难度013,抽取013%:实际有002空,已有图案014', '4宫格,难度019,抽取019%:实际有003空,已有图案013', '4宫格,难度025,抽取025%:实际有004空
# ,已有图案012', '4宫格,难度032,抽取032%:实际有005空,已有图案011', '4宫格,难度038,抽取038%:实际有006空,已有图案010', '4宫格,难度044,抽取044%:实际有007空,已有图案009', '4宫格,难度050,抽取050%:实际有008空,已有图案008', '4宫格,难度057,抽取057%:实际有009空,已有图案007', '4宫格,难度063,抽取063%:实际有010空,已有图案006', '4宫格,难度069,抽取069%:实际有011空,已有图案005', '4宫格,
# 难度075,抽取075%:实际有012空,已有图案004', '4宫格,难度082,抽取082%:实际有013空,已有图案003', '4宫格,难度088,抽取088%:实际有014空,已有图案002', '4宫格,难度094,抽取094%:实际有015空,已有图案
# 001']
print(len(f))
# 15
# 难度有15关

# 提取百分数
g=[]
w=[]
for p in f:
    g.append(int(p[12:15]))    # 提取第6-7个数字=百分比数字
    w.append(int(p[20:23]))    # 提取空格数量
print(g)
# [7, 13, 19, 25, 32, 38, 44, 50, 57, 63, 69, 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))
# 36


print('------2、制作6宫格随机数字------')


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


# 生成题库
import random
import copy


# 制作"单元格"# 几宫格
for kk in range(len(g)):
# hs=int(input('请输入宫格数量(3,5.6,7,8,)\n'))
    
    # 因为有3-9的不同word模板,所以有不同的套数和字体大小
    ll=['6'] # 如果输入345
    mm=['11']# 3对应的套数是4*3套
    nn=['36']# 3对应的写入单元格的数字大小36磅 
    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=r'C:\Users\jg2yXRZ\OneDrive\桌面\动物数独6宫格'
    # 新建一个”装N份word和PDF“的临时文件夹
    imagePath=path+r'\\零时Word'
    os.makedirs(imagePath,exist_ok=True) 

    imagePath2=path+r'\\零时jpg'
    os.makedirs(imagePath2,exist_ok=True) 

    imagePath3=path+r'\\汇总'
    os.makedirs(imagePath3,exist_ok=True) 

    # 计算不同模板中的单元格坐标,放在bg里
    # 棋盘格子数量,


    # 如果长方形:底边3*侧边2,3*2=6套 ,就是10*10宫格,底边格子数量就是10*3=30,侧边格子数量就是10*2=20,
    # if db==cb:

    db_size = hs*db
    cb_size=  hs*cb
    print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
    print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))

    # 确定每个宫格的左上角坐标 00 04 40  44 中间没有分栏的空格了,所以hs不用+1
    bgszm=[]
    for a in range(0,cb_size,hs):    # 0-11每隔4,写一个坐标  侧边y
        for b in range(0,db_size,hs):  # 0-11每隔4,写一个坐标  侧边x
            bgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
    print(bgszm)
    # 10宫格排列底3侧2共6套,底边格子数30
    # 10宫格排列底3侧2共6套,侧边格子数20
    # 10宫格排列底3侧2共6套,侧边格子数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_coord
        subgrid_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), (6, 8), (6, 9), (6, 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个数字0510
            print(str(s))        #  '12'
            bg.append(s)  #  '0102'
    print(bg)


    # 生成PDf
    P=[] 
    for z in range(num):  
        P.clear()
        #    制作4份数据
        for j in range(db*cb):    #  3宫格,4*3=12套
        
        # ————————————————生成随机宫格,按比例空缺格子
        # 版权声明:本文为CSDN博主「Vaeeeeeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        # 原文链接:https://blog.csdn.net/m0_46366547/article/details/131334720
            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 + 1
                    next_col = (col + 1) % hs

                    # 获取当前单元格在小九宫格中的索引
                    box_row = row 
                    box_col = col

                    # 随机生成1到9的数字
                    numbers = random.sample(range(1, hs+1), hs)

                    for num in numbers:
                        # 检查行、列、小九宫格是否已经存在相同的数字
                        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

                            # 回溯,将当前单元格重置为0
                            board[row][col] = 0

                    return False

                # 填充数独棋盘
                filling_board(0, 0)
                return board

             # 定量出现空白格子
                      
            def create_board(): # level数字越大代表游戏难度越大
                """
                生成一个随机的数独棋盘,空白格少
                """
                board = generate_sudoku_board()
                board1 =  copy.deepcopy(board)
                ggg=int(g[kk])
                blanks = random.sample(range(hs*hs), int(float(hs*hs*ggg)/100))
                for i in blanks:
                    row = i // hs
                    col = i % hs
                    board[row][col] = 0

                        
                    # if random.randint(0, hs) < level:
                    #     board1[row][col] = 0
                return board

            v = create_board() 
            # 81空34、46

                    
            # 提取每个元素
            

            for a1  in v:         # 第一次读取,[a,b][c,d][e,f]的内容-列表
                for a2 in a1:    # 第二次读取,[a,b,c,d,e,f]的内容-元素
                    if a2==0:                # 如果某个元素==0,就替换成空
                        P.append('')
                    else:      # 如果某个元素非0,就写入本身的数字
                        P.append(a2)
            print(P)
            print(len(P))
            Q=P

        doc = Document(path+r'\动物数独(6宫格横板).docx')     

        print('------3、写入第几关,并将数字改成图片链接------')      
        # 获取第一个表格,写难度用的
        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"第 {kk+1} 关"
            cell_00_paragraph.style.font.bold = True
            cell_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[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(46)  #输入字体大小默认30号 换行(一页一份大卡片
            run.font.size = Pt(size) #是否加粗
            # run.font.color.rgb = RGBColor(150,150,150) #数字小,颜色深0-255
            run.font.color.rgb = RGBColor(0,0,0) #数字小,颜色深0-255
            run.bold=True
            # paragraph.paragraph_format.line_spacing = Pt(180) #数字段间距
        
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
            table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER#居中  

            
        doc.save(imagePath+r'\{}.docx'.format('%02d'%(z+1)))#保存为XX学号的电话号码word   
        time.sleep(1)

        print('------4、每张word转为pdf----')      
        from docx import Document
        from 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)

        # 把数字1替换成01图片
        # 打开Word文档
        doc = Document(imagePath+r'\{}.docx'.format('%02d'%(z+1)))

        # 获取所有表格
        tables = doc.tables

        # 遍历每个表格
        for table in tables:
            # 遍历表格的行
            for i, row in enumerate(table.rows):
                # 遍历行的单元格
                for j, cell in enumerate(row.cells):
                    # 读取单元格的文本值
                    cell_text = cell.text

                    for x in range(0,hs):
                    # 判断单元格的值是否为1
                        if cell_text == f'{x+1}':
                            # 删除原来的文本
                            cell.text = ''
                            # 插入图片
                            run = cell.paragraphs[0].add_run()
                            run.add_picture(file_paths[x], width=Cm(3), height=Cm(3))
                                # 设置图片对齐方式为居中
                            run.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
                            # 设置单元格的水平和垂直对齐方式为居中
                            cell.vertical_alignment = WD_ALIGN_PARAGRAPH.CENTER
                            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
                        

        # 保存修改后的文档
        doc.save(imagePath+r'\{}.docx'.format('%02d'%(z+1)))
        time.sleep(2)

        # # 关闭Word文档
        # doc.close()
        time.sleep(2)
        from docx2pdf import convert
        # docx 文件另存为PDF文件
        inputFile = imagePath+"\{}.docx".format('%02d'%(z+1))# 要转换的文件:已存在
        outputFile = imagePath+"\{}.pdf".format('%02d'%(z+1))  # 要生成的文件:不存在
        # 先创建 不存在的 文件
        f1 = open(outputFile, 'w')
        f1.close()
        # 再转换往PDF中写入内容
        convert(inputFile, outputFile)
            
    print('----------第5步:把都有PDF合并为一个打印用PDF------------')
            
    # 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
    import os
    from PyPDF2 import PdfMerger
    target_path =  imagePath
    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 = PdfMerger()
    for pdf in pdf_lst:
        print(pdf)
        file_merger.append(pdf)

    # vv=w[kk]
    file_merger.write(imagePath2+fr"\(打印合集) 动物拼图{hs}宫格 难度{kk+1:02d} 空{int(w[kk]):03d}格({db}乘{cb}等于{num}份{db*cb}张).pdf")

    file_merger.close()
    # doc.Close()
    time.sleep(1)

    # # print('----------第5步:删除临时文件夹------------')    
    import shutil
    shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹

    time.sleep(3)    # 防止转换时报错,预留生成时间


print('----------第6步:把都有PDF任务变png------------')

#coding=utf-8
from win32com.client import Dispatch
import os
import re
import fitz
import shutil
wdFormatPDF = 17 #转换的类型
zoom_x=2 #尺寸大小,越大图片越清晰 5超大,这里改成2
zoom_y=2 #尺寸大小,越大图片越清晰,长宽保持一致
rotation_angle=0#旋转的角度,0为不旋转


# 新建装图片的零时文件夹
old_path =imagePath2  # 要复制的文件所在目录
os.makedirs(old_path,exist_ok=True)

new_path =old_path   #新路径


for root, dirs, files in os.walk(old_path):
    for file in files:
        if re.search('\.pdf$', file):
            filename = os.path.abspath(root + "\\" + file)
            print(filename)
            # 打开PDF文件
            pdf = fitz.open(filename)
            # 逐页读取PDF
            for 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(new_path):
    for fn in filenames:
        if fn.lower().endswith('.pdf'):
            os.remove(os.path.join(parent, fn))



            
print('----------第7步:把任务png六张六张写入docx,转pdf------------')

    
# -*- coding:utf-8 -*-

'''
动物数独六宫格 任务图片变成图片后写入A4一页6张
作者:AI对话大师,阿夏
时间:2024年4月22日
# '''

# print('----1、读取行列-------')
from docx import Document
from docx.shared import Cm
import os


# # 新建一个”装N份word和PDF“的临时文件夹
imagePath=path+r'\\零时Word'
if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
    os.makedirs(imagePath)  # 若图片文件夹不存在就创建
# 打开.docx文件
doc = Document(path +r'\动物数独(6宫格横板)2图任务.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


import os

# 指定文件夹路径
folder_path =old_path

# 读取文件夹中所有文件的名称并加上路径
file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(folder_path) for file in files]
print(file_paths)
print(len(file_paths))

pic_list_six = [file_paths[i:i+2] for i in range(0, len(file_paths), 2)]



# print('----3、插入图片-------')
for f in range(len(pic_list_six)):
# # 打开.docx文件
    doc = Document(path +r'\动物数独(6宫格横板)2图任务.docx')

    # 获取文档中的所有表格
    tables = doc.tables

    # 获取第一个表格
    table = tables[0]    

    # 遍历表格的所有行和单元格   
    i = 0
    for row in table.rows:
        for cell in row.cells:
            # 在单元格中插入图片
            cell_paragraph = cell.paragraphs[0]
            run = cell_paragraph.add_run()
            run.add_picture(pic_list_six[f][i], width=Cm(14.1), height=Cm(14.1))
            # Cm(9.84), height=Cm(9.84))
            cell_paragraph.alignment = 1  # 设置单元格中的文本居中
            i += 1
               
            

    # 保存修改后的.docx文件
    doc.save(imagePath + fr'\动物数独卡片{f:02d}页.docx')
    from docx2pdf import convert
    # docx 文件另存为PDF文件
    inputFile =imagePath + fr'\动物数独卡片{f:02d}页.docx'# 要转换的文件:已存在
    outputFile = imagePath + fr'\动物数独卡片{f:02d}页.pdf' # 要生成的文件:不存在
    # 先创建 不存在的 文件
    f1 = open(outputFile,'w')
    f1.close()
    # 再转换往PDF中写入内容
    convert(inputFile, outputFile)

from docx2pdf import convert


    
import os
from PyPDF2 import PdfMerger

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(imagePath3+r"\01任务.pdf")
file_merger.close()
# doc.Close()

# # print('----------第5步:删除临时文件夹------------')    
import shutil
shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
import shutil
shutil.rmtree(imagePath2) #递归删除文件夹,即:删除非空文件夹
      



print('----------第8步:把任务pdf和图卡pdf合并在一起------------')


# 最后把PDF合并
import os
from PyPDF2 import PdfMerger, PdfFileReader

# 创建一个PdfMerger对象
merger = PdfMerger()

# 遍历文件夹中的所有PDF文件

folder_path = path
for filename in os.listdir(imagePath3):
    if filename.endswith('.pdf'):
        # 打开PDF文件z
        pdf_path = os.path.join(imagePath3, filename)
        pdf_file = open(pdf_path, 'rb')
        pdf_reader = PdfFileReader(pdf_file)
        
        # 将PDF文件添加到合并器中
        merger.append(pdf_reader)
        
        # 关闭当前打开的PDF文件
        pdf_file.close()

# 保存合并后的PDF文件
output_path = path+fr"\动物数独{hs}宫格(空格1-{len(w)}({len(w)}任务图2图一页和{hs*hs}大图卡无答案).pdf"
merger.write(output_path)
merger.close()

print("PDF文件合并完成!")

import shutil
shutil.rmtree(imagePath3) #递归删除文件夹,即:删除非空文件夹

因为不要生成答案,所以速度相对比较快

感觉,贴图卡也可以放大!让老师们做撑满墙面的KT背景图,动物就需要一页2张或者一页1张

不过这次我就没有改。还是一页6个动物

结语:

根据客户需求(购买的都是同行)或幼儿需求(能力水平差异),可以不断优化学具的样式,满足不同的功能和学习需要。

同样更换word模板模版,可以制作

1、不同大小的任务卡(有些可以用来教学展示,环境布置,可以大的数独任务卡,个别化学习幼儿操作可以用稍微小的任务卡)

2、有答案和没有答案的两款数独(有答案的生成起来很慢很慢,所以价格高一点)

3、宫格数量递增,考虑先五宫格做出来。但是最近单位工作也多,班级的教案资料还没有用Python批量做完,实在没有心思做学具。

后续思考

用同样的三个任务卡模版,制作多款6宫格的学具(直接做有答案的三款大小的3宫格、4宫格、5宫格、6宫格动物数独)

  • 20
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于6宫格数独的解法,你可以使用Matlab来实现。下面是一个使用回溯算法求解6宫格数独的示例代码: ```matlab function solveSudoku(grid) if solveHelper(grid) % 调用辅助函数进行求解 disp('解法找到:'); disp(grid); else disp('无解'); end end % 辅助函数:使用回溯算法求解数独 function result = solveHelper(grid) [row, col] = findEmptyCell(grid); % 找到空白格子 if row == -1 && col == -1 % 数独已经填满,成功找到解法 result = true; return; end for num = 1:6 if isValid(grid, row, col, num) % 判断当前位置是否可以填入数字num grid(row, col) = num; % 填入数字num if solveHelper(grid) % 递归调用进行下一步填数 result = true; return; end grid(row, col) = 0; % 回溯,将当前位置重置为空白格子 end end result = false; % 没有找到合适的解法 end % 辅助函数:判断在指定的位置row、col填入数字num是否合法 function isValidFlag = isValid(grid, row, col, num) isValidFlag = true; % 检查当前行是否合法 for c = 1:6 if grid(row, c) == num isValidFlag = false; return; end end % 检查当前列是否合法 for r = 1:6 if grid(r, col) == num isValidFlag = false; return; end end % 检查当前小九宫格是否合法 startRow = 3 * floor((row - 1) / 3) + 1; startCol = 2 * floor((col - 1) / 2) + 1; for r = 0:2 for c = 0:1 if grid(startRow + r, startCol + c) == num isValidFlag = false; return; end end end end % 辅助函数:找到数独中的一个空白格子 function [row, col] = findEmptyCell(grid) for r = 1:6 for c = 1:6 if grid(r, c) == 0 row = r; col = c; return; end end end row = -1; % 找不到空白格子,返回-1 col = -1; end % 测试代码 grid = [ 0, 0, 0, 2, 0, 0; 0, 0, 4, 0, 5, 0; 6, 0, 0, 0, 0, 2; 0, 3, 0, 0, 1, 0; 0, 0, 6, 0, 0, 0; 1, 0, 0, 0, 0, 3; ]; solveSudoku(grid); ``` 这段代码使用了回溯算法来求解数独,首先找到一个空白格子,然后尝试填入数字1-6,判断是否合法,递归地进行下一步填数,如果最终能够填满数独,则找到解法。由于回溯算法的复杂性,对于大规模的数独可能需要较长的计算时间。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值