前言,原先是通过excel复制信息到自己制作的indd模板,来制作对应的二维码库位标签。效率是每小时能处理约60个标签;因为ID设计二维码生成的数据需要手工改写录入,效率极低。制作任务有800多个.
基于ID设计的模版
二维码是手工填入物料编码使用ID自带功能生成。准确率99%
基于Python自动生成的内容
执行效率是1分钟完成800个标签制作,二维码准确率100%,代码是分段撰写的。因为chatgpt给的回复并不能一次性解决问题。所以后续花了1个小时去调整细节参数、最终耗费的时间是3个小时完整下述代码的撰写。
根据情况先梳理下需求,通过excel获取目标数据。然后根据规则生成批量的数据;
↓先上代码
from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm from reportlab.pdfgen import canvas from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.fonts import addMapping import textwrap import qrcode import os import openpyxl import re # 输入文件路径 excel_file = R'F:/Python/cfqy20230509.xlsx' # 打开Excel工作簿 wb = openpyxl.load_workbook(excel_file) ws = wb['Sheet1'] # 读取Excel数据 data = [] for row in ws.iter_rows(values_only=True): data.append({'物料编码': row[0], '物料名称': row[1], '存放区域': row[2]}) # 注册中文字体 pdfmetrics.registerFont(TTFont('HarmonyOS Sans SC Black', 'HarmonyOS_Sans_SC_Black.ttf')) pdfmetrics.registerFont(TTFont('HarmonyOS Sans SC Medium', 'HarmonyOS_Sans_SC_Medium.ttf')) # 将中文字体映射到默认字体 addMapping('HarmonyOS Sans SC Black', 0, 0, 'HarmonyOS Sans SC Black') # 定义标签尺寸 label_width = (A4[0] - 16 * mm) / 2 # 每张A4纸张包含两列标签 label_height = 46 * mm # 标签高度为40毫米 label_padding = 2 * mm # 标签周围留出5毫米的空白 # 创建PDF画布 c = canvas.Canvas("F:\\Python\\labels.pdf", pagesize=A4) # 循环生成标签 for idx, item in enumerate(data): if idx % 12 == 0: # 每12个标签换一页 c.showPage() # 将画布向上移动30mm c.translate(-4*mm, 42 * mm) col = 0 # 重置列索引 row = 0 # 重置行索引 # 计算标签位置 x = 10 * mm + col * (label_width + label_padding) y = A4[1] - ((row + 1) * (label_height + label_padding)) # 绘制标签背景色为黄色的矩形 c.setFillColorRGB(1, 1, 1) # 设置填充颜色为黄色 c.rect(x, y - label_height, label_width, label_height, fill=True) # 添加文本到标签 c.setFillColorRGB(0, 0, 0) c.setFont("HarmonyOS Sans SC Medium", 14) c.setFillColorRGB(1, 0, 0) # 设置数字部分的颜色为红色 c.drawString(x + 5 * mm, y - 20 * mm, f"物料编码:") c.setFont("HarmonyOS Sans SC Black", 30) # 设置数字部分字体大小为28号加粗 c.drawString(x + 5 * mm, y - 31 * mm, f"{item['物料编码']}") c.setFillColorRGB(0, 0, 0) # 设置数字部分的颜色为黑色 c.setFont("HarmonyOS Sans SC Medium", 16) # 设置数字部分字体大小为16号加粗 c.drawString(x + 5 * mm, y - 39 * mm, f"存放区域: {item['存放区域']}") c.setFont("HarmonyOS Sans SC Medium", 10) c.drawString(x + 54 * mm, y - 43 * mm, f"更新日期:2023-05-09") # 添加文本到标签物料名称标题 c.setFillColorRGB(0, 0, 0) c.setFont("HarmonyOS Sans SC Medium", 14) textobject = c.beginText() textobject.setTextOrigin(x + 5 * mm, y - 7 * mm) # 手动分割字符串,如果超过28个字符截断,并逐行添加到文本对象中 lines = [] line = '' for word in f"{item['物料名称']}": if len(line) + len(word) < 28: line += word else: lines.append(line) line = word if line: lines.append(line) for line in lines: textobject.textLine(line) if len(lines) > 2: # 如果有超过2行,优先填充首行 textobject.setTextOrigin(x + 5 * mm, y - 15 * mm) # 调整第二行文本的起点 c.drawText(textobject) # 生成二维码 qr = qrcode.QRCode(version=1, box_size=4, border=0) qr.add_data(str(item['物料编码'])) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img.save(f"F:\\Python\\tmp\\{item['物料编码']}.png") # 在标签上绘制二维码图像 c.drawImage(f"F:\\Python\\tmp\\{item['物料编码']}.png", x + 65 * mm, y - 38 * mm, width=26 * mm, height=26 * mm) # 绘制标签边框 c.rect(x, y - label_height, label_width, label_height) # 增加列和行索引 col += 1 if col == 2: col = 0 row += 1 # 保存PDF文件 c.save()
使用心得
1、物料名称超过28个字的自己截断,并优先填充首行。
2、生成的pdf首张是空白的,这个暂时没有解决掉。
3、这里的生成和取数目录是
F:\\Python\\
二维码临时放置的目录是
F:\\Python\\tmp\\
4、excel目前取数就3列。如下图
5、对于此类需求,通过分断执行撰写代码需求效率更高。