【教学类-52-01】20240411动物数独(4宫格)

作品展示

背景需求:

一、下载图片

PS修图(图片长宽一样,把动物图片上下拉长)

二、数独结构分析:

1、这是一个四宫格的数独题,

2、将1234换成了四种小动物图片。

于是我去找到原来做过的一个代码,并用AI大师,尝试将word里面的1变成兔子图片、2变成

【教学类-43-17】4宫格数独、9宫格数独(2*2、3*3可算全部数字)_2x2九宫格题-CSDN博客文章浏览阅读1k次,点赞25次,收藏15次。【教学类-43-17】4宫格、9宫格(2*2、3*3可算)的数独题目_2x2九宫格题https://blog.csdn.net/reasonsummer/article/details/135493986

三、用AI对话大师,补充数字变:"图片”的方法

四、素材准备:

两个四宫格是在一个表格内,中间有链接(因为原来的代码就是连在一起的,所以暂时先这么做模板)

五、最终代码

1、抽50%的空格

# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:动物数独01 a4竖版 2个4*4宫格(连在一起的)套抽一半(数字替换成图片) 
作者:「Vaeeeeeee」,AI对话大师,阿夏
时间:2024年4月11日 13:35



'''

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

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


# 生成题库
import random
import copy

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

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

# for kk in range(5,9):
# 因为有3-9的不同word模板,其中3-4模板一页生成9套,5-9模板一页生成6套,这里直接生成边长

ll=['4','9'] # 如果输入345
mm=['12','32']# 3对应的套数是1*2套
nn=['24','24']# 3对应的写入单元格的数字大小36磅 
for r in range(len(ll)):
    if hsall ==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\桌面\动物数独'
# 新建一个”装N份word和PDF“的临时文件夹
imagePath=path+r'\\零时Word'
if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
    os.makedirs(imagePath)  # 若图片文件夹不存在就创建

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

# 如果正方形:底边2*侧边2,就是3*3宫格 2*2=4套,底边边格子数量就是3*2+1=7,侧边格子数量就是3*2+1=7,
# 如果长方形:底边3*侧边2,就是3*3宫格,3*2=6套 底边格子数量就是3*3+2=11,侧边格子数量就是3*2+1=7,
# if db==cb:
db_size = hs*db+db-1
cb_size=  hs*cb+cb-1
print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))

# 确定每个宫格的左上角坐标 00 04 40  44
bgszm=[]
for a in range(0,cb_size,hs+1):    # 0-11每隔4,写一个坐标  侧边y
    for b in range(0,db_size,hs+1):  # 0-11每隔4,写一个坐标  侧边x
        bgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
print(bgszm)
# 3宫格排列底3侧2共6套,底边格子数11
# 3宫格排列底3侧2共6套,侧边格子数7
# ['0000', '0004', '0008', '0400', '0404', '0408']
    

# 转为元祖
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

                import math

                r = int(math.sqrt(hs))
                print(r)

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

                # 随机生成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*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

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

                return False

            # 填充数独棋盘
            filling_board(0, 0)
            return board
        
        # 这一块是按照等级随机产生空格,数量不稳定,    
        # def create_board(level): # level数字越大代表游戏难度越大,空白格子越多
        #         """
        #         生成一个随机的数独棋盘,空白格少
        #         """
        #         board = generate_sudoku_board()
        #         board1 =  copy.deepcopy(board)
        #         for i in range(hs*hs):
        #             row = i // hs
        #             col = i % hs
        #             if random.randint(0, hs) < level:   # 随机数量
        #                 board1[row][col] = 0                          # 格子填充为0
        #         return (board,board1)
        
        # if hs==9:
        #     v = create_board(5)[1]  
        #     print(v)
        # if hs==4:
        #     v = create_board(3)[1]  
        #     print(v)

        # 定量出现空白格子
        def create_board(): # level数字越大代表游戏难度越大
            """
            生成一个随机的数独棋盘,空白格少
            """
            board = generate_sudoku_board()
            board1 =  copy.deepcopy(board)

            blanks = random.sample(range(hs*hs), int(hs*hs*kk/10))
            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() 

        # 数字越小,空格少
        # 数字大,空格多
            
        # 这里无法控制空格的数量


                
        # 提取每个元素
        

        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'\\动物数独(四宫格竖版).docx'.format(hs))     
#    
    table = doc.tables[0]          # 表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(50,50,50) #数字小,颜色深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)


    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,4):
                # 判断单元格的值是否为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)))

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

file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/动物数独/(打印合集) 动物拼图{}宫格难度{} ({}乘{}等于{}套{}人{}份).pdf" .format(hs,kk,db,cb,db*cb,num,num))

file_merger.close()
# doc.Close()

# # print('----------第5步:删除临时文件夹------------')    
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/动物数独/零时Word') #递归删除文件夹,即:删除非空文件夹

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

终端输入

作品展示

2、制作层次难度

难度5(8空)、难度6(9空) 、难度7(10空) 、难度8(11空)

# 测试11*11格,2*2一共4套3*3 宫格
'''
目的:动物数独01 a4竖版 2个4*4宫格(连在一起的)套抽一半(数字替换成图片) 难度5-8
作者:「Vaeeeeeee」,AI对话大师,阿夏
时间:2024年4月11日 13:35



'''

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

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


# 生成题库
import random
import copy

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

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

for kk in range(5,9):
    # 因为有3-9的不同word模板,其中3-4模板一页生成9套,5-9模板一页生成6套,这里直接生成边长

    ll=['4','9'] # 如果输入345
    mm=['12','32']# 3对应的套数是1*2套
    nn=['24','24']# 3对应的写入单元格的数字大小36磅 
    for r in range(len(ll)):
        if hsall ==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\桌面\动物数独'
    # 新建一个”装N份word和PDF“的临时文件夹
    imagePath=path+r'\\零时Word'
    if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
        os.makedirs(imagePath)  # 若图片文件夹不存在就创建

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

    # 如果正方形:底边2*侧边2,就是3*3宫格 2*2=4套,底边边格子数量就是3*2+1=7,侧边格子数量就是3*2+1=7,
    # 如果长方形:底边3*侧边2,就是3*3宫格,3*2=6套 底边格子数量就是3*3+2=11,侧边格子数量就是3*2+1=7,
    # if db==cb:
    db_size = hs*db+db-1
    cb_size=  hs*cb+cb-1
    print('{}宫格排列底{}侧{}共{}套,底边格子数{}'.format(hs,db,cb,db*cb,db_size ))
    print('{}宫格排列底{}侧{}共{}套,侧边格子数{}'.format(hs,db,cb,db*cb,cb_size ))

    # 确定每个宫格的左上角坐标 00 04 40  44
    bgszm=[]
    for a in range(0,cb_size,hs+1):    # 0-11每隔4,写一个坐标  侧边y
        for b in range(0,db_size,hs+1):  # 0-11每隔4,写一个坐标  侧边x
            bgszm.append('{}{}'.format('%02d'%a,'%02d'%b))
    print(bgszm)
    # 3宫格排列底3侧2共6套,底边格子数11
    # 3宫格排列底3侧2共6套,侧边格子数7
    # ['0000', '0004', '0008', '0400', '0404', '0408']
        

    # 转为元祖
    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

                    import math

                    r = int(math.sqrt(hs))
                    print(r)

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

                    # 随机生成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*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

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

                    return False

                # 填充数独棋盘
                filling_board(0, 0)
                return board
            
            # 这一块是按照等级随机产生空格,数量不稳定,    
            # def create_board(level): # level数字越大代表游戏难度越大,空白格子越多
            #         """
            #         生成一个随机的数独棋盘,空白格少
            #         """
            #         board = generate_sudoku_board()
            #         board1 =  copy.deepcopy(board)
            #         for i in range(hs*hs):
            #             row = i // hs
            #             col = i % hs
            #             if random.randint(0, hs) < level:   # 随机数量
            #                 board1[row][col] = 0                          # 格子填充为0
            #         return (board,board1)
            
            # if hs==9:
            #     v = create_board(5)[1]  
            #     print(v)
            # if hs==4:
            #     v = create_board(3)[1]  
            #     print(v)

            # 定量出现空白格子
            def create_board(): # level数字越大代表游戏难度越大
                """
                生成一个随机的数独棋盘,空白格少
                """
                board = generate_sudoku_board()
                board1 =  copy.deepcopy(board)

                blanks = random.sample(range(hs*hs), int(hs*hs*kk/10))
                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() 

            # 数字越小,空格少
            # 数字大,空格多
                
            # 这里无法控制空格的数量


                    
            # 提取每个元素
            

            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'\\动物数独(四宫格竖版).docx'.format(hs))     
    #    
        table = doc.tables[0]          # 表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(50,50,50) #数字小,颜色深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)


        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,4):
                    # 判断单元格的值是否为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)))

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

    file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/动物数独/(打印合集) 动物拼图{}宫格难度{} ({}乘{}等于{}套{}人{}份).pdf" .format(hs,kk,db,cb,db*cb,num,num))

    file_merger.close()
    # doc.Close()

    # # print('----------第5步:删除临时文件夹------------')    
    import shutil
    shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/动物数独/零时Word') #递归删除文件夹,即:删除非空文件夹

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

终端输入

难度5=8空

 

难度6=9空

难度7=11空

难度8=12空

12空已经是小红书范例里面的第十二关了

因此 生成难度5-8,是符合需求的范围

说明:

多生成一点图片,删除不适合的宫格图,

如第1关,选每行每列都有图案,降低难度,

把PDF隐藏,先生成docx,手动删除后,在转成PDF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day05-java面向对象(上)

5.1 面向对象编程 5.1.1 类和对象 1、什么是类 类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。 属性&#xff1a;就是该事物的状态信息。 行为&#xff1a;就是在你这个程序中&#xff0c;该状态信息要做什么操作&#xff0c;或者基于事物…

web安全-SSH私钥泄露

发现主机 netdiscover -r 192.168.164.0 扫描端口 看到开放80和31337端口都为http服务 浏览器访问测试 查看80端口和31337端口网页和源代码并无发现有用信息 目录扫描 扫描出80端口并无有用信息 扫描31337端口 发现敏感文件robots.txt和目录.ssh 访问敏感文件和目录 /.ss…

pugixml C++ 开发者处理 XML 数据的理想选择之一

pugixml 是一个广受好评的 C XML 解析库&#xff0c;其相对优势包括但不限于以下几个方面&#xff1a; pugixml 以其高效、易用、全面的功能和良好的跨平台能力成为 C 开发者处理 XML 数据的理想选择之一。 链接&#xff1a; 使用Pugixml库&#xff0c;轻松处理XML文件-CSDN…

vue 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法

vue 的设计模式 —— MVVM M —— Model 模型&#xff0c;即数据V —— View 视图&#xff0c;即DOM渲染VM —— ViewModel 视图模型&#xff0c;用于实现Model和View的通信&#xff0c;即数据改变驱动视图渲染&#xff0c;监听视图事件修改数据 初次渲染 将模板编译为 render …

Prometheus报错,查不到数据

Warning: Error fetching server time: Detected 28799.947999954224 seconds time difference between your browser and the server. Prometheus relies on accurate time and time drift might cause unexpected query results. 1.这是因为服务器和本地时间不同步导致的 查…

抖店怎么回复客户消息才能减少差评?分享几个超级实用的话术!

哈喽~我是电商月月 新手入驻抖音小店出单后&#xff0c;或多或少都会遇到差评现象 差评私信不解决&#xff0c;顾客不满意&#xff0c;店铺的体验分下降&#xff0c;差评也能被所有的顾客看见 那之后的顾客就会觉得店铺不可靠&#xff0c;那新手如何避免这一现象呢 今天我就…

SLF4J对lombok类型的对象调用toString()失败--StackOverflowError

PackingDemand.class StatusHistory.class 造成该问题的原因是&#xff1a;PackingDemand与StatusHistory之间的双向引用。这些类中生成的两个toString()方法都会无休止地相互调用导致出现java.lang.StackOverflowError。 解决方法&#xff1a; 1.对于使用ToString.Exclude生…

Redis学习从入门到掌握(基础篇)

文章目录 一、初识Redis1.认识 Redis2.Redis常见命令&#xff08;1&#xff09;Redis 数据结构介绍&#xff08;2&#xff09;Redis 通用命令&#xff08;3&#xff09;String 类型&#xff08;4&#xff09;String 类型的常见命令&#xff08;5&#xff09;Hash 类型&#xff…

练习6 beach beauty

文章目录 图片展示 图片展示

说说我理解的数据库中的Schema吧

一、SQL标准对schema如何定义&#xff1f; ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合&#xff08;a persistent, named collection of descriptors&#xff09;。 大部分的网上资料定义Schema如下&#xff1a; schema是用来组织和管理数据的一种方式。它…

【渲染加速秘籍】3D建模不再卡顿:硬件升级、场景优化与云渲染全攻略!

在使用3D建模软件时&#xff0c;我们经常会遇到硬件资源消耗较大的问题&#xff0c;尤其是在进行染操作时。为了解决这一问题&#xff0c;我们可以采取以下几种方法来优化我们的工作流程和提升渲染效率。 1.升级硬件设备 对于经常需要进行渲染工作的用户来说&#xff0c;投资高…

让你的进程24小时在linux上运行

xshell原理 可能我们都在使用xshell时&#xff0c;都会遇到一些问题&#xff0c;就是你在xshell运行了你的服务器。可是你把xshell页面一关&#xff0c;你的服务器就自动关闭了&#xff0c;这是为什么呢&#xff1f;&#xff1f; 本质是因为我们的xshell在登陆服务器时&#…

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …

细胞世界:4.细胞分化(划区域)与细胞衰老(设施磨损)

(1)细胞凋亡 1. 概念&#xff1a;细胞凋亡可以比作城市的规划者主动拆除某些建筑来更新城市或防止危险建筑对市民的潜在伤害。这是一个有序的过程&#xff0c;由城市&#xff08;细胞内部&#xff09;的特定规划&#xff08;基因&#xff09;所决定。 2. 特征&#xff1a;细…

特别详细的Spring Cloud 系列教程2:微服务网关gateway的启动

继上一篇&#xff1a;特别详细的Spring Cloud 系列教程1&#xff1a;服务注册中心Eureka的启动 在比较多的教程和书籍里&#xff0c;spring cloud的微服务网关用的Zuul。然而&#xff0c;zuul已经不被官方提倡&#xff0c;现在提倡用的是spring cloud gateway。因为gateway的整…

c++编程(3)——类和对象(1)、类

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 类对象类的访问权限类的作用域 类 c最初对c语言的扩展就是增加了类的概念&#xff0c;使得c语言在原有的基础之上可以做到信息隐藏和封装。 那么我们先来讲讲“带类的c”与C语言相比有什么改进。 先讲讲类…

2024数学建模认证杯A题成品论文更新+全套数据集+可执行代码+可视化结果图标+学长保姆级答疑

题目&#xff1a;《基于TOPSIS和数值模拟的保暖纤维性能综合评价研究 &#xff08;完整资料论文都在文末&#xff01;&#xff01;&#xff09; 摘要&#xff1a;本研究通过数学建模方法深入探讨了人造保暖纤维的保暖性能&#xff0c;并建立了一个综合性的评价体系来全面…

scaling laws for neural language models

关于scaling law 的正确认识 - 知乎最近scaling law 成了最大的热词。一般的理解就是&#xff0c;想干大模型&#xff0c;清洗干净数据&#xff0c;然后把数据tokens量堆上来&#xff0c;然后搭建一个海量H100的集群&#xff0c;干就完了。训练模型不需要啥技巧&#xff0c;模型…

19(20)-1(3)-CSS3 平面 2D 变换+CSS3 过渡

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、CSS3 平面 2D 变换&#x1f48e;1 坐标轴&#x1f48e;2 transform 语法…

jenkins+sonar配置

安装插件 Sonar Scanner 用于扫描项目 配置sonar scanner jenkins集成sonar 1、sonar生成token 生成完保存好&#xff0c;刷新后无法查看 2、jenkins配置全局凭据 3、jenkins配置系统设置