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

告别Word和PDF!用Python的win32ui库直接驱动打印机,搞定标签打印(附完整代码)

Python驱动打印机实战高效标签打印解决方案每次打开Word调整格式、导出PDF再打印的繁琐流程是否已经让你对批量标签打印任务感到厌倦在物流仓储、零售库存、医疗标本等需要高频打印标签的场景中传统打印方式的效率瓶颈尤为明显。本文将介绍如何利用Python的win32ui库直接与打印机硬件对话实现无需中间文件的精准打印控制。1. 环境准备与基础配置1.1 安装必要依赖开始前需要确保系统满足以下条件Windows操作系统win32ui库仅支持WindowsPython 3.6及以上版本目标打印机已正确安装驱动通过pip安装所需库pip install pywin32 pillow1.2 打印机连接检测使用以下代码检测可用打印机列表import win32print def list_printers(): printers win32print.EnumPrinters(2) # 参数2表示枚举本地安装的打印机 return [printer[2] for printer in printers] if __name__ __main__: print(可用打印机:, list_printers())注意如果使用网络打印机请确保打印机共享设置正确且网络连通2. 核心打印控制技术2.1 设备上下文与打印会话win32ui库通过设备上下文(DC)与打印机交互。典型打印流程包括创建设备上下文对象关联特定打印机开始打印任务绘制页面内容结束页面和任务基础打印框架代码import win32ui import win32con def basic_print(printer_name默认打印机): hDC win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) try: hDC.StartDoc(Python打印任务) hDC.StartPage() # 在这里添加绘制内容 hDC.EndPage() hDC.EndDoc() except Exception as e: hDC.AbortDoc() raise e2.2 字体控制与文本定位精确控制文本样式是标签打印的关键。win32ui.CreateFont支持的主要参数参数类型说明常用值heightint字体高度(像素)20-200widthint字体宽度(像素)0(自动)escapementint文本行倾斜(0.1度)0-3600weightint字体粗细400(常规),700(粗体)italicbool斜体True/Falseunderlinebool下划线True/Falsenamestr字体名称宋体,Arial文本定位示例font_spec { name: 黑体, height: 80, weight: 700, italic: False } font win32ui.CreateFont(font_spec) hDC.SelectObject(font) hDC.TextOut(100, 200, 重要标签) # (x, y, text)3. 高级标签打印实现3.1 动态标签模板设计针对常见的标签打印需求我们可以设计可配置的模板系统class LabelTemplate: def __init__(self, printer_name, paper_size(800, 600)): self.printer_name printer_name self.width, self.height paper_size self.elements [] def add_text(self, x, y, content, font_config): self.elements.append((text, x, y, content, font_config)) def print_label(self): hDC win32ui.CreateDC() hDC.CreatePrinterDC(self.printer_name) hDC.StartDoc(标签打印) hDC.StartPage() for element in self.elements: if element[0] text: _, x, y, content, font_config element font win32ui.CreateFont(font_config) hDC.SelectObject(font) hDC.TextOut(x, y, content) hDC.EndPage() hDC.EndDoc()3.2 条码与二维码集成结合Pillow库生成条码图像并打印from PIL import Image, ImageDraw import barcode from io import BytesIO def generate_barcode(code, barcode_typecode128): 生成条码图像 writer barcode.get_barcode_class(barcode_type) img writer(code).render() return img def print_barcode(hDC, img, position, size): 打印条码图像 img img.resize(size) dib ImageWin.Dib(img) dib.draw(hDC.GetHandleOutput(), position)4. 实战医疗标本标签系统4.1 完整案例实现以下是一个医疗标本标签打印的完整示例import win32ui import time from datetime import datetime class MedicalLabelPrinter: def __init__(self, printer_name): self.printer_name printer_name self.label_width 800 self.label_height 500 def print_specimen_label(self, patient_info, test_items): hDC win32ui.CreateDC() hDC.CreatePrinterDC(self.printer_name) try: hDC.StartDoc(医疗标本标签) hDC.StartPage() # 打印医院LOGO区域 self._print_header(hDC) # 打印患者信息 self._print_patient_info(hDC, patient_info) # 打印检验项目 self._print_test_items(hDC, test_items) # 打印时间条码 self._print_time_barcode(hDC) hDC.EndPage() hDC.EndDoc() except Exception as e: hDC.AbortDoc() raise e def _print_header(self, hDC): font win32ui.CreateFont({ name: 黑体, height: 60, weight: 700 }) hDC.SelectObject(font) hDC.TextOut(50, 30, XX医院检验科) hDC.MoveTo(40, 100) hDC.LineTo(self.label_width - 40, 100) def _print_patient_info(self, hDC, info): font_normal win32ui.CreateFont({name: 宋体, height: 35}) font_emph win32ui.CreateFont({ name: 宋体, height: 40, weight: 700 }) hDC.SelectObject(font_normal) hDC.TextOut(50, 120, 姓名:) hDC.SelectObject(font_emph) hDC.TextOut(150, 120, info[name]) hDC.SelectObject(font_normal) hDC.TextOut(50, 170, 病历号:) hDC.SelectObject(font_emph) hDC.TextOut(150, 170, info[medical_id]) def _print_test_items(self, hDC, items): font win32ui.CreateFont({name: 宋体, height: 30}) hDC.SelectObject(font) y_pos 230 hDC.TextOut(50, y_pos, 检验项目:) y_pos 40 for i, item in enumerate(items): if i 0: hDC.TextOut(150, y_pos, 、) y_pos 40 hDC.TextOut(150, y_pos, item) def _print_time_barcode(self, hDC): now datetime.now().strftime(%Y%m%d%H%M) barcode_img generate_barcode(now) print_barcode(hDC, barcode_img, (50, 350), (700, 100)) font win32ui.CreateFont({name: Arial, height: 25}) hDC.SelectObject(font) hDC.TextOut(300, 460, now)4.2 性能优化技巧批量打印优化def batch_print_labels(printer_name, label_data_list): hDC win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) hDC.StartDoc(批量标签打印) for data in label_data_list: hDC.StartPage() # 绘制标签内容 draw_label_content(hDC, data) hDC.EndPage() hDC.EndDoc()打印机缓存利用复用设备上下文对象预加载常用字体使用打印机原生指令模式需查阅特定打印机手册错误处理与重试机制def safe_print(print_func, max_retries3): for attempt in range(max_retries): try: return print_func() except win32ui.error as e: if attempt max_retries - 1: raise time.sleep(1)5. 常见问题排查5.1 打印内容偏移调整当打印内容出现位置偏差时可通过以下步骤校准打印测试页记录偏移量调整代码中的坐标参数考虑打印机自身的页边距设置校准代码示例def calibrate_position(printer_name): hDC win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) hDC.StartDoc(校准测试页) hDC.StartPage() # 打印参考网格 for x in range(0, 1000, 50): hDC.MoveTo(x, 0) hDC.LineTo(x, 1000) hDC.TextOut(x, 10, str(x)) for y in range(0, 1000, 50): hDC.MoveTo(0, y) hDC.LineTo(1000, y) hDC.TextOut(10, y, str(y)) hDC.EndPage() hDC.EndDoc()5.2 特殊打印机适配不同品牌打印机可能需要特殊处理打印机类型注意事项解决方案热敏标签机纸张尺寸固定精确设置页面尺寸票据打印机自动切纸功能发送切纸指令工业打印机高速模式优化绘图指令针对斑马打印机的指令示例def send_zpl_command(printer_name, zpl_command): hPrinter win32print.OpenPrinter(printer_name) try: hJob win32print.StartDocPrinter(hPrinter, 1, (ZPL指令, None, RAW)) win32print.StartPagePrinter(hPrinter) win32print.WritePrinter(hPrinter, zpl_command.encode(utf-8)) win32print.EndPagePrinter(hPrinter) win32print.EndDocPrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter)

相关文章:

告别Word和PDF!用Python的win32ui库直接驱动打印机,搞定标签打印(附完整代码)

Python驱动打印机实战:高效标签打印解决方案 每次打开Word调整格式、导出PDF再打印的繁琐流程,是否已经让你对批量标签打印任务感到厌倦?在物流仓储、零售库存、医疗标本等需要高频打印标签的场景中,传统打印方式的效率瓶颈尤为明…...

M1芯片MacOS通过Homebrew一键安装wget的完整指南

1. 为什么M1芯片的Mac用户需要wget? 作为一个在MacOS上摸爬滚打多年的开发者,我见过太多新手面对命令行工具时的茫然。wget这个看似简单的下载工具,其实是数据处理、文件抓取甚至自动化脚本中的瑞士军刀。特别是在M1芯片的Mac上,由…...

4大技术突破!ClickHouse如何重塑实时数仓处理范式

4大技术突破!ClickHouse如何重塑实时数仓处理范式 【免费下载链接】ClickHouse ClickHouse 是一个免费的大数据分析型数据库管理系统。 项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse 问题剖析:数据处理的三重困境 在数字化转型…...

WuliArt Qwen-Image Turbo详细步骤:LoRA权重目录结构说明与自定义挂载方法

WuliArt Qwen-Image Turbo详细步骤:LoRA权重目录结构说明与自定义挂载方法 1. 项目核心:为什么你需要了解LoRA权重 如果你已经体验过WuliArt Qwen-Image Turbo那“4步出图”的极速快感,可能会好奇:这个模型为什么能这么快&#…...

LangChain4j实战:从零构建企业级智能对话系统的核心模块与演进

1. 为什么选择LangChain4j构建企业级对话系统 第一次接触LangChain4j是在去年帮某金融客户做智能客服升级时。当时团队评估了Python和Java两个技术栈,最终选择Java生态的LangChain4j,主要考虑到三个现实因素:一是现有技术团队全是Java背景&am…...

工业相机选型指南:如何根据IMX系列传感器参数匹配你的项目需求(含帧率/分辨率对照表)

工业相机选型实战:IMX传感器参数解析与场景化匹配策略 在自动化检测、精密测量和机器视觉领域,工业相机的选型直接影响整个系统的性能和可靠性。作为核心元件的图像传感器,其参数组合决定了相机能否准确捕捉目标特征。索尼IMX系列凭借出色的图…...

深入解析Docker Bridge网络模式:从docker0到容器互联实战

1. Docker Bridge网络模式初探 刚接触Docker时,我发现每次启动容器都会自动分配一个IP地址,这些容器之间居然能直接互相访问。这背后的魔法就是Bridge网络模式——Docker的默认网络方案。想象一下docker0就像公司内部的交换机,所有工位&#…...

python-玩具租赁系统 玩具销售商城购物系统vue

目录实现计划概述技术栈选择核心功能模块开发阶段划分部署与优化注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作实现计划概述 开发一个结合玩具租赁和销售功能的商城系统,采用前后端分离架构。前端使用Vue…...

别再死记硬背了!用Python的Scipy库5分钟搞定CDF计算与可视化

别再死记硬背了!用Python的Scipy库5分钟搞定CDF计算与可视化 每次看到统计学教材里那些复杂的概率公式,是不是觉得头大?作为数据分析新手,你可能更关心如何快速解决问题,而不是推导数学定理。今天我们就用Python的scip…...

东方美学AI绘画神器:Asian Beauty Z-Image Turbo快速入门与参数设置详解

东方美学AI绘画神器:Asian Beauty Z-Image Turbo快速入门与参数设置详解 1. 工具概览与核心优势 Asian Beauty Z-Image Turbo是一款专为东方美学人像生成优化的本地AI绘画工具。它基于通义千问Tongyi-MAI Z-Image底座模型,通过注入Asian-beauty专用权重…...

深度测评 10个降AI率工具:全行业通用必看!2026年最新评测与推荐

在学术写作日益依赖AI辅助的今天,如何有效降低论文中的AIGC率、去除明显的AI痕迹,同时保持内容的逻辑性和可读性,成为众多研究者和学生面临的共同难题。AI降重工具应运而生,它们不仅能够精准识别AI生成内容的特征,还能…...

GDriveDL:突破谷歌网盘三大限制,实现600%下载效率提升的Python工具

GDriveDL:突破谷歌网盘三大限制,实现600%下载效率提升的Python工具 【免费下载链接】gdrivedl Google Drive Download Python Script 项目地址: https://gitcode.com/gh_mirrors/gd/gdrivedl 在数字化资源获取日益频繁的今天,研究人员…...

不只是教程:用WSL2+Anaconda3复现GraspNet,我如何管理这个混乱的Python环境

不只是教程:用WSL2Anaconda3复现GraspNet,我如何管理这个混乱的Python环境 在深度学习项目复现的过程中,最令人头疼的往往不是算法本身,而是那些看似简单却暗藏玄机的环境配置问题。GraspNet作为一个典型的复杂项目,集…...

Zinx框架深度解析:连接管理、消息队列与路由设计的实现原理

Zinx框架深度解析:连接管理、消息队列与路由设计的实现原理 在当今高并发的网络服务开发中,选择一个合适的服务器框架往往能事半功倍。Zinx作为一款用Go语言编写的高性能TCP服务器框架,以其轻量级、模块化和易扩展的特性,逐渐成为…...

5分钟上手AI命令行助手:Kimi CLI如何让命令行操作效率提升300%?

5分钟上手AI命令行助手:Kimi CLI如何让命令行操作效率提升300%? 【免费下载链接】kimi-cli Kimi CLI is your next CLI agent. 项目地址: https://gitcode.com/GitHub_Trending/ki/kimi-cli Kimi CLI是一款革命性的AI命令行助手,它将自…...

从CenterNet到YOLC:手把手教你改进小目标检测头(含可变形卷积实现)

从CenterNet到YOLC:手把手教你改进小目标检测头(含可变形卷积实现) 1. 航拍图像小目标检测的挑战与突破 航拍图像中的小目标检测一直是计算机视觉领域的难点问题。与常规图像相比,航拍图像通常具有以下三个显著特点: 超…...

SiameseUIE中文信息抽取:Matlab科学计算集成

SiameseUIE中文信息抽取:Matlab科学计算集成 如果你是一位科研人员,每天面对海量的文献、实验报告和调研数据,是不是经常觉得手动整理信息太费时间了?特别是当需要从一大段文字里找出特定的人名、机构、关系或者事件时&#xff0…...

手把手教你用OpenCV+QT搭建FPGA图像传输测试平台(从环境配置到协议解析)

从零构建FPGA图像传输测试平台:OpenCVQT全链路开发指南 在FPGA图像处理系统的开发中,如何验证硬件输出的图像质量一直是工程师面临的挑战。传统示波器只能查看信号波形,而我们需要的是能够直观显示图像内容、记录传输数据并支持协议分析的完整…...

Inpaint-web终极指南:浏览器端WebGPU图像修复的完整解决方案

Inpaint-web终极指南:浏览器端WebGPU图像修复的完整解决方案 【免费下载链接】inpaint-web A free and open-source inpainting tool powered by webgpu and wasm on the browser. 项目地址: https://gitcode.com/GitHub_Trending/in/inpaint-web 在当今数字…...

避坑指南:Flink CDC监听Oracle时,LogMiner查不到数据导致任务挂掉的排查与修复

Flink CDC监听Oracle数据变更的深度避坑指南:LogMiner查询失效与性能优化实战 引言:当数据流突然中断时 凌晨三点,监控系统突然报警——Flink CDC任务持续运行两周后突然停止向Kafka推送数据变更。查看日志发现大量"ORA-00308: cannot o…...

构建企业级知识库语义搜索引擎:NLP-StructBERT与MySQL协同实战

构建企业级知识库语义搜索引擎:NLP-StructBERT与MySQL协同实战 你是不是也遇到过这样的烦恼?公司内部堆积如山的文档、报告、产品手册,当你想找一份关于“如何解决客户退款流程中的常见问题”的资料时,在搜索框里输入“退款 流程…...

RexUniNLU中文理解能力评测:多项任务性能对比

RexUniNLU中文理解能力评测:多项任务性能对比 在自然语言处理领域,中文理解一直是个充满挑战的任务。不同于英文的空格分隔,中文的词语边界模糊、语义丰富,让很多模型在处理时感到棘手。今天我们要评测的RexUniNLU,正…...

如何免费体验完整的三国杀网页版:无名杀游戏指南

如何免费体验完整的三国杀网页版:无名杀游戏指南 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 想要随时随地享受经典的三国杀对战乐趣吗?无名杀作为一款功能完整的网页版三国杀开源项目,为你提…...

神经网络计算量那些事:FLOPs/MACs/MACCs到底怎么算?从公式到代码的完整对照

神经网络计算量全解析:从FLOPs到MACs的实战指南 在深度学习模型优化过程中,计算量评估是每个开发者必须掌握的核心技能。面对FLOPs、MACs、MACCs这些专业术语,新手往往一头雾水——它们究竟代表什么?如何准确计算?更重…...

2023最新方案:绕过限制,网页一键直达抖音用户页

1. 为什么需要网页跳转抖音用户页? 最近很多朋友发现,在微信、QQ等社交软件里点击抖音分享链接时,经常遇到"已停止访问该网页"的提示。这是因为平台对第三方链接进行了限制,导致无法直接跳转到抖音APP。这种限制给内容创…...

Siemens S7-200 SMART PLC与组态王以太网通信实战指南

1. 环境准备与驱动安装 在开始S7-200 SMART PLC与组态王的以太网通信配置前,需要确保硬件和软件环境就绪。我建议先准备一台安装了Windows 7/10系统的工控机(不建议使用Windows 11,某些驱动可能存在兼容性问题),组态王…...

ROS2与Python的完美结合:手把手教你创建第一个功能包

ROS2与Python的完美结合:手把手教你创建第一个功能包 在机器人开发领域,ROS2已经成为事实上的标准框架,而Python凭借其简洁易用的特性,成为快速原型开发的首选语言。当这两者相遇,会擦出怎样的火花?本文将带…...

智能商品对比工具:EcomGPT-7B在消费者决策中的应用

智能商品对比工具:EcomGPT-7B在消费者决策中的应用 1. 引言 每次打开购物APP,面对琳琅满目的商品和五花八门的参数,你是不是也经常感到选择困难?同样价位的两款手机,一个摄像头像素高,一个电池容量大&…...

嘉立创EDA新手避坑指南:从原理图到PCB布局的完整流程(附B站课程推荐)

嘉立创EDA新手避坑指南:从原理图到PCB布局的完整流程 作为一名曾经从零开始学习PCB设计的工程师,我深知新手在入门阶段可能遇到的各种困惑和挫折。本文将带你系统性地了解如何使用嘉立创EDA完成从原理图设计到PCB布局的全流程,避开那些我踩过…...

Phi-4-Reasoning-Vision详细步骤:模型加载进度提示+异常错误定位全流程

Phi-4-Reasoning-Vision详细步骤:模型加载进度提示异常错误定位全流程 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双NVIDIA RTX 4090显卡环境优化。该工具严格遵循官方SYSTEM…...