利用Websocket实现网页调用打印功能

来源:互联网 发布:ktv唱歌 知乎 编辑:程序博客网 时间:2024/05/21 20:36

最近项目遇到打印问题,情景是一台机子连着多个打印机,需要打印小样、条码、A4等等,原本以为调用window.print直接了事。可是客户不买帐啊,每次打印不同的文件都要设置不同的打印机,客户直接不干了,没办法,只好给他整。网上搜了好几个打印控件,感觉都不顺心,于是干脆就自己写一个,便想用websocket+pyqt做个打印控件。

直接撸代码吧,python丰富的库直接省了很多事情,使用tornado的websocket+pyqt的QPrinter,几行代码就搞定了

#-*- coding:utf8 -*-import tornado.webimport tornado.ioloopimport tornado.httpserverimport tornado.optionsimport sysfrom tornado.options import define,optionsfrom tornado.websocket import WebSocketHandlerimport jsonfrom PyQt5.QtWidgets import QApplicationfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtPrintSupport import QPrinterInfo,QPrinterdefine("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_()


前端也可以封装一成了Printer类就可以了

贴个git地址^-^

原创粉丝点击