如何利用条码打印机打印定位文本并将数字转换为条码格式?
条码打印机精准打印文本与条码解决方案
针对你遇到的内容无法定位、条码格式转换问题,结合4英寸×4英寸的标签尺寸,提供以下可行方案:
核心解决思路
- 放弃纯文本打印方式:直接打印TXT文件无法控制元素位置,改用Windows GDI绘图API(
win32print+win32ui)实现精准绘制。 - 条码生成:使用
python-barcode库生成条码图片,再将图片绘制到打印画布;也可使用条码字体(如Code 128)直接打印文本,但图片方式兼容性更强。
前置依赖安装
先安装所需库:
pip install pywin32 python-barcode pillow
完整实现代码
import win32print import win32ui import win32api import win32con from barcode import Code128 from barcode.writer import ImageWriter from PIL import Image, ImageWin import os # 标签尺寸:4英寸×4英寸,按96DPI转换为像素(可根据打印机实际DPI调整) TAG_WIDTH = int(4 * 96) TAG_HEIGHT = int(4 * 96) def print_label(barkod, film_turu, film_eni, firma_adi, kilo, tarih): # 1. 生成条码图片 barcode_img_path = "temp_barcode.png" code128 = Code128(barkod, writer=ImageWriter()) code128.save(barcode_img_path) # 2. 获取打印机设备上下文 printer_name = win32print.GetDefaultPrinter() hDC = win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) # 初始化打印任务 hDC.StartDoc("Film Depo Etiketi") hDC.StartPage() hDC.SetMapMode(win32con.MM_TEXT) # 3. 设置字体并绘制文本(通过坐标精准控制位置) title_font = win32ui.CreateFont({ "name": "Arial", "height": 22, "weight": win32con.FW_BOLD, }) content_font = win32ui.CreateFont({ "name": "Arial", "height": 18, "weight": win32con.FW_NORMAL, }) # 绘制标题字体的字段 hDC.SelectObject(title_font) hDC.TextOut(50, 30, f"Firma Adı: {firma_adi}") # 切换为内容字体绘制其他字段 hDC.SelectObject(content_font) hDC.TextOut(50, 70, f"Film Türü: {film_turu}") hDC.TextOut(50, 110, f"Film Eni: {film_eni}") hDC.TextOut(50, 150, f"Kilo: {kilo}") hDC.TextOut(50, 190, f"Tarih: {tarih}") hDC.TextOut(50, 230, f"Barkod No: {barkod}") # 4. 绘制条码图片 img = Image.open(barcode_img_path) # 调整条码尺寸适配标签 img = img.resize((300, 100), Image.Resampling.LANCZOS) dib = ImageWin.Dib(img) # 绘制到指定区域(x1,y1,x2,y2) dib.draw(hDC.GetHandleOutput(), (50, 280, 350, 380)) # 5. 结束打印并清理资源 hDC.EndPage() hDC.EndDoc() hDC.DeleteDC() # 删除临时条码图片 os.remove(barcode_img_path) # 示例调用(替换为你的数据库查询结果) if __name__ == "__main__": # 从数据库获取数据的逻辑(保留你原有的SQL操作) # self.cursor.execute(...) # self.connection.commit() # 假设获取到的数据 barkod = "123456789012" film_turu = "PVC Film" film_eni = "120cm" firma_adi = "XYZ Plastik" kilo = "50kg" tarih = "2024-05-20" # 执行打印 print_label(barkod, film_turu, film_eni, firma_adi, kilo, tarih)
关键说明
- 坐标控制:
TextOut(x,y, text)中的x、y为像素坐标,可根据标签布局自由调整数值,实现元素精准定位。 - DPI适配:如果打印机DPI不是96,需修改
TAG_WIDTH和TAG_HEIGHT的计算方式(比如300DPI的话,4*300=1200像素)。 - 条码类型:示例使用Code 128,可根据需求更换为EAN-13、UPC-A等,只需将
Code128替换为对应类型即可。 - 原代码问题修正:你之前的TXT打印方式无法控制元素位置,且未处理条码生成,上述方案通过GDI绘图直接解决了定位问题,同时集成了条码生成与打印流程。
内容的提问来源于stack exchange,提问作者Yakuphanmemis
相关产品推荐
相关产品推荐

