【教学类-58-10】黑白三角拼图08(参考图+操作卡+黑白块,适合个别化)

news2024/11/17 10:32:59

 

 

背景需求:

前期做了一套适合集体操作的绘画“黑白三角”

【教学类-58-09】黑白三角拼图07(1页3张黑白的白点卡片,一种宫格36张,适合一个班级一次操作)-CSDN博客文章浏览阅读1k次,点赞30次,收藏7次。【教学类-58-09】黑白三角拼图07(1页3张黑白的白点卡片,一种宫格36张,适合一个班级一次操作)https://blog.csdn.net/reasonsummer/article/details/1393813829319e6882a094b44a5e29f396a6e937c.png

在小红书上的销售量最大

c904856932e24572bb1bd25e0f80d447.png

虽然有三款选择(黑白黏连、黑白有点、彩色有点),但是客户普遍选择基础款的“黑白黏连””

eec83ea13af64623b50772d0bd1cb687.png

 

 

昨天有一位客户求购后,提出新的需求:

 

297144d55e254b378ea6e5d1ab2334c0.png

客户觉得“左参考图右操作版”的样式打印太浪费纸

f4c97c84bc4f4a449a5e7d607e84828e.png客户以前购买我设计的三角图层

【教学类-55-03】20240512图层顺序挑战(三角形版)(6块三角形,49种叠放顺序)-CSDN博客文章浏览阅读1.1k次,点赞32次,收藏16次。【教学类-55-03】20240512图层顺序挑战(三角形版)(6块三角形,49种叠放顺序)https://blog.csdn.net/reasonsummer/article/details/138732291

5a7d740ed6f247d49cdf4512cac9ba42.png

41e5471cd0314c73ae3e0b67e669867f.png

客户希望能将“黑白三角参考图”单独做一份,空白格子底板和黑白三角块单独做一份,就是个别化学具(1-2人操作)

 

于是我微调了代码,并调试了word模板

510a8eabc99a4440b0780dcb9914e391.png

操作底板

48536e068c18482981976b24292c580a.png

80aa4101de804fa5a370324ae92b1535.png

参考图模版

57e3ce2130f24368a97db0d450f6320c.png

代码展示

'''

黑白三角图,2宫格36张,3宫格36张……适合个别化

随机图片
AI对话大师,阿夏
2024年8月16日

'''
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  

# 几张(每张6图)
zhagnshu=6
# 起始宫格数
start=3
# 最大宫格数
end=10

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角单人款'


for gongge in range(start,end+1): # 遍历3宫格到10宫格
    for ys in range(zhagnshu,zhagnshu+1):
      
        new = path + fr'\{gongge:02}宫格组合图片'
        os.makedirs(new, 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

                # 保存画布
                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']
                    # 遍历每个坐标点组合
                    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)

        

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                    # 保存结果图像
                    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='white',width=2)
                draw.polygon(triangle2, fill='black',outline='white',width=2)
                # 全部黑色填充用黑色边框,白色填充用白色边框
                # 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='white', width=2)

        # 保存结果图像
        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(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()

        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'\底图2格.docx')
            print(group)

            t=[f'黑白三角({gongge}宫格)操作卡',f'黑白三角({gongge}宫格)贴图卡']
            # 在单元格0,0写入“黑白三角(3宫格)操作卡”,24磅宋体
            for tt in range(len(t)):
                table = doc.tables[0]
                cell = table.cell(0, tt)
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run(t[tt])
                run.font.name = '宋体'
                run.font.size = Pt(24)
            
                    
            # 遍历每个单元格,并插入图片
            for cell_index, image_file in enumerate(group):
                # 计算图片长宽(单位:厘米)
                
                # 插入图片到单元格
                table = doc.tables[0]
                if cell_index == 0:
                    cell = table.cell(1, 0)
                elif cell_index == 1:
                    cell = table.cell(1, 1)
                else:
                    continue
                
                cell_paragraph = cell.paragraphs[0]
                cell_paragraph.clear()
                run = cell_paragraph.add_run()
                run.add_picture(image_file, width=Cm(14.2), height=Cm(14.2))
            
        # 保存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_path = t_folder + fr'\01黑白三角{g:02d}宫格{f}张参考图1套操作板.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_path)
        merger.close()

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

print('------3-10宫格全部打包-------')
# pdf_output_path = path + fr'\01黑白三角全黑块({start}-{end})宫格{zhagnshu*(end-start+1)}张参考图1套操作板.pdf'       
pdf_output_path = path + fr'\01黑白三角黑白块({start}-{end})宫格{zhagnshu*(end-start+1)}张参考图1套操作板.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)




代码很长很长,有机会再优化一下。

caf9144db1504ec381e159e1aeebc69a.png

 

 

生成过程中会出现大量的零时文件夹,保存各种图、PDF。

415cf51addc646f082401f86fc27ceb6.png

1a67ad9d13af426a927db18895790e24.png

73567393f80941a296c39921d95cf3cf.png

0ef5c3446f7f4269b07d4f909818189e.png

5867dd32aed1420fbae67959566ee337.png

fafbd6adc7484e4dab44708bb88d5b13.png

f7c3d4667647405b8a482fde2c9fe12c.png

最终多个文件夹都会被删除,只保留最终的一个打包PDF。

35d397f00ccf40378712de33797de0e1.png

7460b253375147e28e4a79eb3f2fcefc.png

dc2a99171e484d9b94ee06e0d7db03af.png

223b05732aa84abaa1dfe62c08e2145d.png

由于底板图只有14CM款,所以只适合3宫格、4宫格,超过5宫格,格子就太多了,剪的黑白三角块也会很多

 

如果修改注释,还可以获得另一个版本的“黑白块”

6776ad9ff88240c98e97d9605bd60445.png

b70f10a1d2924563a60fe3bf542a7b8e.png

3d378a3b8aa6465daa82b02610a2c7cf.png9c6108b7dae844fdb5ec01528547d852.png

9db59eb842a742ab824c11ef6ea653db.png

b432bc3eb9cf404da2fcf40fb0af049c.png

 

最终客户选了第二种“黑白块“的样式

459c0dd7495349ad899e3868af573fbb.png

19d79d54dc0b46c1adbca702b0667372.png

057b8e4089dc4b09959905ded6a751ee.png

客户提到操作卡太小了,剪贴雌雄扣很费劲,所以我又调整了一版,把操作卡从一页2张,变成1页一张。

d423ce81375c43d181b5049492f74a66.png

e62dca55dcf9436c9f41f8b4a0d0bea9.png

02035a8972d84258b9ecd69c6d3fa6a6.png

代码展示:

 

'''

黑白三角图,2宫格36张,3宫格36张……适合个别化 大操作卡

随机图片
AI对话大师,阿夏
2024年8月16日

'''
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  

# 几张(每张6图)
zhagnshu=6
# 起始宫格数
start=2
# 最大宫格数
end=10

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\黑白三角单人款'



for gongge in range(start,end+1): # 遍历3宫格到10宫格
    for ys in range(zhagnshu,zhagnshu+1):
      
        new = path + fr'\{gongge:02}宫格组合图片'
        os.makedirs(new, 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

                # 保存画布
                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']
                    # 遍历每个坐标点组合
                    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)

        

                    # 绘制每个单元格的左上角、右上角、左下角、右下角的黑色圆形
                
                    # 保存结果图像
                    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='white',width=2)
                # draw.polygon(triangle2, fill='black',outline='white',width=2)
                # 全部黑色填充用黑色边框,白色填充用白色边框
                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='white', width=2)

        # 保存结果图像
        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(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()

        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})宫格{zhagnshu*(end-start+1)}张参考图1套操作板.pdf'       
pdf_output_path = path + fr'\01黑白三角_黑白块_操作大图({start}-{end})宫格{zhagnshu*(end-start+1)}张参考图1套操作板.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)




a414d4e5fb214d2696d70a60a84f7351.png26616c384f0345c8829775214b3b9da6.png

从2宫格开始,一张A4的操作卡和一张A4贴图卡。

a783acfd77ec4e3a8d1d8e285a06a8d3.png

fd2381e86dfc43beb7c24fb8b6b26aa4.png

2750dfaf605c4a4a905943f287aab80b.png

91b59979ed324085b8d91dcf458887af.png

 

到10宫格时,每个黑白三角方块只有1.96CM宽,特别小,需要100个雌雄扣。感觉有点复杂。

bb22efa043144395827c84071d38fa33.png

f4e2bd4e9a7245b9aeb16e22bf9d9e21.png

大班3-7宫格差不多了。

 

 

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

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

相关文章

面向自动驾驶保证车辆转向稳定性的模型预测控制

摘 要 车辆智能化是当前和未来汽车发展的主要方向和核心技术之一。随着车辆智能化水 平的提高&#xff0c;自动驾驶等级从无自动驾驶向完全自动驾驶提升。在自动驾驶的人机协同控制 和完全自动驾驶阶段&#xff0c;由于人类驾驶员在动态驾驶任务中的参与程度不同&#xff0c;…

23. 机盒通信

1. 概述 耳机和充电盒,采用机盒通信的方式,完成通信和充电。受限于耳机上的触电,机盒通信采用单线模式。 注:耳机只做应答,不主动发起通信 2. 硬件连接 由于bes2700外置SY5501的电源管理芯片,实际上串口通信,通过SY5501进行转发。 充电盒 -> SY5501 -> bes27…

windows安装boost后没有b2.exe(无法执行b2)

原因&#xff1a;如果你是在官网下载的.exe文件进行的boost安装&#xff0c;那么就不需要再执行bootstrap.bat&#xff0c;也因此不会有b2.exe 链接&#xff1a;官方网址下载 通过.exe安装boost并配置环境变量之后就可以直接使用了 如果你仍希望有b2.exe&#xff0c;那么双击执…

2024“钉耙编程”中国大学生算法设计超级联赛(9)hdu7529 树异或价值(树形dp+贪心)

题目 t(t<20)组h里&#xff0c;每次给定一棵n(n<2e5)个点的&#xff0c;点1为根的有根树&#xff0c; 定义树的价值为&#xff0c; 其中&#xff0c;&#xff0c;dep为深度&#xff0c;1号点的深度为0 而a数组待确定&#xff0c;对于所有的种方案&#xff0c;你要使树…

Leetcode每日刷题之118.杨辉三角

1.题目解析 杨辉三角作为一个经典的数学模型&#xff0c;其基本原理相信大家已经耳熟能详&#xff0c;这里主要是在学习了vector之后&#xff0c;对于本题有了新的解法&#xff0c;更加简便。关于vector的基本使用详见 面向对象程序设计(C)之 vector&#xff08;初阶&#xff0…

Selenium + Python 自动化测试17(数据驱动-文本操作)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 之前有一篇我们讨论了使用模块化测试来优化我们的测试脚本&#xff0c;今天我们试着进一步深入学习数据驱动。 本篇文章我们讨论一下数据驱动思想&#xff0c;如何将数据和脚本…

Zookeeper的在Ubuntu20.04上的集群部署

安装资源 官方安装包下载地址&#xff1a;https://zookeeper.apache.org/releases.html 懒得找版本的可以移步下载zookeeper3.84稳定版本&#xff1a; https://download.csdn.net/download/qq_43439214/89646735 安装方法 创建安装路径&&解压安装包 # 创建路径 m…

机器学习之ROC曲线

机器学习之ROC曲线 1.TPR与FPR计算2.TPR、FPR与分类阈值的关系3.生成ROC曲线4.AUC计算参考文献本博客主要参考了https://www.evidentlyai.com/classification-metrics/explain-roc-curve。 1.TPR与FPR计算 真阳率TPR(True Positive rate),又称召回率recall rate。 假阳率F…

AtCoder Beginner Contest 367(ABCDEF题)视频讲解

A - Shout Everyday Problem Statement In the Kingdom of AtCoder, residents are required to shout their love for takoyaki at A A A o’clock every day. Takahashi, who lives in the Kingdom of AtCoder, goes to bed at B B B o’clock and wakes up at C C C o’…

flink车联网项目前篇:项目设计(第64天)

系列文章目录 车联网项目设计 5.1 数仓分层 5.2 数仓主题数据建模数据仓库建模方法论 2.1 关系建模 2.1.1 ER模型 2.1.2 关系模式范式 文章目录 系列文章目录前言5. 车联网项目设计5.1 数仓分层5.2 数仓主题 1. 数据建模2. 数据仓库建模方法论2.1 关系建模2.1.1 ER模型2.1.2 关…

[Meachines] [Medium] TartarSauce Wordpress-gwolle-gb-RFI+tar权限提升+定时器备份文件权限提升

信息收集 IP AddressOpening Ports10.10.10.88TCP:80 $ nmap -p- 10.10.10.88 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open tcpwrappedWordpress & gwolle-gb & RFI $ feroxbuster --url http://10.10.10.88/ $ wpscan --url http://10.…

汽车IVI中控OS Linux driver开发实操(二十五):GPIO设备驱动的上手编写

概述: 1、验证GPIO是否有效。 2、如果有效,则可以从内核GPIO子系统请求GPIO。 3、将GPIO导出到sysfs(这是可选的)。 4、设置GPIO的方向 5、如果将GPIO设置为输出引脚,则将其设置为高/低。 6、设置去抖动间隔,如果将其设置为输入引脚,则读取状态。您还可以为边缘/级别触…

图像直方图计算

1. 图像直方图&#xff08;Image histogram&#xff09; 图像直方图&#xff0c;又叫影像直方图&#xff0c;是一种用来表现数位影像中像素分布的直方图&#xff0c;根据统计影像中不同亮度的像素总数&#xff0c;我们可以画出一张代表这张影像的影像直方图&#xff0c;透过这…

排序算法【快速排序】

一、快速排序算法原理 直接采用实际的例子解释原理&#xff0c;实际的数组如下图所示。 排序算法流程如下所示 然后按照上面顺序递归下去&#xff0c;直到排序完成推出。 二、算法代码 #include <stdio.h> #include "test.h"/* 快速排序算法 */ void quick_s…

Camera基础知识系列(1)——凸\凹透镜

目录 前言 一. 凸\凹透镜 1 凸透镜 1.1 凸透镜成像 1.2 物距\像距 1.3 凸透镜成像规律 2. 凹透镜 2.1 凹透镜成像规律 二. 相机 相机镜头 前言 平日里总是时不时地听到别人讲起一些摄影相关的术语&#xff0c;比如&#xff1a;光圈、焦距、等效焦距、EV、画幅、景深、快门…

使用Qdrant+FastText实现向量存储和检索

1 概述 在《使用FastText库训练词向量》一文中&#xff0c;已经训练并保存好了一个用 FastText 训练的词向量模型-model_0809_001。在接下来的实践中&#xff0c;将直接使用该词向量模型来生成对应数据的向量&#xff0c;然后将向量和对应的负载存储到 Qdrant 中&#xff0c;然…

基于Conda的Python版本管理与Python包管理

文章目录 前言Conda是什么Conda与Anaconda安装Anaconda安装包windows v2024.06-1安装包更多版本安装包(Windows/Mac/Linux) 安装 使用步骤创建Python环境激活Python环境安装Python包列出和切换 Python 版本管理多个环境 总结 前言 开发环境中&#xff0c;需要使用不同的Python…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理&#xff1a;&#xff08;思科四个都是广播包&#xff09; 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

如何给Airtest脚本/报告增加log记录

1. 前言 尽管Airtest脚本运行过程中会输出非常丰富的log信息&#xff0c;并且Airtest报告也会把我们脚本的的运行步骤显示出来&#xff0c;但有时候&#xff0c;我们会需要在脚本里面&#xff0c;插入一些自定义的log内容&#xff08;比如某些关键点&#xff09;&#xff0c;并…

UR5e机器人Gazebo仿真模拟

Gazebo仿真环境 Gazebo是一款开源的机器人仿真平台&#xff0c;基于物理引擎&#xff0c;能够模拟机器人在真实世界中的运动和交互。它支持多种机器人模型与传感器&#xff0c;以及丰富的环境场景&#xff0c;为机器人研发提供了便捷的测试平台。 UR5e机器人Gazebo仿真模拟步骤…