关闭

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

377人阅读 评论(0) 收藏 举报

最近项目遇到打印问题,情景是一台机子连着多个打印机,需要打印小样、条码、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地址^-^

0
0
查看评论

Java用webSocket实现tomcat的日志实时输出到web页面

1.场景需求后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来一句,那谁,帮我看一下接口访问出什么错了。。。我刚刚上传的参数过来了吗。。。你返回的是什么。。。我请求过去了吗。。。 好吧,就是这样的一种情况,然后我希望让他们自己去看后台日志,而又不想给他们登陆服务器的权限TAT。...
  • smile326
  • smile326
  • 2016-08-16 11:00
  • 13275

socket程序互相打印IP地址

“任何你真正想得到的一定是值得坚持的!”
  • qq_33044095
  • qq_33044095
  • 2016-10-08 16:10
  • 920

C# WebSocket WebSocket4Net Demo code

WebSocket4Net a .NET websocket client implementation. It originated from SuperWebSocket WebSocket Client. For better developi...
  • hezikui1987
  • hezikui1987
  • 2013-02-01 02:25
  • 8335

SuperSocket_WebSocket_WebSocket4Net服务器需要的DLL

  • 2014-05-23 11:32
  • 1.46MB
  • 下载

速卖通开放平台调用菜鸟组件实现云打印

公司是跨境电商,使用速卖通平台卖玩具,我们自己研发的ERP是基于速卖通开放平台API,实现订单的发货提交,打印面单等功能近期公司要求使用菜鸟组件云打印,去平台里看下,有这个API,如下图所示 实现也很容易,返回值如下图所示 其中,encrypteData是加密数据(关键数据)我们再来看看菜鸟打印组件...
  • xiyang1011
  • xiyang1011
  • 2017-11-02 18:21
  • 583

续安装好composer和workerman之后;TP5运行workerman的操作

TP5想要实现时时通讯:首先先安装好composer和workerman,我之前有写一篇安装的方法,在cmd里面安装;tp5手册上面有写cmd命令的代码;接下来是安装好后如何运行的; 首先在项目中建立一个模块,这边就叫socket模块吧,里面有控制器,index.php;在此之前在config配置...
  • logic_lai
  • logic_lai
  • 2017-05-09 14:07
  • 2666

JS调用打印机打印Web页面

JS调用打印机打印Web页面 转载:http://hi.baidu.com/junwords/item/57c38665689cac2e69105bdc 第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个clas...
  • woshirongshaolin
  • woshirongshaolin
  • 2012-12-05 16:27
  • 40133

web打印实现几种方法

在工作中出现web打印的情况是非常多的,其实这也是一个比较烦人的问题,这篇博客整理一下关于Web打印的一些方法或者方式。 1. window.print()这个方法是用来打印网页的,页面上的其他的元素也会被打印处理,在打印的时候页眉页脚是不太好控制的。所以如果使用这种方法的话最好...
  • lfsf802
  • lfsf802
  • 2014-11-30 12:42
  • 29891

如何调用浏览器打印功能来打印页面

@ Page Language="C#" AutoEventWireup="true" CodeFile="print.aspx.cs" Inherits="_print"...
  • wfh_fighting
  • wfh_fighting
  • 2016-11-14 20:36
  • 1253

JS调用打印机打印Web页面

转载:http://hi.baidu.com/junwords/item/57c38665689cac2e69105bdc 第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内。 详细如下:  ...
  • qw_xingzhe
  • qw_xingzhe
  • 2014-07-24 13:13
  • 2839
    个人资料
    • 访问:364次
    • 积分:13
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档