最近項目遇到打印問題,情景是一臺機子連着多個打印機,需要打印小樣、條碼、A4等等,原本以爲調用window.print直接了事。可是客戶不買帳啊,每次打印不同的文件都要設置不同的打印機,客戶直接不幹了,沒辦法,只好給他整。網上搜了好幾個打印控件,感覺都不順心,於是乾脆就自己寫一個,便想用websocket+pyqt做個打印控件。
直接擼代碼吧,python豐富的庫直接省了很多事情,使用tornado的websocket+pyqt的QPrinter,幾行代碼就搞定了
#-*- coding:utf8 -*-
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
import sys
from tornado.options import define,options
from tornado.websocket import WebSocketHandler
import json
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtPrintSupport import QPrinterInfo,QPrinter
define("port",default=8889,type=int)
def printList():
printerInfo = QPrinterInfo()
return printerInfo.availablePrinterNames()
def printContent(printer,context,params):
printerInfo = QPrinterInfo()
p = QPrinter()
for item in printerInfo.availablePrinters():
if printer == item.printerName():
print(printer)
p = QPrinter(item,QPrinter.PrinterResolution)
break
p.setPageMargins(0, 0, 0, 0, QPrinter.Pica)
p.setFullPage(True)
docWidth = params['width'];
docHeight = params['height'];
orit = params['orientation']
# if orit == "landscape":
# p.setOrientation(QPrinter.Landscape)
# else:
# p.setOrientation(QPrinter.Portrait)
print(docWidth * 35)
docSize = QSizeF(docWidth * 35,docHeight*35)
doc = QTextDocument()
doc.setDocumentMargin(5)
doc.setPageSize(docSize)
#doc.setDefaultFont(QFont("Microsoft YaHei", 4, QFont.Normal))
#doc.setIndentWidth(80)
doc.setHtml(u'%s' % context)
doc.print(p)
def printed(state):
print(state)
class PrinterHandler(WebSocketHandler):
def open(self):
pass
def on_message(self, message):
command = json.loads(message)
printype = command['type']
if printype == "print":
printer = command['printer']
content = command['content']
params = command['params']
print(printer)
try:
printContent(printer, content,params)
ret = {"code": 200, "msg": "打印成功"}
self.write_message(json.dumps(ret))
except Exception as e:
ret = {"code":500,"msg":"打印失敗,錯誤信息:" + e}
self.write_message(json.dumps(ret))
elif printype == "list":
## TODO:獲取打印機列表
ls = printList()
ret = {"code":204,"msg":"獲取打印機列表成功","data":ls}
self.write_message(json.dumps(ret))
def on_close(self):
pass
def check_origin(self, origin):
return True # 允許WebSocket的跨域請求
if __name__ == "__main__":
tornado.options.parse_command_line()
app = QApplication(sys.argv)
wapp = tornado.web.Application([(r"/printer",PrinterHandler)])
http_server = tornado.httpserver.HTTPServer(wapp)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
app.exec_()
貼個git地址^-^