巧用自定义协议之跨浏览器实现网页调用本地票据打印机

作者:V君 发布于:2015-8-11 0:25 Tuesday 分类:挖坑经验

TL;DR: 

1) 注册自定义协议

C#实现

2) 实现处理程序

系统会把整个URL当成参数传递到你的程序, 切掉协议头(xxxx://)就可以吃了

用参数调用票据打印机

3) 从网页调用这个协议

推荐使用js设置隐藏iframe的src指向协议连接

 

听我扯扯:

说到网页打印,第一反应应该就是window.print(). 然而这只能是很普通的GDI方式文档打印.

这次遇到的需求是打票 -- 用预印刷的票据纸在针式打印机上.

操作这种打印机需要调用本地API, 浏览器js出于安全考虑一般没有调用权限.

头儿推荐使用漏肚皮打印控件, 然而这货是AX控件, 现在的Chrome已经不支持. 

善于观察的俺在老早就发现企鹅在网页上点击客服或加群时用了tencent://的自定义URL协议

然后又分别在IE/FF/Chrome上试了这种方式, 发现都正常工作, 嗯, 这次就酱紫搞.

如同TL;DR上面说的写个小程序注册成URL协议, 然后在服务端或用网页js组装打印内容.

这次是用ESC/P打印控制协议, 在服务端生成协议链接, 内容就是一坨参杂控制符的字符串.

把这坨字符串用UTF8编码成字节数组, 担心太长可能出错就用LZMA压一压,

拍扁成BASE64加到自定义协议后面, 塞给隐藏iframe.

(刚开始是用window.location.href,考虑到没注册协议可能会导航到错误页面就用iframe了)

本地程序启动后命令行参数就是那串URL, 去头, 然后是BASE64解码, 再接着LZMA解压缩, 再UTF8.GetString.

交给TL;DR上面说的打印机控制接口, 打印机就会啪啪啪的动起来啦!


最后顺利的完成了任务. 


接下来还可以改善一下用户体验, 将这个小程序做个安装包放到网页上供用户下载安装,

还要集成到开始菜单/控制面板“添加删除程序”方便用户卸载, 用NSIS吧~

 

~EOF


标签: 软件开发 C# 自定义URL协议 票据打印

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap