【教学类-89-08】20250624新年篇05——元宵节灯笼2CM黏贴边(倒置和正立数字 )
背景需求:
【教学类-89-06】20250220新年篇05——元宵节灯笼2CM黏贴边(3边形到50边形,一页1图、2图、4图,适合不同水平,适合不同阶段)-CSDN博客文章浏览阅读1.6k次,点赞35次,收藏27次。【教学类-89-06】20250220新年篇05——元宵节灯笼2CM黏贴边(3边形到50边形,一页1图、2图、4图,适合不同水平,适合不同阶段)https://blog.csdn.net/reasonsummer/article/details/145761966?spm=1011.2415.3001.5331
我发现这种图纸制作后,数字7会倒过来,
所以我需要在手柄条上的两端做两个数字,顶部的数字是倒置下划线,底部的数字是正立下划线
第一步:图纸上做两个数字
'''
202506新年05元宵节灯笼python制作图片
制作等比例的图纸,1图、2图、4图
(提示数字倒置下划线)
星火讯飞、阿夏
2025062
'''import math,os
from PIL import Image, ImageDraw, ImageFont# 1 width=Cm(20.2),height=Cm(26.45)
# 2 width=Cm(13.26),height=Cm(20.1))
# 4 width=Cm(10.1),height=Cm(13.23))
ww=['2100','2020','1326','1010']
hh=['2970','2645','2010','1323']
nn=[0,1,2,4]
ntb=200
sum=50# 创建一个新的列表来存储结果
result_list_w = [1]# 遍历列表并计算相邻数对的商
for i in range(len(ww) - 1):num1 = int(ww[0])num2 = int(ww[i + 1])quotient = num1 / num2result_list_w.append(round(quotient, 2))print(result_list_w)result_list_h=[1]
# 遍历列表并计算相邻数对的商
for i in range(len(hh) - 1):num1 = int(hh[0])num2 = int(hh[i + 1])quotient = num1 / num2result_list_h.append(round(quotient, 2))
print(result_list_h)for aa in range(len(ww)):# 宽w =int(ww[aa])# 高h = int(hh[aa])# 骨架贴边(2厘米)t = ntb# 上下贴边b = int(150/result_list_h[aa])# 外边高度(需要乘以2)g = int(710/(result_list_h[aa]))# 内柱高度n = int(910/(result_list_h[aa]))# 虚线dash_length = 20space_length = 20path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250624元宵灯笼'pic=path+fr'\02多边形灯笼\{nn[aa]:02}灯笼多边形图片'os.makedirs(pic,exist_ok=True)for d in range(3,sum+1):# X边形(可修改遍历)# d = 3# 创建一个2100x2900的白色背景图片img = Image.new('RGB', (w,h), 'white')draw = ImageDraw.Draw(img)# 画外框图纸border_width = 5# 制作外边# 画一个从(0,0)到(15,210)的长方形灰色底纹填充# (右侧黏贴变宽度200)rectangle_color = (128, 128, 128) # 灰色# 两个灰色draw.rectangle([(0, 0), (w-t, b)], fill=rectangle_color)draw.rectangle([(0, b + g * 2), (w - t, b * 2 + g * 2)], fill=rectangle_color)# 外边框线draw.rectangle([(0, 0), (w - t, b * 2 + g * 2)], outline='black', width=border_width)# 在(0, b*1+g*1)), (w-200, b*1+g*1))的地方画一条黑色2磅间隔2磅的虚线start_y = b + gend_y = start_y + gfor x in range(0, w - t, dash_length + space_length):draw.line([(x, start_y), (x + dash_length, start_y)], fill='black', width=border_width)# 画圆形radius = 80border_width = 10draw.ellipse([(w-t/2 - radius, start_y - radius), (w-t/2 + radius, start_y + radius)], fill="white", outline="black", width=border_width)# 插分等dd = []for x in range(d):f = (w - t) / d * (x)print(f)dd.append(f)print(dd)# 画从0,dd到100,dd的直线(多条)border_width2 = 10for x in dd:draw.line([(x, b), (x, b + g * 2)], fill='black', width=border_width2)# 画内柱图纸# 外边框线draw.rectangle([(w-t,g*2+b*2), (w, h)], fill=rectangle_color, width=border_width2)# 画白色draw.rectangle([(0, b * 2 + g * 2), (w-t, h)], fill='white')# border_width = 5# 制作外边# 画一个从(0,0)到(15,210)的长方形灰色底纹填充# (右侧黏贴变宽度200)rectangle_color = (150, 150, 150) # 灰色# 两个灰色draw.rectangle([(0, b + g * 2), (w - t, b * 3 + g * 2)], fill=rectangle_color)draw.rectangle([(0, h - b), (w - t, h)], fill=rectangle_color)# 外边框线draw.rectangle([(0, b * 2 + g * 2), (w , h)], outline='black', width=border_width2)draw.rectangle([(0, 0), (w-t, b * 2 + g * 2)], outline='black', width=border_width2)# 如果大于10变形,棱柱近似圆形,没有必要这些棱柱的虚线,就不要画虚线了if d>10:passelse:# 插分等dd1 = []for x in range(d):f = (w - t) / d * (x+1)print(f)dd1.append(f)print(dd1)# 画从0,dd到100,dd的直线(多条)border_width2=10# # 画从0,dd到100,dd的直线(多条)# 设置虚线的参数dash_length = 30 # 黑线长度space_length = 30 # 空白间隔长度for x1 in dd1:start_x = x1 # 起始x坐标end_x = start_x # 结束x坐标与起始x坐标相同,因为是竖线start_y = b*2+g*2 # 起始y坐标end_y = h # 结束y坐标# 画从上到下的虚线for y in range(start_y, end_y, dash_length + space_length):draw.line([(start_x, y), (start_x, y + dash_length)], fill='black', width=border_width2)# 写入数字1(旋转180度并带下划线)- 顶部倒置数字font_size = 150font = ImageFont.truetype("arial.ttf", font_size) # 创建第一个数字(倒置)text = f'{d}'text_width, text_height = font.getsize(text)underline_thickness = 10underline_spacing = 20# 创建临时图像temp_img = Image.new('RGBA', (text_width + 20, text_height + underline_thickness + underline_spacing + 10), (0, 0, 0, 0))temp_draw = ImageDraw.Draw(temp_img)# 绘制文本和下划线temp_draw.text((10, 0), text, font=font, fill="black")underline_y = text_height + underline_spacingtemp_draw.line([(10, underline_y), (10 + text_width, underline_y)], fill="black", width=underline_thickness)# 旋转180度temp_img = temp_img.rotate(180, expand=True)# 放置位置(顶部)if len(str(d)) == 1:paste_x = w - t + 60 # 单数字位置else:paste_x = w - t + 18 # 双数字位置paste_y = 10 # 顶部位置# 粘贴到主图像img.paste(temp_img, (paste_x, paste_y), temp_img)# 写入数字2(正置带下划线)- 交接线上方数字# 计算交接线上方的位置text_position_y = g * 2 + text_height - (aa+1)*50# 交接线(g*2)上方减去字符高度和间距# - text_height + 20 # 创建第二个数字(正置)temp_img2 = Image.new('RGBA', (text_width + 20, text_height + underline_thickness + underline_spacing + 10), (0, 0, 0, 0))temp_draw2 = ImageDraw.Draw(temp_img2)# 绘制文本和下划线temp_draw2.text((10, 0), text, font=font, fill="black")underline_y2 = text_height + underline_spacingtemp_draw2.line([(10, underline_y2), (10 + text_width, underline_y2)], fill="black", width=underline_thickness)# 放置位置(交接线上方)if len(str(d)) == 1:paste_x2 = w - t + 60 # 单数字位置else:paste_x2 = w - t + 18 # 双数字位置paste_y2 = text_position_y # 计算好的位置# 粘贴到主图像img.paste(temp_img2, (paste_x2, paste_y2), temp_img2)# 保存图片img.save(pic + fr'\{d:02}边形灯笼图纸(A4).png')
现在的手柄上都是两个数字,两边看都能数字正立。
合并成PDF
'''
元宵灯笼X变形3-50边型 两个数字
(插入WORD,分别插入1图2图4图)2CM黏贴边
星火讯飞、阿夏
2025年6月24日
'''
from docx import Document
from docx.shared import Cm
import os,time
from PIL import Image
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
from PyPDF2 import PdfFileMerger
import pikepdfpath = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250624元宵灯笼'
image_folders = os.path.join(path, '02多边形灯笼')# 获取 image_folders 目录下所有文件夹的完整路径
folder_paths = [os.path.join(image_folders, f) for f in os.listdir(image_folders) if os.path.isdir(os.path.join(image_folders, f))]
folder_paths = folder_paths[1:]
print(folder_paths)l = [1, 2, 4]
bg = [['00'], ['00', '01'], ['00', '01', '10', '11']]
size = [['20.2', '26.45'], ['13.26', '20.1'], ['10.1', '13.23']]# Convert size strings to floats
size = [[float(num) for num in sublist] for sublist in size]for t in range(len(l)):cs = l[t]temp_folder = os.path.join(path, '临时')os.makedirs(temp_folder, exist_ok=True)image = [os.path.join(folder_paths[t], f) for f in os.listdir(folder_paths[t]) if f.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif'))]print(image)image_files = []for i in image:for z in range(cs):image_files.append(i)grouped_images = [image_files[i:i + cs] for i in range(0, len(image_files), cs)]print(grouped_images)for i in range(len(grouped_images)):doc = Document(os.path.join(path, f'{cs}图.docx'))table = doc.tables[0]for j in range(len(bg[t])):pp = int(bg[t][j][0])qq = int(bg[t][j][1])picture = grouped_images[i][j]print(pp, qq, picture)cell = table.cell(pp, qq)run = cell.paragraphs[0].add_run()run.add_picture(f'{picture}', width=Cm(size[t][0]), height=Cm(size[t][1]))cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTERdoc_path = os.path.join(temp_folder, f"{i+1:02}.docx")doc.save(doc_path)time.sleep(1)import osfrom docx import Documentfrom reportlab.pdfgen import canvasfrom PyPDF2 import PdfFileMergerfrom docx2pdf import convert# 获取所有docx文件docx_files = [f for f in os.listdir(temp_folder) if f.endswith('.docx')]# 获取所有docx文件# 将每个docx文件转换为PDFfor docx_file in docx_files:doc_path = os.path.join(temp_folder, docx_file)pdf_path = os.path.join(temp_folder, docx_file.replace('.docx', '.pdf'))convert(doc_path, pdf_path)time.sleep(5)# 合并所有的PDF文件# 获取所有生成的PDF文件pdf_files = [f for f in os.listdir(temp_folder) if f.endswith('.pdf')]# 创建PdfFileMerger对象merger = PdfFileMerger()# 将所有PDF文件添加到合并器中for pdf_file in pdf_files:pdf_path = os.path.join(temp_folder, pdf_file)merger.append(pdf_path)# 输出合并后的PDF文件output_pdf_path = os.path.join(path, f'两个数字元宵灯笼2CM贴边一页{cs}张3-{len(image)+2}边形共{len(image)}种.pdf')merger.write(output_pdf_path)time.sleep(20)merger.close()print(f"所有PDF文件已合并到 {output_pdf_path}")import shutilshutil.rmtree(temp_folder)