0.了解到python连接打印机需要安装win32print,去官网查看https://github.com/mhammond/pywin32/releases
1.python的版本选择正确,下载成功后得到安装包,点击安装出现python version 3.5 required, which was not found in the registry
2.解决方法是新建一个python脚本,命名为 register.py,内容为:
import sys
from winreg import *
# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix
regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
installpath, installpath, installpath
)
def RegisterPy():
try:
reg = OpenKey(HKEY_CURRENT_USER, regpath)
except EnvironmentError as e:
try:
reg = CreateKey(HKEY_CURRENT_USER, regpath)
SetValue(reg, installkey, REG_SZ, installpath)
SetValue(reg, pythonkey, REG_SZ, pythonpath)
CloseKey(reg)
except:
print("*** Unable to register!")
return
print("--- Python", version, "is now registered!")
return
if (QueryValue(reg, installkey) == installpath and
QueryValue(reg, pythonkey) == pythonpath):
CloseKey(reg)
print("=== Python", version, "is already registered!")
return
CloseKey(reg)
print("*** Unable to register!")
print("*** You probably have another Python installation!")
if __name__ == "__main__":
RegisterPy()
运行即可,显示成功!下一步。
3.连接打印机,当你想打印单行的时候可以这样直接将文本送入打印机
import os, sys
import win32print
# coding=utf-8
printer_name = win32print.GetDefaultPrinter ()
if sys.version_info >= (3,):
raw_data =bytes ("This is a test", "utf-8")
else:
raw_data = "This is a test"
hPrinter = win32print.OpenPrinter (printer_name)
try:
hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
try:
win32print.StartPagePrinter (hPrinter)
win32print.WritePrinter (hPrinter, str_byte)
# win32print.WritePrinter (hPrinter, raw_data+'hhh')
win32print.EndPagePrinter (hPrinter)
finally:
win32print.EndDocPrinter (hPrinter)
finally:
win32print.ClosePrinter (hPrinter)
保证打印机开机后,就可以打印了,差不多是这样的结果
但是我的需求是打印多行,所以尝试着用循环语句将字符扩充
import os, sys
import win32print
# coding=utf-8
printer_name = win32print.GetDefaultPrinter ()
#
# raw_data could equally be raw PCL/PS read from
# some print-to-file operation
#
# def get_Print(raw_data):
code_list=[1153000235,1153000236,1153000237]
if sys.version_info >= (3,):
s_tp=''
raw_data = " computer\n {}\n it\n lee\n"
for co in code_list:
# print(raw_data.format(co))
s_tp=s_tp+raw_data.format(co)
# print(s_tp)
str_byte=bytes (s_tp, "utf-8")
# print('this')
else:
raw_data = "This is a test"
hPrinter = win32print.OpenPrinter (printer_name)
try:
hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
try:
win32print.StartPagePrinter (hPrinter)
win32print.WritePrinter (hPrinter, str_byte)
# win32print.WritePrinter (hPrinter, raw_data+'hhh')
win32print.EndPagePrinter (hPrinter)
finally:
win32print.EndDocPrinter (hPrinter)
finally:
win32print.ClosePrinter (hPrinter)
但是打印出来的效果是
可以看到换行符'\n'在这里的作用是直接把行换到作用字符对应的下一行,本来我以为打印出来的是这样的
computer
1153000235
it
lee
computer
1153000236
it
lee
computer
1153000236
it
lee
但实际上是:
computer
1153000235
it
lee
computer
1153000236
it
lee
computer
1153000236
it
lee
后面因为太宽,没打出来
在api里也没有找到换行符应该怎样处理
所以用了另一种思路,将文本送给word文档,然后再打印文档,用到python-docx库,没有的话可以直接用pip安装
# coding:utf-8
import win32print
import win32api
from docx import Document
from docx.shared import Inches
document = Document()
code_list=[1153000235,1153000236,1153000237]
for i in range(3):
testName = "computer\n"+str(code_list[i])+"\n"+"IT\n"+"Lee"
p_total = document.add_heading("", 2)
r_total = p_total.add_run(testName)
r_total.font.bold = True
# document.add_picture(img_name, width=Inches(1.5)) # 向文档里添加图片
document.save("E:/test.docx") # 保存文档
fn="E:/test.docx"
win32api.ShellExecute(0,'print',fn,win32print.GetDefaultPrinterW(),".",0)
得到了这样的
差不多就是这样子,个人觉得还是直接传字符的比较方便,等我再研究一下那个方法