因为要做一个活动,需要用户上传照片,然后有服务器编辑后,在前端打印。这本是一个很简单的功能,但却卡在了最后一步,就是如何将照片输出到打印机。如果将照片下载然后用专业软件打印当然可以,但是考虑到活动现场的状况,太复杂的操作可能引起混乱。
首先想到的是直接使用浏览器自带的打印功能,使用print.js,打印局部页面。测试过各个浏览器后,发现问题远没想象的那么好。chrome及chromium核心的浏览器在打印时都会将彩色页面打印成黑白页面。这真的不可接受。firefox对局部页面的打印没有预览直接就调用系统打印输出,也是不可接受。IE支持的不够好,而且现在已经不再支持了。只有旧版的edge还可以,但是有太多的参数无法设置。包括边框,宽高等。所以也没法使用。
其次就想到了各种的浏览器插件,比如Lodop和jatoolsPrinter。这种商业软件功能完善,但是限制也多,比如有水印。而且大多重视报表,对图片的打印比较弱。
难道就没有简单的网页打印服务吗?google加百度的去查找,一直没有找到合适的,既然如此那就只能自己来发明轮子了。
思路是这样的,首先编写一个本地http服务,允许跨域提交数据。网页通过ajax提交数据至http服务,http服务拿到数据后,启动打印预览及打印服务。OK,思路很简单。下面就是开始动手,拿出尘封已久的QT。开始编码。
核心代码很简单,http服务可以用现成的qhttp的webserver,主要封装下接收数据后的处理过程,数据接收后,使用QPixmap 实例化图片,然后渲染至打印预览。图片的传输使用base64,而前端图片的base64编码很容易就可以用canvas拿到,
具体的代码看这里github,这可以完美满足照片打印的需求,打印机的设置也可以预先设置好,方便前端一键调用,对于其他的特殊html打印,可以使用QTextDocument来渲染,也有不错的效果。