You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用条码打印机打印定位文本并将数字转换为条码格式?

条码打印机精准打印文本与条码解决方案

针对你遇到的内容无法定位、条码格式转换问题,结合4英寸×4英寸的标签尺寸,提供以下可行方案:

核心解决思路

  1. 放弃纯文本打印方式:直接打印TXT文件无法控制元素位置,改用Windows GDI绘图API(win32print+win32ui)实现精准绘制。
  2. 条码生成:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:42:48