Python 标签(便签贴)打印,直接连接打印机打印

news2024/11/24 13:51:01

前言:一开始试了好多打印方式,图片打印很糊,docx文件打印效果最好,但是每次打印会打开Word 影响效率,PDF也会打开PDF软件,打印效果略差于docx文件,TXT文件又不能设置字体,找了好久,结合几个文章得到了以下几乎完美的打印方式,可以直接连接打印机,打印想要的效果。

先用简易的一段代码看看效果:

# -*- coding: utf-8 -*- 
import win32ui

hDC = win32ui.CreateDC()
hDC.CreatePrinterDC('Lenovo M7615DNA') # 缺省将使用默认打印机
hDC.StartDoc("title")   # 新建打印任务设置名称
hDC.StartPage()         # 开始一个页面

'''
#字体字典格式
fontdict = {
    'height': 27,     # 字体高 int
    'width' : 27,     # 字体宽 int
    'escapement' : 0, # 字符串倾斜角度 int
    'orientation': 0, # 字符旋转角度 int
    'weight' : 900,   # 字体的粗细 int
    'italic' : 1,     # 倾斜 byte 0或1
    'underline'  : 1, # 下划线 byte
    'strike out' : 1, # 删除线 byte
    'charset': 1,     # 字符集? (ANSI_CHARSET, BALTIC_CHARSET, CHINESEBIG5_CHARSET, DEFAULT_CHARSET,
EASTEUROPE_CHARSET, GB2312_CHARSET, GREEK_CHARSET, HANGUL_CHARSET, MAC_CHARSET, OEM_CHARSET, RUSSIAN_CHARSET, SHIFTJIS_CHARSET,
SYMBOL_CHARSET, TURKISH_CHARSET)
    'out precision' : 0, # 输出精度 byte
    'clip precision': 0, # 剪切精度 byte
    'quality' : 0,       # 输出质量 byte
    'pitch and family':0,# 字体间距和字体集 byte
    'name' : '宋体',     # 字体名称 str
    }
'''

DataList = [
    [15 , 14  , '字体字号,宋体 200'  , {'name': '宋体', 'height': 200}],
    [15 , 450 , '一整行逆时针倾斜9度' , {'name': '宋体', 'height': 150, 'escapement' : 90 }],
    [15 , 800 , '这个字体旋转好像没用', {'name': '黑体', 'height': 180, 'orientation': 900}],
    [1515,1000, '一整行顺时针倾斜90度', {'name': '宋体', 'height': 150, 'escapement' :-900}],
    [15 , 1200, '字体加粗1000' , {'name': '宋体', 'height': 150, 'weight'     : 1000}],
    [15 , 1580, '斜体字'       , {'name': '宋体', 'height': 150, 'italic'     : 1}],
    [15 , 1980, '下划线'       , {'name': '宋体', 'height': 150, 'underline'  : 1}],
    [15 , 2380, '删除线'       , {'name': '宋体', 'height': 150, 'strike out' : 1}]
    ]

for data in DataList:
    font = win32ui.CreateFont(data[3])     # 设置字体
    hDC.SelectObject(font)                 # 将字体应用到后续文本
    hDC.TextOut(data[0], data[1], data[2]) # 写入文本 

hDC.EndPage()  #关闭页面
hDC.EndDoc()   #关闭任务

打印效果如下图:
打印效果
下面附上我便签贴打印部分代码,效果上图红框内容:

# -*- coding: utf-8 -*- 
import win32ui
import time, textwrap, re

hDC = win32ui.CreateDC()
hDC.CreatePrinterDC('PQ00')#
hDC.StartDoc("标签名")
hDC.StartPage()

Ctime = time.strftime("%y/%m/%d %H:%M",time.localtime())
Num   = 'A201'
Name  = '张三 男 66'

DataList = [
    [15 , 14, '编号:', {'name': '宋体', 'height': 27}],
    [15 , 54, '姓名:', {'name': '宋体', 'height': 27}],
    [15 , 94, '项目:', {'name': '宋体', 'height': 27}],
    [90 , 10,  Num   , {'name': '宋体', 'height': 33, 'weight': 1000}],
    [190, 14,  Ctime , {'name': '宋体', 'height': 25}],
    [90 , 52,  Name  , {'name': '宋体', 'height': 33, 'weight': 1000}],
    ]

for data in DataList:
    font = win32ui.CreateFont(data[3])
    hDC.SelectObject(font)
    hDC.TextOut(data[0], data[1], data[2])

# hDC.DrawText(txt,(ulc_x,ulc_y,lrc_x,lrc_y),win32con.DT_LEFT)  

项目 = '个人档案、个人档案、个人档案、个人档案、个人档案、个人档案、个人档案、个人档案、个人档案、个人档案'
font = win32ui.CreateFont({'name':'宋体', 'height': 22,})
hDC.SelectObject(font)

#长文本换行
#此处也可以用list(项目)转为列表,后用循环加位置判断一个个字打入,实现换行,就不需要 textwrap, re
if len (项目) > 14:
    项目0 = list(项目)
    sign = 14
    if 项目0[14] == '、': sign = 15
    
    项目1 = ''.join(项目0[:sign])
    项目2 = ''.join(项目0[sign:])
    hDC.TextOut(78, 98, 项目1)

    para = textwrap.wrap(项目2, width=17)
    write_text = []
    for i, line in enumerate(para):
        write_text.append(line)
        punc = re.search("、", line)
        if punc:
            # 如果有标点符号开头
            if punc.start() == 0:
                line = write_text.pop(-1)
                former = write_text.pop(-1)
                former += punc.group()
                write_text.append(former)
                line = line[punc.end():]
                if len(line) > 0:
                    write_text.append(line)

    for i, line in enumerate(write_text):
        hDC.TextOut(13, 125 + 25*i, line)
else: 
    hDC.TextOut(78, 98, 项目)

hDC.EndPage()
hDC.EndDoc()

也可以打印二维码和条形码,先绘制好图像的PIL对象-image,用下面代码绘入打印页面

dib = ImageWin.Dib (image)
dib.draw (hDC.GetHandleOutput (), (0, 0, 399, 239))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8 Surprising Things You Can Do With ChatGPT 你可以用 ChatGPT 做的 8 件令人惊讶的事情

If you’ve heard about ChatGPT and think it’s just a fancy chatbot, you might be underestimating the range of what it can do. Here are some surprising things you can do with ChatGPT, whether you want to write a resume or have it dungeon-master an epic rol…

第二章(二):Django框架Model之ORM操作数据库:增、删、改、查

系列文章目录 备注:这里是Django系列文章的所有文章的目录 第一章(一) : Django框架之创建项目/应用/templates、连接MYSQL、配置日志LOGGING、启动django项目 第一章(二):Django框架的模式、路由、视图; 第一章(三):Django框架的…

Linux14.文件(下)

文件描述符fd,分配到的是从0开始最小的没有被占用的。 2.输出重定向(重定向的本质,就是在操作系统内部更改fd对应的内容的指向),同时理解输入重定向和追加重定向。 3.重定向函数dup2(oldfd, newfd),oldfd -> newfd (小技巧:一…

jennkins配置k8s动态slave

一、 首先完成jenkins的部署可参考jenkins部署 二、 如果是在同一个k8s集群下部署的则直接这样配置 在security中agent的端口也配置成50000 如果是虚拟机中部署的jenkins添加k8s需要做如下操作 echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt &#…

数字化转型中,企业如何做系统设计

随着人工智能、大数据、云计算、区块链等新一代信息化、数字化技术的高速发展,现阶段社会的方方面面都已经有了巨大的改变,各行各业的企业也都开始了新一轮的科技革命和产业革命,可以说是互联网时代之后,又一个能够从各方面影响世…

MySQL物理文件----日志文件(错误日志、通用查询日志、二进制日志、慢查询日志)

文章目录 MYSQL5.7/8.0支持的几种日志文件1、错误日志(Error log)2、一般或通用查询日志(General query log)3、二进制日志(Binary log)3、1 查看是否开启二进制日志3、2二进制日志开启3、3查看二进制文件位…

数据结构05:树与二叉树[C++][并查集]

图源:文心一言 Chat GPT生成,代码的核心思想与王道咸鱼老师的视频虽然类似,但是在具体实现上毕竟还是略有差别~~因此,如果对考研方向的并查集代码感兴趣,可以查看—— 王道咸鱼老师的视频:{5.5_2_并查集_…

会议邀请|思腾合力邀您共赴MICS 2023第十届医学图像计算青年研讨会

医学图像计算青年研讨会 (Medical Imaging Computing Seminar, MICS) 于2014年成立,宗旨是为医学影像分析领域的全球华人学者提供学术交流平台,增进本领域科研人员和医学专家的交流和合作。 第十届医学图像计算青年研讨会 (MICS 2023) 将于2023年7月14-1…

form表单禁止浏览器自动填充密码

因为用户修改密码的时候,谷歌浏览器、edge等浏览器,总是自动将保存的密码填充到重置密码输入框中,给用户使用带来困扰。原因是因为你在登录的时候选择记住了账号和密码了,所以就会把信息存在浏览器里面,当你在修改密码的时候,由于form表单的 type="password" 所…

【Arduino小车实践】PID算法简介

一、介绍 1. 特点 流量稳定、改变流量(水阀):测量当前流量,与预期流量进行比对,不相等则进行相应的调整。 2. 适用系统 适用线性系统(二阶以内的线性系统):齐次性、叠加性 3. 宏…

ASEMI-A7二极管可用什么代替,M7二极管正负极判断

编辑-Z 在电子设备的世界中,二极管是最常见的组件之一。它们在各种设备中发挥着重要的作用,包括电源适配器、电源供应器、电池充电器等。在这篇文章中,我们将探讨A7二极管可用什么代替,以及M7二极管正负极判断。 首先&#xff0c…

解决Vue 报错error:0308010C:digital envelope routines::unsupported问题

解决Vue 报错error:0308010C:digital envelope routines::unsupported问题 问题原因方法一:修改配置方法二:尝试卸载Node.js 17版本并重新安装Node.js 16版本,然后再重新启动方法三:package.json增加配置(大多数解决问…

【自动驾驶汽车量子群粒子过滤器】用于无人驾驶汽车列车定位的量子粒子滤波研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Doris单机安装部署

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.下载安装包2.修改limits文件 二、安装1.配置启动FE2.配置启动BE3.web测试4.连接测试、添加BE 结尾 前言 Apache Doris 是一个基于 MPP 架构的高…

Linux搭建PXE服务器

安装PXE启动服务器所需的软件包 Tftp,dhcp和vsftpd(httpd也可以作为安装源) 编辑TFTP配置文件 重启tftp服务 编辑/etc/dhcp/dhcpd.conf,新建作用域,主要设置下一跳服务器地址和引导文件名称。 重启dhcp服务 把centos光盘内容拷贝…

营销本地化,跨境电商都要懂的行业知识

营销本地化是调整营销内容以满足目标市场的文化、语言和其他相关差异的过程,这对于那些希望在全球市场取得成功的企业至关重要。它可以帮助公司与客户建立有意义的联系,并提供优质的客户体验。随着技术和互联网的进步,企业可以获得大量资源、…

基于单片机的厨房安全监测系统的设计与实现

功能介绍 以STM32/51单片机作为主控系统; OLED液晶显示当前检测的气体浓度,温度,是否有火等信息; 按键可以设置温度上限、可燃气体浓度上限; 当温度超过我们设置自动开启风扇进行降温; 当检测到天然气泄露后…

【误差自适应跟踪方法AUV】自适应跟踪(EAT)方法研究(Matlab代码Simulin实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

使用wireshark抓包,验证feign http请求的数据透传结果

一、背景 在灰度部署、A/B测试、单元化部署等场景下,微服务服务之间的调用,要求我们对上游服务给过来的数据进行透传至下游服务。 如果是灰度部署,需要对http请求进行染色,http header头部增加灰度标识,然后传递给下…

掌握std::move和std::forward

在讲解std::move和std::forward之前,我们必须先了解C中左值、右值的相关概念。 1、左值、右值 (1)左值:一般指的是在内存中有对应的存储单元的值,最常见的就是程序中创建的变量。 (2)右值&…