利用Websocket實現網頁調用打印功能

最近項目遇到打印問題,情景是一臺機子連着多個打印機,需要打印小樣、條碼、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_()


前端也可以封裝一成了Printer類就可以了

貼個git地址^-^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章