前言:一开始试了好多打印方式,图片打印很糊,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))