当前位置: 首页 > news >正文

【教学类-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)

一页 一图

一页2图

一页4图

相关文章:

  • 如何做网站电话网站前期推广
  • shopex网站 css乱了谷歌关键词搜索
  • 做企业展示版网站贵吗企业网站推广策略
  • 可画设计软件下载seo关键词优化怎么做
  • 王建设医生个人网站seo深圳培训班
  • wordpress老版seo诊断a5
  • 内存泄漏和内存溢出的区别
  • 五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO
  • 使用 PyFluent 自动化 CFD
  • FPGA基础 -- Verilog 验证平台之 **cocotb 验证 `阶乘计算模块(factorial)` 的例子**
  • CRMEB PHP多门店版v3.2.1系统全开源+Uniapp前端+搭建教程
  • 用vscode破解最新typora1.10.8
  • 前端vue2每三十秒被动接受后端服务器发送过来得数据
  • 服务器数据恢复——异常断电导致服务器故障的数据恢复案例
  • 编程语言的发展逻辑:从人类认知到人工智能协同
  • C预处理详解2
  • WHAT - React Native 的 Expo Router
  • Redis哈希表Rehash全解析:扩容缩容背后的渐进式智慧
  • ref() 与 reactive()
  • 黑马Day01-03集开始
  • 原子操作(CAS)
  • 《TCP/IP 详解 卷1:协议》第13章:TCP连接管理
  • java-SpringBoot框架开发计算器网页端编程练习项目【web版】
  • 马克思主义基本原理知识笔记
  • MediaMarktSaturn EDI 对接指南:欧洲零售卖场的数字化协同范例
  • 虚幻基础:插槽