【教学类-58-14】黑白三角拼图12——单页1页图。参考图1页6张(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格2-10、张数6张,适合集体操作)

news2025/4/1 9:30:54

背景需求:

基于以下两个代码,设计一个单页1页黑白三角、彩色三角(包含黑点、白点、无点)的代码。

【教学类-58-12】黑白三角拼图10(N张参考图+1张操作卡+多张彩色白块,适合个别化)-CSDN博客文章浏览阅读888次,点赞27次,收藏7次。【教学类-58-12】黑白三角拼图10(N张参考图+1张操作卡+多张彩色白块,适合个别化) https://blog.csdn.net/reasonsummer/article/details/146476754?spm=1011.2415.3001.5331【教学类-58-13】黑白三角拼图11——左右结构图、一页三张,颜色(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格起止数、张数,适合集体操作)-CSDN博客文章浏览阅读517次,点赞11次,收藏10次。【教学类-58-13】黑白三角拼图11——左右结构图、一页三张,颜色(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格起止数、张数,适合集体操作) https://blog.csdn.net/reasonsummer/article/details/146500374?spm=1011.2415.3001.5331

单页1页的黑白三角(包含黑点、白点、无点)

'''


彩色三角图,2宫格36张,3宫格36张……适合个别化 大操作卡
01彩色三角 1页1图大操作图 彩色块 无空心点 
1、选择颜色:彩色
2、黑点、白点、无点
3、随机图片
AI对话大师,阿夏
2025年3月26日

'''
import os,time
from PIL import Image, ImageDraw
from docx import Document
from docx.shared import Cm
from docx.shared import Pt
import shutil
import os
from PyPDF2 import PdfFileMerger 


path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250323黑白三角图案版(彩色)'

# 起始宫格数
start=int(input('开始宫格数,如2\n'))
# 最大宫格数
end=int(input('截止宫格数,如10\n'))

# 黑白或彩色


style=['0无圆点','1黑圆点','2白圆点']
s=int(input('请选择:0:无圆点,1:黑圆点,2:白圆点\n'))


# 1张(3张)=1,2
zhang=int(input('每种宫格生成多少张(一张有3份左右对称的?)比如:6张\n'))


colors=['black','black']
# 选择颜色:0黑白、1彩色


for gongge in range(start,end+1): # 遍历3宫格到10宫格
    for ys in range(zhang,zhang+1):
      
        new = path + fr'\{gongge:02}宫格组合图片'
        os.makedirs(new, exist_ok=True)

        newall=path+r'\02单页拼图'
        os.makedirs(newall,exist_ok=True)
        
        radius = 5
        f = 6 * ys  # 一页6张

        b = 400  # 画布大小
        by = 10  # 边距

        print('----------1\制作白色操作图------------')
        for g in range(gongge,gongge+1):
            for c in range(1, f + 1):
                # 创建bxb的画布
                canvas = Image.new('RGB', (b, b), (255, 255, 255))
                draw = ImageDraw.Draw(canvas)

                # 定义表格的行数和列数、边距
                rows = g
                cols = g
                margin = by

                # 计算单元格的宽度和高度
                cell_width = (b - 2 * margin) // cols
                cell_height = (b - 2 * margin) // rows

                # 绘制表格的竖直线
                for i in range(cols + 1):
                    x = margin + i * cell_width
                    draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                # 绘制表格的水平线
                for i in range(rows + 1):
                    y = margin + i * cell_height
                    draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                for i in range(rows):
                    for j in range(cols):
                        left = margin + j * cell_width
                        upper = margin + i * cell_height
                        right = left + cell_width
                        lower = upper + cell_height
                       # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
            
           
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)


                # # 保存画布
                # mb = f'{g:05d}格{c:05d}02模板{c:05d}.png'
                # canvas.save(new + fr'\{mb}')
                        

                # 保存画布
                mb = f'{g:05d}格模板.png'
                canvas.save(new + fr'\{mb}')


                print('---2、制作黑白参考图,计算三个坐标点的黑色三角形不重复图案有几个-------')

                # 创建一个空列表用于存储单元格的坐标
                cell_coordinates = []

                # 计算每个单元格的四个顶点坐标
                for row in range(rows):
                    for col in range(cols):
                        top_left = (margin + col * cell_width, margin + row * cell_height)
                        top_right = (margin + (col + 1) * cell_width, margin + row * cell_height)
                        bottom_left = (margin + col * cell_width, margin + (row + 1) * cell_height)
                        bottom_right = (margin + (col + 1) * cell_width, margin + (row + 1) * cell_height)

                        
                        # 将四个顶点坐标添加到列表中
                        cell_coordinates.append([top_left, top_right, bottom_left, bottom_right])
                # print(cell_coordinates)
                # print(len(cell_coordinates))
                # 16
                # [[(0, 0), (400, 0), (0, 400), (400, 400)], [(400, 0), (b, 0), (400, 400), (b, 400)], [(0, 400), (400, 400), (0, b), (400, b)], [(400, 400), (b, 400), (400, b), (b, b)]]

                import random
                import os

                combinations=[]
                # 存储选取的点,随机生成坐标(样式)排除重复,生成10份样式不同的模版
                while len(combinations) < f:
                    selected_points = []
                    for points in cell_coordinates:
                        selected_points.append(tuple(random.sample(points, 3)))
                    combinations.append(tuple(selected_points))

                print(combinations)
                print(len(combinations))
                #  10

                print('---3、制作三个坐标点的黑色三角形(4个)-------')
                from PIL import Image, ImageDraw            
                # 定义要绘制的坐标点组合
                
                for point_combination in combinations:
                    print(point_combination)
                    
                    # 清空selected_points列表
                    selected_points = []
                    h=1
                    # 遍历每个坐标点组合
                    for combination in point_combination:
                        # 从每个列表中随机选取三个点,并加入到selected_points中
                        selected_points.append(tuple(random.sample(combination, 3)))

                            # 读取图像文件
    #                创建bxb的画布
                    canvas = Image.new('RGB', (b,b), (255, 255, 255))
                    draw = ImageDraw.Draw(canvas)

                    # 定义表格的行数和列数、边距
                    rows = g
                    cols = g
                    margin = by

                    # 计算单元格的宽度和高度
                    cell_width = (b - 2 * margin) // cols
                    cell_height = (b - 2 * margin) // rows

                    # 绘制表格的竖直线
                    for i in range(cols + 1):
                        x = margin + i * cell_width
                        draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                    # 绘制表格的水平线
                    for i in range(rows + 1):
                        y = margin + i * cell_height
                        draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)
                    
                    
                

                    # # color=['black','black']
                    # color=['red','yellow','orange','blue','green','purple','pink']
                    color=colors
                    # 遍历每个坐标点组合
                    for combination in selected_points:
                        # 绘制填充为黑色的多边形
                    
                        # draw.polygon(combination, fill='black',outline=(255, 255, 255), width=1)
                        draw.polygon(combination, fill=random.choice(color), outline=('black'), width=2)

                       
                    for i in range(rows):
                        for j in range(cols):
                            left = margin + j * cell_width
                            upper = margin + i * cell_height
                            right = left + cell_width
                            lower = upper + cell_height

                    
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)

        

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                    # 保存结果图像
                    canvas.save(new + fr'\{g:05d}格{c:05d}01图纸{c:05d}.png')
                    
                    canvas.close()  # 关闭图像文件
        
                            
        

        print('----4、贴图用黑色色块----------')
        canvas = Image.new('RGB', (b, b), (255, 255, 255))
        draw = ImageDraw.Draw(canvas)

        # 绘制表格的竖直线和水平线
        for i in range(cols + 1):
            x = margin + i * cell_width
            draw.line([(x, margin), (x, b - margin)], fill='black', width=2)

        for i in range(rows + 1):
            y = margin + i * cell_height
            draw.line([(margin, y), (b - margin, y)], fill='black', width=2)

        # 在每个单元格中绘制两个三角形
        for row in range(rows):
            for col in range(cols):
                left = margin + col * cell_width
                upper = margin + row * cell_height
                right = left + cell_width
                lower = upper + cell_height              

                
                # 随机选择三个顶点坐标
                points = [(left, upper), (right, upper), (left, lower), (right, lower)]
                # random.shuffle(points)
                triangle1 = tuple(points[0:3])
                triangle2 = tuple(points[1:4])

                draw.polygon(triangle1, fill='black',outline='black',width=2)
                draw.polygon(triangle2, fill='white',outline='white',width=2)

        # 设置边框线为黑色
        draw.line([(margin, margin), (b - margin, margin), (b - margin, b - margin), (margin, b - margin), (margin, margin)], fill='black', width=2)

           
        for i in range(rows):
            for j in range(cols):
                left = margin + j * cell_width
                upper = margin + i * cell_height
                right = left + cell_width
                lower = upper + cell_height
                if s==0:  # 无圆点,纯黑线
                    pass
                elif s==1: # 绘制黑色小圆点
                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                fill=('black'), width=5)
                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                fill=('black'), width=5)
                else:   # # 绘制白色小圆点
                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                fill='white', outline='black', width=1)
                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                fill='white', outline='black', width=1)
                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                fill='white', outline='black', width=1)
                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                fill='white', outline='black', width=1)


        # 保存结果图像
        canvas.save(new + fr'\{g:05d}格黑块.png')
        canvas.close()




        print('---4合并打印------')


        # 第3步,读取图片写入docx,合并PDF

        import os,time
        from docx import Document
        from reportlab.lib.pagesizes import letter
        from reportlab.pdfgen import canvas
        from PyPDF2 import PdfMerger
        from docx.shared import Cm


        print('---5参考图合并-----')
        # 读取123文件夹中的所有图片地址(参考图)
        image_folder = new
        new_folder = path+r'\零时文件夹'
        os.makedirs(new_folder, exist_ok=True)
        image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

        new1=path+r'\保存1'
        os.makedirs(new1, exist_ok=True)

        # 每8个图片一组进行处理
        grouped_files = [image_files[:-2][i:i+6] for i in range(0, len(image_files[:-2]), 6)]
        print(grouped_files)

        # 处理每一组图片
        for group_index, group in enumerate(grouped_files):
            # 创建新的Word文档
            doc = Document(path+r'\模板6格.docx')
            print(group)
            
            # 遍历每个单元格,并插入图片
            for cell_index, image_file in enumerate(group):
                # 计算图片长宽(单位:厘米)
            
                
                # 插入图片到单元格
                table = doc.tables[0]
                cell = table.cell(int(cell_index / 2), cell_index % 2)
                # 6列两个都是6
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))
                
            # 保存Word文档
            doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
            

        # 所有docx合并成PDF

        # 将10个docx转为PDF
        import os
        from docx2pdf import convert
        from PyPDF2 import PdfFileMerger
        # from PyPDF4 import PdfMerger

        # output_folder = output_folder

        pdf_output_path = new1+fr'\02黑白三角{g:02d}宫格参考图.pdf'
    
        # 将所有DOCX文件转换为PDF
        for docx_file in os.listdir(new_folder):
            if docx_file.endswith('.docx'):
                docx_path = os.path.join(new_folder, docx_file)
                convert(docx_path, docx_path.replace('.docx', '.pdf'))
                time.sleep(3)


        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new_folder):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new_folder, pdf_file)
                merger.append(pdf_path)
        time.sleep(2)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path)
        merger.close()

        import shutil
        # 删除输出文件夹
        import time
        shutil.rmtree(new_folder)
        # shutil.rmtree(new)
        time.sleep(2)


        print('---6答题卡合并(白图和黑三角卡片-----')
        # 读取123文件夹中的所有图片地址(参考图)
        image_folder = new
        new_folder = path+r'\零时文件夹'      
        os.makedirs(new_folder, exist_ok=True)
        
        image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

        # 每8个图片一组进行处理
        grouped_files = [image_files[-2:][i:i+2] for i in range(0, len(image_files[-2:]), 2)]
        print(grouped_files)

        for group_index, group in enumerate(grouped_files):
        # 创建新的Word文档
            doc = Document(path+r'\底图1格.docx')
            print(group)

            t=[f'黑白三角({gongge}宫格)操作卡',f'黑白三角({gongge}宫格)贴图卡']
            # 在单元格0,0写入“黑白三角(3宫格)操作卡”,24磅宋体
            for tt in range(len(t)):             
                table = doc.tables[tt]                # 两张表格
                cell = table.cell(0, 0)
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run(t[tt])
                run.font.name = '宋体'
                run.font.size = Pt(40)
            
                    
            # 遍历每个单元格,并插入图片
            for cell_index, image_file in enumerate(group):
                # 计算图片长宽(单位:厘米)
                
                # 插入图片到单元格
                
                table = doc.tables[0]
                if cell_index == 0:
                    cell = table.cell(1, 0)
                table = doc.tables[1]
                if cell_index == 1:
                    cell = table.cell(1, 0)
                # else:
                #     continue
                
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                run.add_picture(image_file, width=Cm(19.6), height=Cm(19.6))
            
        # 保存Word文档
        doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))

        
        # output_folder = output_folder

        pdf_output_path = new1+fr'\01黑白三角{g:02d}宫格黑块底图.pdf'
        # pdf_output_path = path+fr'\黑白三角1-10宫格随机每款{f*ys}图共{ys}张一黑一白黑点白边黑白.pdf'

        # 将所有DOCX文件转换为PDF
        for docx_file in os.listdir(new_folder):
            if docx_file.endswith('.docx'):
                docx_path = os.path.join(new_folder, docx_file)
                convert(docx_path, docx_path.replace('.docx', '.pdf'))
                time.sleep(1)

        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new_folder):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new_folder, pdf_file)
                merger.append(pdf_path)
        time.sleep(2)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path)
        merger.close()

        
        # 删除输出文件夹
        
        shutil.rmtree(new_folder)
        shutil.rmtree(new)
        time.sleep(5)





        # print('---7合并答题卡和黑白三角卡片-----')
        t_folder = path+r'\pdf'
        os.makedirs(t_folder, exist_ok=True)
        
        pdf_output_path2 = t_folder + fr'\01黑白三角{g:02d}宫格{f}张合并.pdf'       
    
        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new1):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new1, pdf_file)
                merger.append(pdf_path)
                time.sleep(2)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path2)
        merger.close()

    
        # 删除输出文件夹
        
        shutil.rmtree(new1)
        # shutil.rmtree(new)
#         time.sleep(2)

print('------3-10宫格全部打包-------')
# pdf_output_path = path + fr'\01黑白三角全黑块({start}-{end})宫格{zhang*(end-start+1)}张参考图1套操作板.pdf' 
# output_folder = output_folder
if s==0:
    pdf_output_path = newall+fr'\01-01(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 无小圆点.pdf'
elif s==1:
    pdf_output_path = newall+fr'\01-02(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 黑色小圆点.pdf'
elif s==2:
    pdf_output_path = newall+fr'\01-03(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 白色小圆点.pdf'

# 合并零时文件里所有PDF文件
merger = PdfFileMerger()
for pdf_file in os.listdir(t_folder):
    if pdf_file.endswith('.pdf'):
        pdf_path = os.path.join(t_folder, pdf_file)
        merger.append(pdf_path)
        time.sleep(2)

# 保存合并后的PDF文件
merger.write(pdf_output_path)
merger.close()


# 删除输出文件夹
shutil.rmtree(t_folder)
# shutil.rmtree(new)





单页1页的彩色三角(包含黑圆点、白点、无点、贴图卡片有7色)

'''

彩色三角图,2宫格36张,3宫格36张……适合个别化 大操作卡
01彩色三角 1页1图大操作图 彩色块 无空心点 
1、选择颜色:彩色
2、黑点、白点、无点
3、随机图片
AI对话大师,阿夏
2025年3月26日

'''
import os,time
from PIL import Image, ImageDraw
from docx import Document
from docx.shared import Cm
from docx.shared import Pt
import shutil
import os
from PyPDF2 import PdfFileMerger  


# 起始宫格数
start=int(input('开始宫格数,如2\n'))
# 最大宫格数
end=int(input('截止宫格数,如10\n'))

# 黑白或彩色

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250323黑白三角图案版(彩色)'

style=['0无圆点','1黑圆点','2白圆点']
s=int(input('请选择:0:无圆点,1:黑圆点,2:白圆点\n'))

# 1张(3张)=1,2
zhang=int(input('每种宫格生成多少张(一张有3份左右对称的?)比如:6张\n'))

colors=['red','yellow','orange','blue','green','purple','pink']
# 选择颜色:0黑白、1彩色


# 选择颜色:0彩色、1彩色


for gongge in range(start,end+1): # 遍历3宫格到10宫格
    for ys in range(zhang,zhang+1):
      
        new = path + fr'\{gongge:02}宫格组合图片'
        os.makedirs(new, exist_ok=True)
        
        newall=path+r'\02单页拼图'
        os.makedirs(newall,exist_ok=True)
        
        radius = 5
        f = 6 * ys  # 一页6张

        b = 400  # 画布大小
        by = 10  # 边距

        print('----------1\制作白色操作图------------')
        for g in range(gongge,gongge+1):
            for c in range(1, f + 1):
                # 创建bxb的画布
                canvas = Image.new('RGB', (b, b), (255, 255, 255))
                draw = ImageDraw.Draw(canvas)

                # 定义表格的行数和列数、边距
                rows = g
                cols = g
                margin = by

                # 计算单元格的宽度和高度
                cell_width = (b - 2 * margin) // cols
                cell_height = (b - 2 * margin) // rows

                # 绘制表格的竖直线
                for i in range(cols + 1):
                    x = margin + i * cell_width
                    draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                # 绘制表格的水平线
                for i in range(rows + 1):
                    y = margin + i * cell_height
                    draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                for i in range(rows):
                    for j in range(cols):
                        left = margin + j * cell_width
                        upper = margin + i * cell_height
                        right = left + cell_width
                        lower = upper + cell_height
                                    
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)

                # 保存画布
                mb = f'{g:05d}格模板.png'
                canvas.save(new + fr'\{mb}')


                print('---2、制作彩色参考图,计算三个坐标点的黑色三角形不重复图案有几个-------')

                # 创建一个空列表用于存储单元格的坐标
                cell_coordinates = []

                # 计算每个单元格的四个顶点坐标
                for row in range(rows):
                    for col in range(cols):
                        top_left = (margin + col * cell_width, margin + row * cell_height)
                        top_right = (margin + (col + 1) * cell_width, margin + row * cell_height)
                        bottom_left = (margin + col * cell_width, margin + (row + 1) * cell_height)
                        bottom_right = (margin + (col + 1) * cell_width, margin + (row + 1) * cell_height)

                        
                        # 将四个顶点坐标添加到列表中
                        cell_coordinates.append([top_left, top_right, bottom_left, bottom_right])
                # print(cell_coordinates)
                # print(len(cell_coordinates))
                # 16
                # [[(0, 0), (400, 0), (0, 400), (400, 400)], [(400, 0), (b, 0), (400, 400), (b, 400)], [(0, 400), (400, 400), (0, b), (400, b)], [(400, 400), (b, 400), (400, b), (b, b)]]

                import random
                import os

                combinations=[]
                # 存储选取的点,随机生成坐标(样式)排除重复,生成10份样式不同的模版
                while len(combinations) < f:
                    selected_points = []
                    for points in cell_coordinates:
                        selected_points.append(tuple(random.sample(points, 3)))
                    combinations.append(tuple(selected_points))

                print(combinations)
                print(len(combinations))
                #  10

                print('---3、制作三个坐标点的黑色三角形(4个)-------')
                from PIL import Image, ImageDraw            
                # 定义要绘制的坐标点组合
                
                for point_combination in combinations:
                    print(point_combination)
                    
                    # 清空selected_points列表
                    selected_points = []
                    h=1
                    # 遍历每个坐标点组合
                    for combination in point_combination:
                        # 从每个列表中随机选取三个点,并加入到selected_points中
                        selected_points.append(tuple(random.sample(combination, 3)))

                            # 读取图像文件
    #                创建bxb的画布
                    canvas = Image.new('RGB', (b,b), (255, 255, 255))
                    draw = ImageDraw.Draw(canvas)

                    # 定义表格的行数和列数、边距
                    rows = g
                    cols = g
                    margin = by

                    # 计算单元格的宽度和高度
                    cell_width = (b - 2 * margin) // cols
                    cell_height = (b - 2 * margin) // rows

                    # 绘制表格的竖直线
                    for i in range(cols + 1):
                        x = margin + i * cell_width
                        draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                    # 绘制表格的水平线
                    for i in range(rows + 1):
                        y = margin + i * cell_height
                        draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                    # # color=['black','black']
                    # color=['red','yellow','orange','blue','green','purple','pink']
                    color=colors
                    # 遍历每个坐标点组合
                    for combination in selected_points:
                        # 绘制填充为黑色的多边形
                    
                        # draw.polygon(combination, fill='black',outline=(255, 255, 255), width=1)
                        draw.polygon(combination, fill=random.choice(color), outline=(0, 0, 0), width=2)

                    for i in range(rows):
                        for j in range(cols):
                            left = margin + j * cell_width
                            upper = margin + i * cell_height
                            right = left + cell_width
                            lower = upper + cell_height

                    
                            if s==0:  # 无圆点,纯黑线
                                pass
                            elif s==1: # 绘制黑色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill=('black'), width=5)
                            else:   # # 绘制白色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill='white', outline='black', width=1)

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                    # 保存结果图像
                    canvas.save(new + fr'\{g:05d}格{c:05d}01图纸{c:05d}.png')
                    
                    canvas.close()  # 关闭图像文件
        
                            
        

        print('----4、贴图用黑色色块----------')
        for yy in colors:
            print(yy)
            canvas = Image.new('RGB', (b, b), (255, 255, 255))
            draw = ImageDraw.Draw(canvas)

            # 绘制表格的竖直线和水平线
            for i in range(cols + 1):
                x = margin + i * cell_width
                draw.line([(x, margin), (x, b - margin)], fill='black', width=2)

            for i in range(rows + 1):
                y = margin + i * cell_height
                draw.line([(margin, y), (b - margin, y)], fill='black', width=2)

            # # 在每个单元格中绘制两个三角形
            for row in range(rows):
                for col in range(cols):
                    left = margin + col * cell_width
                    upper = margin + row * cell_height
                    right = left + cell_width
                    lower = upper + cell_height

                    # 随机选择三个顶点坐标
                    points = [(left, upper), (right, upper), (left, lower), (right, lower)]
                    # random.shuffle(points)
                    triangle1 = tuple(points[0:3])
                    triangle2 = tuple(points[1:4])

            #         # 绘制三角形
            #         # 全部黑填充,白色边框
            #         # draw.polygon(triangle1, fill='black',outline='white',width=2)
            #         # draw.polygon(triangle2, fill='black',outline='white',width=2)
                    # 全部黑色填充用黑色边框,白色填充用白色边框
                    draw.polygon(triangle1, fill=yy,outline='black',width=2)
                    draw.polygon(triangle2, fill='white',outline='black',width=2)

            # 设置边框线为白色
            draw.line([(margin, margin), (b - margin, margin), (b - margin, b - margin), (margin, b - margin), (margin, margin)], fill='white', width=2)

            for i in range(rows):
                for j in range(cols):
                    left = margin + j * cell_width
                    upper = margin + i * cell_height
                    right = left + cell_width
                    lower = upper + cell_height

            
                    if s==0:  # 无圆点,纯黑线
                        pass
                    elif s==1: # 绘制黑色小圆点
                        draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                    fill=('black'), width=5)
                    else:   # # 绘制白色小圆点
                        draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                    fill='white', outline='black', width=1)

            # 保存结果图像
            canvas.save(new + fr'\{g:05d}格黑块{yy}.png')
            canvas.close()




        print('---4合并打印------')


        # 第3步,读取图片写入docx,合并PDF

        import os,time
        from docx import Document
        from reportlab.lib.pagesizes import letter
        from reportlab.pdfgen import canvas
        from PyPDF2 import PdfMerger
        from docx.shared import Cm


        print('---5参考图合并-----')
        # 读取123文件夹中的所有图片地址(参考图)
        image_folder = new
        new_folder = path+r'\零时文件夹'
        os.makedirs(new_folder, exist_ok=True)
        image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

        new1=path+r'\保存1'
        os.makedirs(new1, exist_ok=True)

        # 每8个图片一组进行处理
      
        # -8张
        grouped_files = [image_files[:f][i:i+6] for i in range(0, len(image_files[:f]), 6)]
        print(grouped_files)

        # 处理每一组图片
        for group_index, group in enumerate(grouped_files):
            # 创建新的Word文档
            doc = Document(path+r'\模板6格.docx')
            print(group)
            
            # 遍历每个单元格,并插入图片
            for cell_index, image_file in enumerate(group):
                # 计算图片长宽(单位:厘米)
            
                
                # 插入图片到单元格
                table = doc.tables[0]
                cell = table.cell(int(cell_index / 2), cell_index % 2)
                # 6列两个都是6
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))
                
            # 保存Word文档
            doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
            

        # 所有docx合并成PDF

        # 将10个docx转为PDF
        import os
        from docx2pdf import convert
        from PyPDF2 import PdfFileMerger
        # from PyPDF4 import PdfMerger

        # output_folder = output_folder

        pdf_output_path = new1+fr'\02彩色三角{g:02d}宫格参考图.pdf'
    
        # 将所有DOCX文件转换为PDF
        for docx_file in os.listdir(new_folder):
            if docx_file.endswith('.docx'):
                docx_path = os.path.join(new_folder, docx_file)
                convert(docx_path, docx_path.replace('.docx', '.pdf'))
                time.sleep(3)


        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new_folder):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new_folder, pdf_file)
                merger.append(pdf_path)
        time.sleep(2)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path)
        merger.close()

        import shutil
        # 删除输出文件夹
        import time
        shutil.rmtree(new_folder)
        # shutil.rmtree(new)
        time.sleep(2)


        print('---6答题卡合并(白图和黑三角卡片-----')
        # 读取123文件夹中的所有图片地址(参考图)
        image_folder = new
        new_folder = path+r'\零时文件夹1'      
        os.makedirs(new_folder, exist_ok=True)
       
        # 只要文件名
        image_name = [file for file in os.listdir(image_folder) if file.endswith('.png')]
        # 只要最后几个
        o = len(image_name)
        o1=o-f
        o2=-1
        flattened_names= [image_name[f:][i:i+o1] for i in range(0, len(image_name[f:]), o1)]
        print(flattened_names)

                # 去掉一层嵌套
        flattened_name = [item for sublist in flattened_names for item in sublist]
        print(flattened_name)


        t=[f'彩色三角({gongge}宫格)操作卡']
        t2=[f'彩色三角({gongge}宫格)贴图卡']*(o1-1)
        # 贴图卡后面添加颜色
        for t3 in range(len(t2)):
            t.append(t2[t3]+'('+flattened_name[t3+1][8:-4]+')')
        print(t)

        # 文件名+路径
        image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]
        
        flattened_lists= [image_files[f:][i:i+o1] for i in range(0, len(image_files[f:]), o1)]
        print(flattened_lists)
        # 多余的图
        flattened_list = [item for sublist in  flattened_lists for item in sublist]
        print(flattened_list)

        
       
    # # #  ['彩色三角(2宫格)操作卡', '彩色三角(2宫格)贴图卡(red)', '彩色三角(2宫格)贴图卡(yellow)', '彩色三角(2宫格)贴图卡(orange)', '彩色三角(2宫格)贴图卡(blue)', '彩色三角 
    # # # (2宫格)贴图卡(green)', '彩色三角(2宫格)贴图卡(purple)', '彩色三角(2宫格)贴图卡(pink)']

        for group_index in range(len(flattened_list)):
            print(group_index)        # 创建新的Word文档
            # 0
            doc = Document(path+r'\底图0格.docx')

            # 在单元格0,0写入“彩色三角(3宫格)操作卡”,24磅宋体
            # for tt in range(len(t)):             
            table = doc.tables[0]                # 两张表格
            cell = table.cell(0, 0)
            cell_paragraph = cell.paragraphs[0]
            cell_paragraph.clear()
            run = cell_paragraph.add_run(t[group_index])
            run.font.name = '宋体'
            run.font.size = Pt(40)
            
                    
            # 插入图片
            # if cell_index == 0:
            cell = table.cell(1, 0)                          
            cell_paragraph = cell.paragraphs[0]
            cell_paragraph.clear()
            run = cell_paragraph.add_run()
            image_file1 = flattened_list[group_index]
            # image_file1=str(flattened_lists[group_index])
            print(image_file1)
            run.add_picture(image_file1, width=Cm(19.6), height=Cm(19.6))
            
            # 保存Word文档
            doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))



        pdf_output_path = new1+fr'\01彩色三角{g:02d}宫格黑块底图.pdf'
        # pdf_output_path = path+fr'\彩色三角1-10宫格随机每款{f*ys}图共{ys}张一黑一白黑点白边彩色.pdf'

        # 将所有DOCX文件转换为PDF
        for docx_file in os.listdir(new_folder):
            if docx_file.endswith('.docx'):
                docx_path = os.path.join(new_folder, docx_file)
                convert(docx_path, docx_path.replace('.docx', '.pdf'))
                time.sleep(3)

        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new_folder):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new_folder, pdf_file)
                merger.append(pdf_path)
        time.sleep(3)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path)
        merger.close()

        
        # 删除输出文件夹
        
        shutil.rmtree(new_folder)

        time.sleep(2)





        # print('---7合并答题卡和彩色三角卡片-----')
        t_folder = path+r'\pdf'
        os.makedirs(t_folder, exist_ok=True)
        
        pdf_output_path2 = t_folder + fr'\01彩色三角{g:02d}宫格{f}张合并.pdf'       
    
        # 合并零时文件里所有PDF文件
        merger = PdfFileMerger()
        for pdf_file in os.listdir(new1):
            if pdf_file.endswith('.pdf'):
                pdf_path = os.path.join(new1, pdf_file)
                merger.append(pdf_path)
                time.sleep(2)

        # 保存合并后的PDF文件
        merger.write(pdf_output_path2)
        merger.close()

        # 删除输出文件夹
        
        shutil.rmtree(new1)
        # shutil.rmtree(new)
#         time.sleep(2)

print('------3-10宫格全部打包-------')
# pdf_output_path = path + fr'\01彩色三角全黑块({start}-{end})宫格{zhang*(end-start+1)}张参考图1套操作板.pdf' 
if s==0:
    pdf_output_path = newall+fr'\01-01(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 无小圆点.pdf'
elif s==1:
    pdf_output_path = newall+fr'\01-02(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 黑色小圆点.pdf'
elif s==2:
    pdf_output_path = newall+fr'\01-03(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 白色小圆点.pdf'

 
#   合并零时文件里所有PDF文件
merger = PdfFileMerger()
for pdf_file in os.listdir(t_folder):
    if pdf_file.endswith('.pdf'):
        pdf_path = os.path.join(t_folder, pdf_file)
        merger.append(pdf_path)
        time.sleep(2)

# 保存合并后的PDF文件
merger.write(pdf_output_path)
merger.close()


# 删除输出文件夹
shutil.rmtree(t_folder)




但是生成过程中每次都出现病毒提示,必须点开设置允许,不去管它的话,30秒后就自动删除PDF文件了。

所以我想直接把三款一次性生成。做了一个遍历。

黑白三角 1页1图:操作卡和贴图卡

'''


彩色三角图,2宫格36张,3宫格36张……适合个别化 大操作卡
01彩色三角 1页1图大操作图 彩色块 无空心点 
1、选择颜色:彩色
2、黑点、白点、无点
3、随机图片
AI对话大师,阿夏
2025年3月26日

'''
import os,time
from PIL import Image, ImageDraw
from docx import Document
from docx.shared import Cm
from docx.shared import Pt
import shutil
import os
from PyPDF2 import PdfFileMerger 


path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250323黑白三角图案版(彩色)'

# 起始宫格数
start=int(input('开始宫格数,如2\n'))
# 最大宫格数
end=int(input('截止宫格数,如10\n'))

#  选择颜色:0黑白、1彩色
colors=['black','black']

# 黑白或彩色
zhang=int(input('每种宫格生成多少张(一张有3份左右对称的?)比如:6张\n'))

style=['0无圆点','1黑圆点','2白圆点']
# s=int(input('请选择:0:无圆点,1:黑圆点,2:白圆点\n'))

for s in [0,1,2]:    # 三种样式都生成
    # 1张(3张)=1,2

    for gongge in range(start,end+1): # 遍历3宫格到10宫格
        for ys in range(zhang,zhang+1):
        
            new = path + fr'\{gongge:02}宫格组合图片'
            os.makedirs(new, exist_ok=True)

            newall=path+r'\02单页拼图'
            os.makedirs(newall,exist_ok=True)
            
            radius = 5
            f = 6 * ys  # 一页6张

            b = 400  # 画布大小
            by = 10  # 边距

            print('----------1\制作白色操作图------------')
            for g in range(gongge,gongge+1):
                for c in range(1, f + 1):
                    # 创建bxb的画布
                    canvas = Image.new('RGB', (b, b), (255, 255, 255))
                    draw = ImageDraw.Draw(canvas)

                    # 定义表格的行数和列数、边距
                    rows = g
                    cols = g
                    margin = by

                    # 计算单元格的宽度和高度
                    cell_width = (b - 2 * margin) // cols
                    cell_height = (b - 2 * margin) // rows

                    # 绘制表格的竖直线
                    for i in range(cols + 1):
                        x = margin + i * cell_width
                        draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                    # 绘制表格的水平线
                    for i in range(rows + 1):
                        y = margin + i * cell_height
                        draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                    
                    for i in range(rows):
                        for j in range(cols):
                            left = margin + j * cell_width
                            upper = margin + i * cell_height
                            right = left + cell_width
                            lower = upper + cell_height
                        # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形                
            
                            if s==0:  # 无圆点,纯黑线
                                pass
                            elif s==1: # 绘制黑色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill=('black'), width=5)
                            else:   # # 绘制白色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill='white', outline='black', width=1)

                    # 保存画布
                    mb = f'{g:05d}格模板.png'
                    canvas.save(new + fr'\{mb}')

                    print('---2、制作黑白参考图,计算三个坐标点的黑色三角形不重复图案有几个-------')

                    # 创建一个空列表用于存储单元格的坐标
                    cell_coordinates = []

                    # 计算每个单元格的四个顶点坐标
                    for row in range(rows):
                        for col in range(cols):
                            top_left = (margin + col * cell_width, margin + row * cell_height)
                            top_right = (margin + (col + 1) * cell_width, margin + row * cell_height)
                            bottom_left = (margin + col * cell_width, margin + (row + 1) * cell_height)
                            bottom_right = (margin + (col + 1) * cell_width, margin + (row + 1) * cell_height)

                            
                            # 将四个顶点坐标添加到列表中
                            cell_coordinates.append([top_left, top_right, bottom_left, bottom_right])
                            # print(cell_coordinates)
                            # print(len(cell_coordinates))
                            # 16
                            # [[(0, 0), (400, 0), (0, 400), (400, 400)], [(400, 0), (b, 0), (400, 400), (b, 400)], [(0, 400), (400, 400), (0, b), (400, b)], [(400, 400), (b, 400), (400, b), (b, b)]]

                    import random
                    import os

                    combinations=[]
                    # 存储选取的点,随机生成坐标(样式)排除重复,生成10份样式不同的模版
                    while len(combinations) < f:
                        selected_points = []
                        for points in cell_coordinates:
                            selected_points.append(tuple(random.sample(points, 3)))
                        combinations.append(tuple(selected_points))

                    print(combinations)
                    print(len(combinations))
                    #  10

                    print('---3、制作三个坐标点的黑色三角形(4个)-------')
                    from PIL import Image, ImageDraw            
                    # 定义要绘制的坐标点组合
                    
                    for point_combination in combinations:
                        print(point_combination)
                        
                        # 清空selected_points列表
                        selected_points = []
                        h=1
                        # 遍历每个坐标点组合
                        for combination in point_combination:
                            # 从每个列表中随机选取三个点,并加入到selected_points中
                            selected_points.append(tuple(random.sample(combination, 3)))

                                # 读取图像文件
        #                创建bxb的画布
                        canvas = Image.new('RGB', (b,b), (255, 255, 255))
                        draw = ImageDraw.Draw(canvas)

                        # 定义表格的行数和列数、边距
                        rows = g
                        cols = g
                        margin = by

                        # 计算单元格的宽度和高度
                        cell_width = (b - 2 * margin) // cols
                        cell_height = (b - 2 * margin) // rows

                        # 绘制表格的竖直线
                        for i in range(cols + 1):
                            x = margin + i * cell_width
                            draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                        # 绘制表格的水平线
                        for i in range(rows + 1):
                            y = margin + i * cell_height
                            draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)
                        
                        # # color=['black','black']
                        # color=['red','yellow','orange','blue','green','purple','pink']
                        color=colors
                        # 遍历每个坐标点组合
                        for combination in selected_points:
                            # 绘制填充为黑色的多边形
                            # draw.polygon(combination, fill='black',outline=(255, 255, 255), width=1)
                            draw.polygon(combination, fill=random.choice(color), outline=('black'), width=2)
                        for i in range(rows):
                            for j in range(cols):
                                left = margin + j * cell_width
                                upper = margin + i * cell_height
                                right = left + cell_width
                                lower = upper + cell_height
                      
                        
                                if s==0:  # 无圆点,纯黑线
                                    pass
                                elif s==1: # 绘制黑色小圆点
                                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                                fill=('black'), width=5)
                                else:   # # 绘制白色小圆点
                                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                                fill='white', outline='black', width=1)

                        # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形                    
                        # 保存结果图像
                        canvas.save(new + fr'\{g:05d}格{c:05d}01图纸{c:05d}.png')
                        
                        canvas.close()  # 关闭图像文件      

            print('----4、贴图用黑色色块----------')
            canvas = Image.new('RGB', (b, b), (255, 255, 255))
            draw = ImageDraw.Draw(canvas)

            # 绘制表格的竖直线和水平线
            for i in range(cols + 1):
                x = margin + i * cell_width
                draw.line([(x, margin), (x, b - margin)], fill='black', width=2)

            for i in range(rows + 1):
                y = margin + i * cell_height
                draw.line([(margin, y), (b - margin, y)], fill='black', width=2)

            # 在每个单元格中绘制两个三角形
            for row in range(rows):
                for col in range(cols):
                    left = margin + col * cell_width
                    upper = margin + row * cell_height
                    right = left + cell_width
                    lower = upper + cell_height      

                    # 随机选择三个顶点坐标
                    points = [(left, upper), (right, upper), (left, lower), (right, lower)]
                    # random.shuffle(points)
                    triangle1 = tuple(points[0:3])
                    triangle2 = tuple(points[1:4])

                    draw.polygon(triangle1, fill='black',outline='black',width=2)
                    # draw.polygon(triangle2, fill='white',outline='white',width=1)

            # 设置边框线为黑色
            # draw.line([(margin, margin), (b - margin, margin), (b - margin, b - margin), (margin, b - margin), (margin, margin)], fill='black', width=2)
            
            for i in range(rows):
                for j in range(cols):
                    left = margin + j * cell_width
                    upper = margin + i * cell_height
                    right = left + cell_width
                    lower = upper + cell_height
                    if s==0:  # 无圆点,纯黑线
                        pass
                    elif s==1: # 绘制黑色小圆点
                        draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                    fill=('black'), width=5)
                        draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                    fill=('black'), width=5)
                    else:   # # 绘制白色小圆点
                        draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                    fill='white', outline='black', width=1)
                        draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                    fill='white', outline='black', width=1)

            # 保存结果图像
            canvas.save(new + fr'\{g:05d}格黑块.png')
            canvas.close()

            print('---4合并打印------')
            # 第3步,读取图片写入docx,合并PDF

            import os,time
            from docx import Document
            from reportlab.lib.pagesizes import letter
            from reportlab.pdfgen import canvas
            from PyPDF2 import PdfMerger
            from docx.shared import Cm

            print('---5参考图合并-----')
            # 读取123文件夹中的所有图片地址(参考图)
            image_folder = new
            new_folder = path+r'\零时文件夹'
            os.makedirs(new_folder, exist_ok=True)
            image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

            new1=path+r'\保存1'
            os.makedirs(new1, exist_ok=True)

            # 每8个图片一组进行处理
            grouped_files = [image_files[:-2][i:i+6] for i in range(0, len(image_files[:-2]), 6)]
            print(grouped_files)

            # 处理每一组图片
            for group_index, group in enumerate(grouped_files):
                # 创建新的Word文档
                doc = Document(path+r'\模板6格.docx')
                print(group)
                
                # 遍历每个单元格,并插入图片
                for cell_index, image_file in enumerate(group):
                    # 计算图片长宽(单位:厘米)                
                    
                    # 插入图片到单元格
                    table = doc.tables[0]
                    cell = table.cell(int(cell_index / 2), cell_index % 2)
                    # 6列两个都是6
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run()
                    run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))
                    
                # 保存Word文档
                doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))
 
            # 将10个docx转为PDF
            import os
            from docx2pdf import convert
            from PyPDF2 import PdfFileMerger
            # from PyPDF4 import PdfMerger

            # output_folder = output_folder

            pdf_output_path = new1+fr'\02黑白三角{g:02d}宫格参考图.pdf'
        
            # 将所有DOCX文件转换为PDF
            for docx_file in os.listdir(new_folder):
                if docx_file.endswith('.docx'):
                    docx_path = os.path.join(new_folder, docx_file)
                    convert(docx_path, docx_path.replace('.docx', '.pdf'))
                    time.sleep(3)


            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new_folder):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new_folder, pdf_file)
                    merger.append(pdf_path)
            time.sleep(2)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path)
            merger.close()

            import shutil
            # 删除输出文件夹
            import time
            shutil.rmtree(new_folder)
            # shutil.rmtree(new)
            time.sleep(2)

            print('---6答题卡合并(白图和黑三角卡片-----')
            # 读取123文件夹中的所有图片地址(参考图)
            image_folder = new
            new_folder = path+r'\零时文件夹'      
            os.makedirs(new_folder, exist_ok=True)
            
            image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

            # 每8个图片一组进行处理
            grouped_files = [image_files[-2:][i:i+2] for i in range(0, len(image_files[-2:]), 2)]
            print(grouped_files)

            for group_index, group in enumerate(grouped_files):
            # 创建新的Word文档
                doc = Document(path+r'\底图1格.docx')
                print(group)

                t=[f'黑白三角({gongge}宫格)操作卡',f'黑白三角({gongge}宫格)贴图卡']
                # 在单元格0,0写入“黑白三角(3宫格)操作卡”,24磅宋体
                for tt in range(len(t)):             
                    table = doc.tables[tt]                # 两张表格
                    cell = table.cell(0, 0)
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run(t[tt])
                    run.font.name = '宋体'
                    run.font.size = Pt(40)
                
                        
                # 遍历每个单元格,并插入图片
                for cell_index, image_file in enumerate(group):
                    # 计算图片长宽(单位:厘米)
                    
                    # 插入图片到单元格
                    
                    table = doc.tables[0]
                    if cell_index == 0:
                        cell = table.cell(1, 0)
                    table = doc.tables[1]
                    if cell_index == 1:
                        cell = table.cell(1, 0)
                    # else:
                    #     continue
                    
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run()
                    run.add_picture(image_file, width=Cm(19.6), height=Cm(19.6))
                
            # 保存Word文档
            doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))

            pdf_output_path = new1+fr'\01黑白三角{g:02d}宫格黑块底图.pdf'
            # pdf_output_path = path+fr'\黑白三角1-10宫格随机每款{f*ys}图共{ys}张一黑一白黑点白边黑白.pdf'

            # 将所有DOCX文件转换为PDF
            for docx_file in os.listdir(new_folder):
                if docx_file.endswith('.docx'):
                    docx_path = os.path.join(new_folder, docx_file)
                    convert(docx_path, docx_path.replace('.docx', '.pdf'))
                    time.sleep(1)

            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new_folder):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new_folder, pdf_file)
                    merger.append(pdf_path)
            time.sleep(2)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path)
            merger.close()
            
            # 删除输出文件夹            
            shutil.rmtree(new_folder)
            shutil.rmtree(new)
            time.sleep(5)

            # print('---7合并答题卡和黑白三角卡片-----')
            t_folder = path+r'\pdf'
            os.makedirs(t_folder, exist_ok=True)
            
            pdf_output_path2 = t_folder + fr'\01黑白三角{g:02d}宫格{f}张合并.pdf'       
        
            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new1):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new1, pdf_file)
                    merger.append(pdf_path)
                    time.sleep(2)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path2)
            merger.close()
        
            # 删除输出文件夹            
            shutil.rmtree(new1)
            # shutil.rmtree(new)
    #         time.sleep(2)

    print('------3-10宫格全部打包-------')
    if s==0:
        pdf_output_path = newall+fr'\01-01(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 无小圆点.pdf'
    elif s==1:
        pdf_output_path = newall+fr'\01-02(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 黑色小圆点.pdf'
    elif s==2:
        pdf_output_path = newall+fr'\01-03(单页1页)黑白三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 白色小圆点.pdf'

    # 合并零时文件里所有PDF文件
    merger = PdfFileMerger()
    for pdf_file in os.listdir(t_folder):
        if pdf_file.endswith('.pdf'):
            pdf_path = os.path.join(t_folder, pdf_file)
            merger.append(pdf_path)
            time.sleep(2)

    # 保存合并后的PDF文件
    merger.write(pdf_output_path)
    merger.close()

    # 删除输出文件夹
    shutil.rmtree(t_folder)
  





白点

黑点

无点

彩色三角合并版 1页1图,白点、黑点、无点,三合一

'''

彩色三角图,2宫格36张,3宫格36张……适合个别化 大操作卡
01彩色三角 1页1图大操作图 彩色块 无空心点 
1、选择颜色:彩色
2、黑点、白点、无点
3、随机图片
AI对话大师,阿夏
2025年3月26日

'''
import os,time
from PIL import Image, ImageDraw
from docx import Document
from docx.shared import Cm
from docx.shared import Pt
import shutil
import os
from PyPDF2 import PdfFileMerger  


path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250323黑白三角图案版(彩色)'

# 起始宫格数
start=int(input('开始宫格数,如2\n'))
# 最大宫格数
end=int(input('截止宫格数,如10\n'))

# 黑白或彩色


# 黑白或彩色
zhang=int(input('每种宫格生成多少张(一张有3份左右对称的?)比如:6张\n'))

style=['0无圆点','1黑圆点','2白圆点']
# s=int(input('请选择:0:无圆点,1:黑圆点,2:白圆点\n'))



for s in [0,1,2]:    # 三种样式都生成
    #
    colors=['red','yellow','orange','blue','green','purple','pink']
    # 选择颜色:0黑白、1彩色


    # 选择颜色:0彩色、1彩色


    for gongge in range(start,end+1): # 遍历3宫格到10宫格
        for ys in range(zhang,zhang+1):
        
            new = path + fr'\{gongge:02}宫格组合图片'
            os.makedirs(new, exist_ok=True)
            
            newall=path+r'\02单页拼图'
            os.makedirs(newall,exist_ok=True)
            
            radius = 5
            f = 6 * ys  # 一页6张

            b = 400  # 画布大小
            by = 10  # 边距

            print('----------1\制作白色操作图------------')
            for g in range(gongge,gongge+1):
                for c in range(1, f + 1):
                    # 创建bxb的画布
                    canvas = Image.new('RGB', (b, b), (255, 255, 255))
                    draw = ImageDraw.Draw(canvas)

                    # 定义表格的行数和列数、边距
                    rows = g
                    cols = g
                    margin = by

                    # 计算单元格的宽度和高度
                    cell_width = (b - 2 * margin) // cols
                    cell_height = (b - 2 * margin) // rows

                    # 绘制表格的竖直线
                    for i in range(cols + 1):
                        x = margin + i * cell_width
                        draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                    # 绘制表格的水平线
                    for i in range(rows + 1):
                        y = margin + i * cell_height
                        draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形                    
                    for i in range(rows):
                        for j in range(cols):
                            left = margin + j * cell_width
                            upper = margin + i * cell_height
                            right = left + cell_width
                            lower = upper + cell_height
                                        
                            if s==0:  # 无圆点,纯黑线
                                pass
                            elif s==1: # 绘制黑色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill=('black'), width=5)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill=('black'), width=5)
                            else:   # # 绘制白色小圆点
                                draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                            fill='white', outline='black', width=1)
                                draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                            fill='white', outline='black', width=1)

                    # 保存画布
                    mb = f'{g:05d}格模板.png'
                    canvas.save(new + fr'\{mb}')


                    print('---2、制作彩色参考图,计算三个坐标点的黑色三角形不重复图案有几个-------')

                    # 创建一个空列表用于存储单元格的坐标
                    cell_coordinates = []

                    # 计算每个单元格的四个顶点坐标
                    for row in range(rows):
                        for col in range(cols):
                            top_left = (margin + col * cell_width, margin + row * cell_height)
                            top_right = (margin + (col + 1) * cell_width, margin + row * cell_height)
                            bottom_left = (margin + col * cell_width, margin + (row + 1) * cell_height)
                            bottom_right = (margin + (col + 1) * cell_width, margin + (row + 1) * cell_height)
                            
                            # 将四个顶点坐标添加到列表中
                            cell_coordinates.append([top_left, top_right, bottom_left, bottom_right])
                            # print(cell_coordinates)
                            # print(len(cell_coordinates))
                            # 16
                            # [[(0, 0), (400, 0), (0, 400), (400, 400)], [(400, 0), (b, 0), (400, 400), (b, 400)], [(0, 400), (400, 400), (0, b), (400, b)], [(400, 400), (b, 400), (400, b), (b, b)]]

                    import random
                    import os

                    combinations=[]
                    # 存储选取的点,随机生成坐标(样式)排除重复,生成10份样式不同的模版
                    while len(combinations) < f:
                        selected_points = []
                        for points in cell_coordinates:
                            selected_points.append(tuple(random.sample(points, 3)))
                        combinations.append(tuple(selected_points))

                    print(combinations)
                    print(len(combinations))
                    #  10

                    print('---3、制作三个坐标点的黑色三角形(4个)-------')
                    from PIL import Image, ImageDraw            
                    # 定义要绘制的坐标点组合
                    
                    for point_combination in combinations:
                        print(point_combination)
                        
                        # 清空selected_points列表
                        selected_points = []
                        h=1
                        # 遍历每个坐标点组合
                        for combination in point_combination:
                            # 从每个列表中随机选取三个点,并加入到selected_points中
                            selected_points.append(tuple(random.sample(combination, 3)))

                                # 读取图像文件
        #                创建bxb的画布
                        canvas = Image.new('RGB', (b,b), (255, 255, 255))
                        draw = ImageDraw.Draw(canvas)

                        # 定义表格的行数和列数、边距
                        rows = g
                        cols = g
                        margin = by

                        # 计算单元格的宽度和高度
                        cell_width = (b - 2 * margin) // cols
                        cell_height = (b - 2 * margin) // rows

                        # 绘制表格的竖直线
                        for i in range(cols + 1):
                            x = margin + i * cell_width
                            draw.line([(x, margin), (x, b - margin)], fill=(0, 0, 0), width=2)

                        # 绘制表格的水平线
                        for i in range(rows + 1):
                            y = margin + i * cell_height
                            draw.line([(margin, y), (b - margin, y)], fill=(0, 0, 0), width=2)

                        # # color=['black','black']
                        # color=['red','yellow','orange','blue','green','purple','pink']
                        color=colors
                        # 遍历每个坐标点组合
                        for combination in selected_points:
                            # 绘制填充为黑色的多边形
                        
                            # draw.polygon(combination, fill='black',outline=(255, 255, 255), width=1)
                            draw.polygon(combination, fill=random.choice(color), outline=(0, 0, 0), width=2)

                        for i in range(rows):
                            for j in range(cols):
                                left = margin + j * cell_width
                                upper = margin + i * cell_height
                                right = left + cell_width
                                lower = upper + cell_height

                        
                                if s==0:  # 无圆点,纯黑线
                                    pass
                                elif s==1: # 绘制黑色小圆点
                                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                                fill=('black'), width=5)
                                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                                fill=('black'), width=5)
                                else:   # # 绘制白色小圆点
                                    draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                                fill='white', outline='black', width=1)
                                    draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                                fill='white', outline='black', width=1)

                        # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                    
                        # 保存结果图像
                        canvas.save(new + fr'\{g:05d}格{c:05d}01图纸{c:05d}.png')
                        
                        canvas.close()  # 关闭图像文件
            
                                
            

            print('----4、贴图用黑色色块----------')
            for yy in colors:
                print(yy)
                canvas = Image.new('RGB', (b, b), (255, 255, 255))
                draw = ImageDraw.Draw(canvas)

                # 绘制表格的竖直线和水平线
                for i in range(cols + 1):
                    x = margin + i * cell_width
                    draw.line([(x, margin), (x, b - margin)], fill='black', width=2)
                    # draw.line([(x, margin), (x, b - margin)], fill=yy, width=2)

                for i in range(rows + 1):
                    y = margin + i * cell_height
                    draw.line([(margin, y), (b - margin, y)], fill='black', width=2)
                    # draw.line([(margin, y), (b - margin, y)], fill=yy, width=2)

                # # 在每个单元格中绘制两个三角形
                for row in range(rows):
                    for col in range(cols):
                        left = margin + col * cell_width
                        upper = margin + row * cell_height
                        right = left + cell_width
                        lower = upper + cell_height

                        # 随机选择三个顶点坐标
                        points = [(left, upper), (right, upper), (left, lower), (right, lower)]
                        # random.shuffle(points)
                        triangle1 = tuple(points[0:3])
                        triangle2 = tuple(points[1:4])
         
                        # 全部黑色填充用黑色边框,白色填充用白色边框
                        draw.polygon(triangle1, fill=yy,outline='black',width=2) # 彩色填充黑色边框(粗2)
                        # draw.polygon(triangle1, fill=yy,outline=yy,width=0)   # 彩色填充黑彩色边框(细1)
                        # draw.polygon(triangle2, fill='white',outline='black',width=2)

                # 设置边框线为黑色
                # draw.line([(margin, margin), (b - margin, margin), (b - margin, b - margin), (margin, b - margin), (margin, margin)], fill='white', width=2)

                for i in range(rows):
                    for j in range(cols):
                        left = margin + j * cell_width
                        upper = margin + i * cell_height
                        right = left + cell_width
                        lower = upper + cell_height
                
                        if s==0:  # 无圆点,纯黑线
                            pass
                        elif s==1: # 绘制黑色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill=('black'), width=5)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill=('black'), width=5)
                        else:   # # 绘制白色小圆点
                            draw.ellipse([(left - radius, upper - radius), (left + radius, upper + radius)], 
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, upper - radius), (right + radius, upper + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(left - radius, lower - radius), (left + radius, lower + radius)],
                                        fill='white', outline='black', width=1)
                            draw.ellipse([(right - radius, lower - radius), (right + radius, lower + radius)],
                                        fill='white', outline='black', width=1)

                # 保存结果图像
                canvas.save(new + fr'\{g:05d}格黑块{yy}.png')
                canvas.close()

            print('---4合并打印------')
            # 第3步,读取图片写入docx,合并PDF

            import os,time
            from docx import Document
            from reportlab.lib.pagesizes import letter
            from reportlab.pdfgen import canvas
            from PyPDF2 import PdfMerger
            from docx.shared import Cm

            print('---5参考图合并-----')
            # 读取123文件夹中的所有图片地址(参考图)
            image_folder = new
            new_folder = path+r'\零时文件夹'
            os.makedirs(new_folder, exist_ok=True)
            image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]

            new1=path+r'\保存1'
            os.makedirs(new1, exist_ok=True)

            # -8张
            grouped_files = [image_files[:f][i:i+6] for i in range(0, len(image_files[:f]), 6)]
            print(grouped_files)

            # 处理每一组图片
            for group_index, group in enumerate(grouped_files):
                # 创建新的Word文档
                doc = Document(path+r'\模板6格.docx')
                print(group)
                
                # 遍历每个单元格,并插入图片
                for cell_index, image_file in enumerate(group):
                    # 计算图片长宽(单位:厘米)                
                    
                    # 插入图片到单元格
                    table = doc.tables[0]
                    cell = table.cell(int(cell_index / 2), cell_index % 2)
                    # 6列两个都是6
                    cell_paragraph = cell.paragraphs[0]
                    cell_paragraph.clear()
                    run = cell_paragraph.add_run()
                    run.add_picture(image_file, width=Cm(9.4), height=Cm(9.4))
                    
                # 保存Word文档
                doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))               

            # 将10个docx转为PDF
            import os
            from docx2pdf import convert
            from PyPDF2 import PdfFileMerger

            pdf_output_path = new1+fr'\02彩色三角{g:02d}宫格参考图.pdf'
        
            # 将所有DOCX文件转换为PDF
            for docx_file in os.listdir(new_folder):
                if docx_file.endswith('.docx'):
                    docx_path = os.path.join(new_folder, docx_file)
                    convert(docx_path, docx_path.replace('.docx', '.pdf'))
                    time.sleep(3)

            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new_folder):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new_folder, pdf_file)
                    merger.append(pdf_path)
            time.sleep(2)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path)
            merger.close()

            import shutil
            # 删除输出文件夹
            import time
            shutil.rmtree(new_folder)
            # shutil.rmtree(new)
            time.sleep(2)

            print('---6答题卡合并(白图和黑三角卡片-----')
            # 读取123文件夹中的所有图片地址(参考图)
            image_folder = new
            new_folder = path+r'\零时文件夹1'      
            os.makedirs(new_folder, exist_ok=True)
        
            # 只要文件名
            image_name = [file for file in os.listdir(image_folder) if file.endswith('.png')]
            # 只要最后几个
            o = len(image_name)
            o1=o-f
            o2=-1
            flattened_names= [image_name[f:][i:i+o1] for i in range(0, len(image_name[f:]), o1)]
            print(flattened_names)

            # 去掉一层嵌套
            flattened_name = [item for sublist in flattened_names for item in sublist]
            print(flattened_name)

            t=[f'彩色三角({gongge}宫格)操作卡']
            t2=[f'彩色三角({gongge}宫格)贴图卡']*(o1-1)
            # 贴图卡后面添加颜色
            for t3 in range(len(t2)):
                t.append(t2[t3]+'('+flattened_name[t3+1][8:-4]+')')
            print(t)

            # 文件名+路径
            image_files = [os.path.join(image_folder, file) for file in os.listdir(image_folder) if file.endswith('.png')]
            
            flattened_lists= [image_files[f:][i:i+o1] for i in range(0, len(image_files[f:]), o1)]
            print(flattened_lists)
            # 多余的图
            flattened_list = [item for sublist in  flattened_lists for item in sublist]
            print(flattened_list)
        # # #  ['彩色三角(2宫格)操作卡', '彩色三角(2宫格)贴图卡(red)', '彩色三角(2宫格)贴图卡(yellow)', '彩色三角(2宫格)贴图卡(orange)', '彩色三角(2宫格)贴图卡(blue)', '彩色三角 
        # # # (2宫格)贴图卡(green)', '彩色三角(2宫格)贴图卡(purple)', '彩色三角(2宫格)贴图卡(pink)']

            for group_index in range(len(flattened_list)):
                print(group_index)        # 创建新的Word文档
                # 0
                doc = Document(path+r'\底图0格.docx')

                # 在单元格0,0写入“彩色三角(3宫格)操作卡”,24磅宋体
                # for tt in range(len(t)):             
                table = doc.tables[0]                # 两张表格
                cell = table.cell(0, 0)
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run(t[group_index])
                run.font.name = '宋体'
                run.font.size = Pt(40)                
                        
                # 插入图片
                # if cell_index == 0:
                cell = table.cell(1, 0)                          
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                image_file1 = flattened_list[group_index]
                # image_file1=str(flattened_lists[group_index])
                print(image_file1)
                run.add_picture(image_file1, width=Cm(19.6), height=Cm(19.6))
                
                # 保存Word文档
                doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))

            pdf_output_path = new1+fr'\01彩色三角{g:02d}宫格黑块底图.pdf'
            # pdf_output_path = path+fr'\彩色三角1-10宫格随机每款{f*ys}图共{ys}张一黑一白黑点白边彩色.pdf'

            # 将所有DOCX文件转换为PDF
            for docx_file in os.listdir(new_folder):
                if docx_file.endswith('.docx'):
                    docx_path = os.path.join(new_folder, docx_file)
                    convert(docx_path, docx_path.replace('.docx', '.pdf'))
                    time.sleep(3)

            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new_folder):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new_folder, pdf_file)
                    merger.append(pdf_path)
            time.sleep(3)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path)
            merger.close()

            # 删除输出文件夹            
            shutil.rmtree(new_folder)
            time.sleep(2)

            # print('---7合并答题卡和彩色三角卡片-----')
            t_folder = path+r'\pdf'
            os.makedirs(t_folder, exist_ok=True)
            
            pdf_output_path2 = t_folder + fr'\01彩色三角{g:02d}宫格{f}张合并.pdf'       
        
            # 合并零时文件里所有PDF文件
            merger = PdfFileMerger()
            for pdf_file in os.listdir(new1):
                if pdf_file.endswith('.pdf'):
                    pdf_path = os.path.join(new1, pdf_file)
                    merger.append(pdf_path)
                    time.sleep(2)

            # 保存合并后的PDF文件
            merger.write(pdf_output_path2)
            merger.close()

            # 删除输出文件夹            
            shutil.rmtree(new1)
 
    print('------3-10宫格全部打包-------')
    # pdf_output_path = path + fr'\01彩色三角全黑块({start}-{end})宫格{zhang*(end-start+1)}张参考图1套操作板.pdf' 
    if s==0:
        pdf_output_path = newall+fr'\02-01(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 无小圆点.pdf'
    elif s==1:
        pdf_output_path = newall+fr'\02-02(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 黑色小圆点.pdf'
    elif s==2:
        pdf_output_path = newall+fr'\02-03(单页1页)彩色三角 {start}-{end}宫格 每款{f*ys}图共{ys}张 黑色边框 白色小圆点.pdf'
    
    #   合并零时文件里所有PDF文件
    merger = PdfFileMerger()
    for pdf_file in os.listdir(t_folder):
        if pdf_file.endswith('.pdf'):
            pdf_path = os.path.join(t_folder, pdf_file)
            merger.append(pdf_path)
            time.sleep(2)

    # 保存合并后的PDF文件
    merger.write(pdf_output_path)
    merger.close()

    # 删除输出文件夹
    shutil.rmtree(t_folder)




黑点

白点

无点

彩色快一共7种颜色的色块

好了,测试完毕,生成正式的2-10宫格黑白、彩色的三款样式,每个宫格6张(36图),彩色有7种贴图卡

因为合并了,所以只出现一次安全提示

生成了2个小时,才完成黑白的三角的三款

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

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

相关文章

C++项目:高并发内存池_下

目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…

消息队列性能比拼: Kafka vs RabbitMQ

本内容是对知名性能评测博主 Anton Putra Kafka vs RabbitMQ Performance 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 简介 在本视频中&#xff0c;我们将首先比较 Apache Kafka 和传统的 RabbitMQ。然后&#xff0c;在第二轮测试中&#xff0c;会将 Kaf…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明&#xff1a;本文内容对应的是 OceanBase 社区版&#xff0c;架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见&#xff1a; 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时&#xff0c;这对数据库的配置等条件提出了较高…

Java 大视界 -- Java 大数据在智能金融区块链跨境支付与结算中的应用(154)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

手把手教你在linux服务器部署deepseek,打造专属自己的数据库知识库

第一步&#xff1a;安装Ollama 打开官方网址&#xff1a;https://ollama.com/download/linux 下载Ollama linux版本 复制命令到linux操作系统执行 [rootpostgresql ~]# curl -fsSL https://ollama.com/install.sh | sh在Service中增加下面两行 [rootlocalhost ~]# vi /etc/…

C++ 继承:面向对象编程的核心概念(一)

文章目录 引言1. 继承的基本知识1.1 继承的关键词的区别1.2 继承类模版 2. 基类和派生类间的转换3. 继承中的作用域4. 派生类的默认成员函数4.1 默认成员函数的规则4.2 自己实现成员函数4.3 实现一个不能被继承的基类&#xff08;基本不用&#xff09; 引言 在C中&#xff0c;…

蓝桥杯 临时抱佛脚 之 二分答案法与相关题目

二分答案法&#xff08;利用二分法查找区间的左右端点&#xff09; &#xff08;1&#xff09;估计 最终答案可能得范围 是什么 &#xff08;2&#xff09;分析 问题的答案 和 给定条件 之间的单调性&#xff0c;大部分时候只需要用到 自然智慧 &#xff08;3&#xff09;建…

【算法day22】两数相除——给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

29. 两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#x…

关于服务器只能访问localhost:8111地址,局域网不能访问的问题

一、问题来源&#xff1a; 服务器是使用的阿里云的服务器&#xff0c;服务器端的8111端口没有设置任何别的限制&#xff0c;但是在阿里云服务器端并没有设置相应的tcp连接8111端口。 二、解决办法&#xff1a; 1、使用阿里云初始化好的端口&#xff1b;2、配置新的阿里云端口…

基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差&#xff08;MMSE&#xff09;检测算法 4.4 迫零&#xff08;ZF&#xff09;检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …

Linux 配置时间服务器

一、同步阿里云服务器时间 服务端设置 1.检查chrony服务是否安装&#xff0c;设置chrony开机自启&#xff0c;查看chrony服务状态 [rootnode1-server ~]# rpm -q chrony # rpm -q 用于查看包是否安装 chrony-4.3-1.el9.x86_64 [rootnode1-server ~]# systemctl enable --n…

可视化web组态开发工具

BY组态是一款功能强大的基于Web的可视化组态编辑器&#xff0c;采用标准HTML5技术&#xff0c;基于B/S架构进行开发&#xff0c;支持WEB端呈现&#xff0c;支持在浏览器端完成便捷的人机交互&#xff0c;简单的拖拽即可完成可视化页面的设计。可快速构建和部署可扩展的SCADA、H…

C++笔记-模板初阶,string(上)

一.模板初阶 1.泛型编程 以往我们要交换不同类型的两个数据就要写不同类型的交换函数&#xff0c;这是使用函数重载虽然可以实现&#xff0c;但是有以下几个不好的地方&#xff1a; 1.重载的函数仅仅是类型不同&#xff0c;代码复用率比较低&#xff0c;只要有新类型出现时&a…

关于cmd中出现无法识别某某指令的问题

今天来解决以下这个比较常见的问题&#xff0c;安装各种软件都可能会发生&#xff0c;一般是安装时没勾选注册环境变量&#xff0c;导致cmd无法识别该指令。例如mysql&#xff0c;git等&#xff0c;一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…

绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好&#xff0c;今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下&#xff0c;即使没有公网IP&#xff0c;你也能随时随地远程访问自己…

d9-326

目录 一、添加逗号 二、爬楼梯 三、扑克牌顺子 添加逗号_牛客题霸_牛客网 (nowcoder.com) 一、添加逗号 没啥注意读题就是 注意逗号是从后往前加&#xff0c;第一位如果是3的倍数不需要加逗号&#xff0c;备注里面才是需要看的 count计数 是三的倍数就加逗号&#xff0c…

Win11+VS2022+CGAL5.6配置

1. CGAL库简介 CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个开源的计算几何算法库&#xff0c;主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法&#xff0c;覆盖点、线、多边形、曲面等基本几何对象的表示与操…

【Linux】MAC帧

目录 一、MAC帧 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC帧格式 &#xff08;三&#xff09;MTU对IP协议的影响、 &#xff08;四&#xff09;MTU对UDP协议的影响 &#xff08;五&#xff09;MTU对TCP协议的影响 二、以太网协议 &…

Codeforces Round 1013 (Div. 3)(A-F)

题目链接&#xff1a;Dashboard - Codeforces Round 1013 (Div. 3) - Codeforces A. Olympiad Date 思路 找到第一个位置能凑齐01032025的位置 代码 void solve(){int n;cin>>n;vi a(n10);int id0;map<int,int> mp;for(int i1;i<n;i){cin>>a[i];mp[a…

Vite 与 Nuxt 深度对比分析

一、核心定位差异 二、核心功能对比 渲染能力 Vite&#xff1a;默认仅支持客户端渲染&#xff08;CSR&#xff09;&#xff0c;需通过插件&#xff08;如vite-plugin-ssr&#xff09;实现 SSR/SSG&#xff0c;但配置灵活 Nuxt&#xff1a;原生支持 SSR&#xff08;服务端渲…