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

news2024/9/22 13:22:32

背景需求:

前文提到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宫格图案,可以用来撑满个别化的墙面。

话不多说,直接进上代码

# 测试11*11格,2*2一共4套3*3 宫格
'''
动物6宫格 任务卡一页一张(36张),答案卡一页一张(36张),贴图一页一张(36张)
108张很浪费彩墨,但是如果是公开课,还是值得的。
生成时间90分钟

动物数独 6宫格,

1、大卡片9.84CM一行,A4一页4张
2、参考图(空1格到空34格子,生成PDF,转为png
3、将png关卡图片做成8.82*9.7的小图卡(A4一页4张)
4、图片卡和关卡图合并在一个PDF
5、有答案
关卡图1张一页,最大化19.6

时间:2024年4月12日
作者:「Vaeeeeeee」,AI对话大师,阿夏
时间:2024年4月12日 13:35


'''

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

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

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

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

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

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

doc = Document(path +r'\动物数独(6宫格横板)1图关卡.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(root, file) for root, dirs, files in os.walk(folder_path) for file in files]*6

# 打印文件名称和路径
print(pic_list)
print(len(pic_list))



# print('----3、插入六套大图片-------')



for f in range(len(pic_list)):
    # 打开.docx文件
    doc = Document(path + r'\动物数独(6宫格横板)1图关卡.docx')
    # 获取文档中的所有表格
    table = doc.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[f], width=Cm(19.6), height=Cm(19.6))
            cell_paragraph.alignment = 1  # 设置单元格中的文本居中
            i += 1  # 移动到下一个图片路径

    # 保存修改后的.docx文件
    doc.save(imagePath + fr'\{f:02d}页.docx')
    # docx 文件另存为PDF文件
    inputFile = imagePath + fr'\{f:02d}页.docx'  # 要转换的文件:已存在
    outputFile = imagePath + fr'\{f:02d}页.pdf'  # 要生成的文件:不存在
    convert(inputFile, outputFile)
    time.sleep(5)

# 合并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(imagePath4 + r"\02操作卡.pdf")
file_merger.close()

# 第5步
shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹




print('----3、制作空白题卡-------')

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_PARAGRAPH


import docxtpl
import pandas as pd
from docx2pdf import convert

from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
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)
# 删除['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))
# 34


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

# 制作"单元格"# 几宫格
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'\\零时jpg1'
    # os.makedirs(imagePath2,exist_ok=True) 

    # imagePath3=path+r'\\零时jpg2'
    # os.makedirs(imagePath3,exist_ok=True) 

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

    imagePatha=path+r'\答案'
    imagePathq=path+r'\题目'
    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*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共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_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), (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个数字0510
            print(str(s))        #  '12'
            bg.append(s)  #  '0102'
    print(bg)

    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    
                
            # 第一种是出现全部数字,也就是出现全部图案
            board1 = generate_sudoku_board()

            # 定义类型1
            def create_board1():                
                return board1

            # 定义类型2
            def 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 = 0
                for i in blanks:
                    row = i // hs
                    col = i % hs
                    board2[row][col] = 0

                        
                    # if random.randint(0, hs) < level:
                    #     board1[row][col] = 0
                return board2
            # 16个数字
            v1 = create_board1()    
            # 16-X个数字    
            v2 = create_board2()

            v=v1+v2
            print(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(10)          

                   
        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+r'\动物数独(6宫格横板).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"第 {kk+1} 关 {title[tt]}"
                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[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-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(ti[tt]+fr'\{z+1:02d}.docx')
            time.sleep(3)

        
            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)

        
            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.text

                        for x in range(0,hs):
                        # 判断单元格的值是否为1
                            if cell_text == f'{x+1}':
                                # 删除原来的文本
                                cell.text = ''
                                # 插入图片
                                run = cell.paragraphs[0].add_run()
                                # 4.8格子
                                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(ti[tt]+fr'\{z+1:02d}.docx')
            time.sleep(2)

            # # 关闭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'
            # 先创建 不存在的 文件
            f1 = open(outputFile, 'w')
            f1.close()
            # 再转换往PDF中写入内容
            convert(inputFile, outputFile)
            time.sleep(10)       
            
        print('----------更改pdf新名字------------')                    
        # 两个pdf
        import os
        from PyPDF2 import PdfFileReader, PdfFileWriter
        
        tii=[path+r'\答案',path+r'\题目']

        
        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张).pdf
            os.rename(pdf_path, output_path)            # 源文件名,目标文件名
            time.sleep(5)   
            
            shutil.rmtree(ti[t3]) #递归删除文件夹,即:删除非空文件夹
            time.sleep(2)    # 防止转换时报错,预留生成时间


# print('----------第4步:把都有16管PDF关卡变png------------')

#coding=utf-8
from win32com.client import Dispatch
import os
import re
import fitz

wdFormatPDF = 17 #转换的类型
zoom_x=2 #尺寸大小,越大图片越清晰 5超大,这里改成2
zoom_y=2 #尺寸大小,越大图片越清晰,长宽保持一致
rotation_angle=0#旋转的角度,0为不旋转


li=[path+r'\答案',path+r'\题目']
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)
                # 逐页读取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(l):
        for fn in filenames:
            if fn.lower().endswith('.pdf'):
                os.remove(os.path.join(parent, fn))


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

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


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


# # 新建一个”装N份word和PDF“的临时文件夹

imagePath11=path+r'\零时Word11'
imagePath22=path+r'\零时Word22'
os.makedirs(imagePath11,exist_ok=True)
os.makedirs(imagePath22,exist_ok=True)

tiii=[path+r'\零时Word11',path+r'\零时Word22']
tii=[path+r'\答案',path+r'\题目']
title=['答案','题目']
for t4 in range(len(tiii)):
# 打开.docx文件
    doc = Document(path +r'\动物数独(6宫格横板)1图关卡.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
 
    
    # 读取文件夹中所有文件的名称并加上路径
    file_paths = [os.path.join(root, file) for root, dirs, files in os.walk(tii[t4]) for file in files]
    print(file_paths)
    print(len(file_paths))

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



    # print('----3、插入图片-------')
    for f in range(len(pic_list_six)):
    # # 打开.docx文件
        doc = Document(path +r'\动物数独(6宫格横板)1图关卡.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(19.6), height=Cm(19.6))
                # Cm(9.84), height=Cm(9.84))
                cell_paragraph.alignment = 1  # 设置单元格中的文本居中
                i += 1
                
                

        # 保存修改后的.docx文件
        doc.save(tiii[t4] + fr'\{f:02d}页.docx')
        from docx2pdf import convert
        # docx 文件另存为PDF文件
        inputFile =tiii[t4] + fr'\{f:02d}页.docx'
        outputFile =tiii[t4] + fr'\{f:02d}页.pdf'
        # 先创建 不存在的 文件
        f1 = open(outputFile,'w')
        f1.close()
        # 再转换往PDF中写入内容
        convert(inputFile, outputFile)




    pdf_lst = [f for f in os.listdir(tiii[t4]) if f.endswith('.pdf')]
    pdf_lst = [os.path.join(tiii[t4], 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(imagePath4+fr"\{t4:02d}{title[t4]}.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(imagePath4):
    if filename.endswith('.pdf'):
        # 打开PDF文件z
        pdf_path = os.path.join(imagePath4, 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)}关卡图1图一页和{hs*hs}大图卡和{hs*hs}答案卡 最大号图片).pdf"
merger.write(output_path)
merger.close()
time.sleep(3)

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


shutil.rmtree(imagePath4) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePath22) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePath) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePatha) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePathq) #递归删除文件夹,即:删除非空文件夹
shutil.rmtree(imagePath11) #递归删除文件夹,即:删除非空文件夹   

因为是最大的图篇,所以生成了快90分钟!o(╥﹏╥)o

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

作品展示

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

任务卡:

答案卡

对比

这是最大号的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

003: Visual Studio 配置 VTK 开发环境的方法与比较

目录 简介&#xff1a; 1 配置属性方法&#xff1a; 2 创建配置文件 3 在新项目中导入props文件 总结&#xff1a; 简介&#xff1a; 编译好VTK后&#xff0c;在安装目录里面有通常有包含bin,lib和include等文件夹&#xff0c;要在自己的项目里面使用VTK&#xff0c;主要…

如何用c++判断一个类型是vector

如何用c判断一个类型是vector 我们使用模板元编程来搞定 这里我们可以定义一个模板结构体 is_std_vector&#xff0c;并对其进行特化&#xff0c;以便专门处理 std::vector 类型。 . 下面是详细的实现和使用示例。 实现 is_std_vector 类型, 继承自false_type 首先&#xff…

Unexpected token d in JSON at position 5, check bodyParser config错误解决

错误原因&#xff1a;json格式不对 { desc"设备1", iotProjectId11 } 解决&#xff1a;通过json在线校验格式校验json格式&#xff0c;找出错误原因&#xff0c;修改 在线JSON校验格式化工具&#xff08;Be JSON&#xff09; 修改&#xff1a; {"desc": &…

基于SpringBoot的校园博客系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 博主管理…

使用 MongoDB 构建 AI:Patronus 如何自动进行大语言模型评估来增强对生成式 AI 的信心

大语言模型可能不可靠&#xff0c;这几乎算不上头条新闻。对于某些用例&#xff0c;这可能会带来不便。而对于其他行业&#xff0c;尤其是受监管行业&#xff0c;后果则要严重得多。于是&#xff0c;业内首个大语言模型自动评估平台 Patronus AI 应运而生。 Patronus AI 由 Met…

为啥给的贷款额度差距那么大?机构到底是怎么决定给你多少额度?

今日&#xff0c;我们深入探讨一个颇为引人入胜的话题——为何在不同银行或信贷机构申请贷款时&#xff0c;所能获得的额度竟能如此大相径庭&#xff1f;同时&#xff0c;揭秘这些金融机构背后是如何精密计算并决定每位申请者的“额度”的。以下内容干货满满&#xff0c;建议收…

10 先序遍历创建二叉树

这个代码是使用手动输入的方式创建二叉树 比较直观 #include "stdio.h" #include "stdlib.h"typedef int ElemType; typedef struct node {ElemType data;struct node *lchild;struct node *rchild; } Node;Node *create_node(int value) {Node *node (N…

2024国赛数学建模B题思路模型

完整的思路模型请查看文末名片

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。此题涉及对一个动态系统的建模&#xff0c;模拟…

弹框用户勾选过得置灰 或者不显示

弹框用户勾选过得置灰 或者不显示 添加 :disabled“row.disabled” <el-table-column label"名称" width"300"><template #default"{ row }"><el-radio:disabled"row.disabled":label"row.coursesName"v-mo…

中秋节如何利用Python发送彩信

中秋节&#xff0c;作为中国传统节日之一&#xff0c;不仅是家人团聚的时刻&#xff0c;也是商家提高销售业绩的黄金时期。在这个充满温情与消费氛围的节日里&#xff0c;合理利用短信平台进行精准营销&#xff0c;可以显著提高企业的销售业绩。 支持免费对接试用乐讯通PaaS平台…

【全网最全】2024年数学建模国赛B题保奖思路+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击末文的卡片&#xff0c;那是获取资料的入口&#xff01; 一、问题重述 本题聚焦于某电子产品制造企业在生产过程中的决策问题。企业在生产中需采购 和使用两种关键零配件&#xff0c;并在装配过程中面临如何优化质…

让Mac更Mac|明基MA系列显示器上市

凭借出色的性能和设计&#xff0c;MacBook成为了很多人的心头好。可13~16英寸的屏幕&#xff0c;时常让人感到视野受限&#xff0c;就像无边创意中的一道隐形壁垒。想要外接显示大屏&#xff0c;但除了Studio Display等苹果显示器之外&#xff0c;其他品牌的外接显示屏&#xf…

优化器与现有网络模型的修改

一、优化器 optimizer optim.SGD(model.parameters(), lr0.01&#xff08;学习速率&#xff09;, momentum0.9) optimizer optim.Adam([var1, var2], lr0.0001) 一般&#xff0c;学习率的设置&#xff0c;先从大的设置&#xff0c;逐渐变小。 神经网络可以参见上篇文章&am…

【数据库】MySQL-基础篇-函数

专栏文章索引&#xff1a;数据库 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、简介 二、字符串函数 三、数值函数 四、日期函数 五、流程函数 一、简介 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在 M…

【2024国赛C题】高教杯全国大学生数学建模国赛建模过程+完整代码论文全解全析

完整内容在文章末尾阅读全文获取&#xff01; 问题 1是针对不同情况下&#xff0c;该乡村未来几年农作物的最优种植方案的研究。 为解决这个数学建模问题&#xff0c;我们需要构建一个优化模型&#xff0c;考虑到各种限制条件和目标函数。以下是解决问题的步骤&#xff1a; 问…

有源低通/高通滤波器(一阶滤波器+Sallen-Key滤波器+高下降率滤波器)+有源带通滤波器(级联+多重反馈+状态可变)

2024-9-5&#xff0c;星期四&#xff0c;20:40&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。明天终于又要放假啦&#xff01;继续学习。、 今天继续学习第九章&#xff0c;主要学习内容为&#xff1a;有源低通/高通滤波器(一阶滤波器Sallen-Key滤波器高下降…

极速体验媲美GPT4V的国产开源视觉大模型CogVLM2(赠书)

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 文末赠书 CogVLM2是一款视觉语言模型&#xff08;Visual Language Model&#xff09;&#xff0c;由智谱AI和清华KEG潜心打磨。这款模型是CogVLM的升级版本&#xff0c;支持高达 1344 * 1344 的图像分辨率&#xf…

matter的Commissioning(入网过程)整体流程、加密方式、通信信息结构

在Matter协议中&#xff0c;**控制器负责将新设备加入网络&#xff08;commissioning&#xff09;**的整个流程&#xff0c;这一过程包括设备的发现、验证、授权、加入Fabric&#xff0c;以及最终建立数据通信的步骤。配网完成后的数据通信过程同样遵循严格的加密方式&#xff…