前言:我用的是下面这款标签贴打印机,一开始试了好多打印方式,图片打印很糊,docx文件打印效果最好,但是每次打印会打开Word 影响效率,PDF也会打开PDF软件,打印效果略差于docx文件,TXT文件又不能设置字体,找了好久,结合几个文章得到了以下几乎完美的打印方式,可以直接连接打印机,打印想要的效果。
要根据打印机可打印区域设置好文本大小和位置。
可打印区域用下面这段代码获取:
width = hDC.GetDeviceCaps (8) #可打印区域宽像素值
height = hDC.GetDeviceCaps (10) #可打印区域高像素值
设置字体需要用到 win32ui.CreateFont 具体参数如下
win32ui.CreateFont 详细参数说明如下:
- 'height':字体的高度,以像素为单位。
- 'width':字体的宽度,以像素为单位。
- 'escapement':字体的倾斜角度,以0.1度为单位。正值表示逆时针旋转。
- 'orientation':字体的方向,以0.1度为单位。正值表示逆时针旋转。
- 'weight':字体的粗细程度,取值范围为0-1000。
- 'italic':是否使用斜体,True表示使用斜体,False表示不使用。
- 'underline':是否使用下划线,True表示使用下划线,False表示不使用。
- 'strike out':是否使用删除线,True表示使用删除线,False表示不使用。
- 'charset':字符集,默认为'DEFAULT_CHARSET'。
- 'out precision':输出精度,默认为'OUT_DEFAULT_PRECIS'。
- 'clip precision':剪辑精度,默认为'CLIP_DEFAULT_PRECIS'。
- 'quality':字体质量,默认为'DEFAULT_QUALITY'。
- 'pitch and family':字体的字母间距和行间距,默认为'DEFAULT_PITCH | FF_DONTCARE'。
- 'name':字体的名称。
说明:以下所有常量都来自win32con,例如:使用字符集常量就用win32con.XXXX_CHARSET表示
字符集
ANSI_CHARSET:ANSI字符集
DEFAULT_CHARSET:默认字符集
SYMBOL_CHARSET:符号字符集
SHIFTJIS_CHARSET:Shift JIS字符集
HANGEUL_CHARSET:韩文字符集
GB2312_CHARSET:GB2312字符集
CHINESEBIG5_CHARSET:繁体中文字符集
OEM_CHARSET:OEM字符集
字体输出精度常量:
OUT_DEFAULT_PRECIS:默认输出精度
OUT_STRING_PRECIS:字符串输出精度
OUT_CHARACTER_PRECIS:字符输出精度
OUT_STROKE_PRECIS:笔画输出精度
OUT_DEVICE_PRECIS:设备输出精度
OUT_RASTER_PRECIS:光栅输出精度
OUT_TT_PRECIS:TrueType字体输出精度
OUT_TT_ONLY_PRECIS:仅限TrueType字体输出精度
OUT_OUTLINE_PRECIS:轮廓输出精度
OUT_SCREEN_OUTLINE_PRECIS:屏幕轮廓输出精度
OUT_PS_ONLY_PRECIS:仅限PostScript输出精度
字体剪辑精度常量:
CLIP_DEFAULT_PRECIS:默认剪辑精度
CLIP_CHARACTER_PRECIS:字符剪辑精度
CLIP_STROKE_PRECIS:笔画剪辑精度
CLIP_MASK:剪辑精度掩码
CLIP_LH_ANGLES:仅使用左上和右下角度进行剪辑
CLIP_TT_ALWAYS:始终使用TrueType字体进行剪辑
CLIP_DFA_DISABLE:禁用字体关联性
CLIP_EMBEDDED:剪辑嵌入的字体
字体质量常量:
DEFAULT_QUALITY:默认字体质量
DRAFT_QUALITY:草稿字体质量
PROOF_QUALITY:校对字体质量
NONANTIALIASED_QUALITY:非抗锯齿字体质量
ANTIALIASED_QUALITY:抗锯齿字体质量
CLEARTYPE_QUALITY:ClearType字体质量
CLEARTYPE_NATURAL_QUALITY:ClearType自然字体质量
字母间距和行间距常量
DEFAULT_PITCH:默认字母间距和行间距
FIXED_PITCH:固定字母间距和行间距
VARIABLE_PITCH:可变字母间距和行间距
FF_DONTCARE:不关心字母间距和行间距
FF_ROMAN:罗马字母间距和行间距
FF_SWISS:瑞士字母间距和行间距
FF_MODERN:现代字母间距和行间距
FF_SCRIPT:手写字母间距和行间距
FF_DECORATIVE:装饰字母间距和行间距
先用简单的代码看下 A4纸 打印效果:
import win32ui, win32con
hDC = win32ui.CreateDC()
hDC.CreatePrinterDC('Lenovo M7615DNA') # 缺省将使用默认打印机
hDC.StartDoc("title") # 新建打印任务设置名称
hDC.StartPage() # 开始一个页面
DataList = [
[15 , 14 , '字体字号,宋体 200' , {'name': '宋体', 'height': 200}],
[15 , 450 , '一整行逆时针倾斜9度' , {'name': '宋体', 'height': 150, 'escapement' : 90 }],
[15 , 800 , '这个字体旋转好像没用', {'name': '黑体', 'height': 180, 'orientation': 90}],
[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]) # 写入文本
fontdict = {
'name' : '宋体', # 字体名称 str
'height': 150, # 字体高 int
'width' : 150, # 字体宽 int
'escapement' : 0, # 字符串倾斜角度 int
'orientation': 0, # 字符旋转角度 int
'weight' : 600, # 字体的粗细 int
'italic' : 0, # 倾斜 byte 0或1
'underline' : 0, # 下划线 byte
'strike out' : 0, # 删除线 byte
'charset': win32con.DEFAULT_CHARSET, # 字符集 int
'out precision' : win32con.OUT_DEFAULT_PRECIS, # 输出精度 int
'clip precision': win32con.CLIP_DEFAULT_PRECIS, # 剪切精度 int
'quality' : win32con.DEFAULT_QUALITY, # 输出质量 int
'pitch and family': win32con.DEFAULT_PITCH | win32con.FF_DONTCARE, # 字体间距和字体集 int
}
# 创建一个字体对象
font = win32ui.CreateFont(fontdict)
hDC.SelectObject(font)
hDC.TextOut(15, 2800, "Hello, World!测试")
hDC.EndPage() #关闭页面
hDC.EndDoc() #关闭任务
下面附上我标签贴打印部分代码,效果上图红框内容:
# -*- coding: utf-8 -*-
import win32ui, time
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)
#长文本换行
fsize = 22 # 字体大小
min_x = 24 # X轴最小值
max_x = 360 # X轴最大值
text_x = 90 # 字X坐标
text_y = 100 # 字Y坐标
font = win32ui.CreateFont({'name':'宋体', 'height': fsize})
hDC.SelectObject(font)
#用list(项目)转为列表,后用for加位置判断一个个字打入,实现换行
for text in list(项目):
if text_x > max_x and text not in ['、']: #判断 text_x是否超过最大设定值 及 是否'、'开头
text_y += fsize + 3 # 行间距3
text_x = min_x
hDC.TextOut(text_x, text_y, text)
text_x += fsize + 0 # 字间距0
hDC.EndPage()
hDC.EndDoc()
也可以打印二维码和条形码,先绘制好图像的PIL对象-image,用下面代码绘入打印页面
dib = ImageWin.Dib (image)
dib.draw (hDC.GetHandleOutput (), (0, 0, 399, 239))
注意:标签打印机如果打印出来是空白没有文字,应该是打印机默认A4纸张大小,进入打印机首选项-高级-纸张/输出-纸张规格-更改为正在使用的标签尺寸。如果没有就到打印机属性-打印机设置-页面设置-增加-添加标签尺寸,再回到打印机首选项更改纸张规格。如果打出来页面不完整应该是横竖向没设置好,切换另一个即可。