企业统一打印平台建设

一、当前现状

目前企业内部打印是通过windows打印服务器共享的方式,客户端连接打印。存在以下问题:
1、大部分用户不会连接
2、打印后的作业容易暴露
3、打印机对osx和linux系统驱动的支持不好
4、用户变动位置后需要重新连接楼层对应的打印机。
如何兼容多平台系统和打印机类型,让用户方便安全地打印。

二、扫码打印想法的产生

受到一个开源项目的启发,在学校的打印机上绑定刷卡机,学生通过刷卡释放作业。刷卡的本质是一个网络请求,企业内部可以通过微信授权获取用户身份,用户需要将文档先上传到web服务器,然后到附近的任意一台打印机扫码完成授权认证,用户无需关注打印机的类型和操作系统,上传后点击打印即可。

三、扫码打印接口的实现

打印接口一开始是打算使用windows提供的api,但是服务器需要安装文档类型对应的程序才能打印。查阅相关资料发现,目前网络打印机主流的协议是IPP,通过IPP可以很方便的实现打印。
基于IPP的打印接口很快就实现了,到了测试环节,发现一个头疼的问题:
目前企业内部使用的打印机是理光和惠普,部分作业发送过去理光打印机自动取消作业,而惠普可以正常打印。咨询了理光的售后,给出的解释是惠普硬件对postscript的支持性能比较好,理光如果要正常打印需要加装ps转换模块。结合如下打印流程,ps模块的作用就是转换的postscript让打印机能更好的识别。
https://www.opscaff.com/wp-content/uploads/2019/08/1111.png

最终我把所有文档都转换成了pdf格式。一个PDF文件实际上是一个PostScript文件进一步解释后的文件格式,打印时比eps或.ps文件更可靠,更准确。
打印的文档自动取消是因为打印机识别不了里面的特殊字符,转换效果差导致的。
初步设想是转换成图片,但是转换出来后一页就是一张图,对于双面打印是个问题。转换后的图片质量也比较差。
尝试其他格式,最终锁定把pdf转换成pdf/A pdf/X pdf/E可以尝试下,这三个是ISO定义的标准PDF来满足不同的场景需求。
PDF/X标准应用于图形内容交换,对大多数网络公司的打印就绪文件传输很理想
PDF/E标准应用于工程文档的交互式交换
PDF/A标准应用于电子文档的长期归档,屏蔽了一些不适合的功能,如Javascript,音频、视频等等。
尝试了这三个都可以正常打印,最终选择了pdf/e,转换出来的文档文件体积较小。
至此,打印接口已实现,支持’txt’,’jpg’,’png’,’gif’,’doc’,’docx’,’xls’,’xlsx’,’ppt’,’pptx’,’vsdx’,’pdf’文档类型,扫码打印流程已经跑通,开始投入内部使用。

四、用户的反馈

原计划是使用扫码打印方式替代原生打印,方便又安全。直到部分用户提出反馈,网页上的文档需要先下载再上传,如果是频繁的打印这种操作很麻烦。扫码打印已经不能满足高频打印需求,用户更喜欢用原生打印机,优势是操作简单,但是相对于扫码打印不够安全。
如何实现原生打印机的兼容,让用户既方便又安全的打印?
初步设想,模拟添加原生打印机,用户打印后监控打印作业帮用户自动上传,用户只要去扫码就可以,这样就减少了下载上传的动作,安全性也得到了保证。

五、客户端打印怎么实现

1、如何获取用户打印的作业?
找一台服务器,添加本地计算机ip作为虚拟打印机,尝试使用socket监听9100端口后,是可以正常获取到打印的作业,不过是ps格式,使用ghostscript转换成pdf后跟原文档是一样的效果。
2、如何获取用户身份信息?
最初还是通过socket监听入手,有效信息只有客户端ip,通过ip能够定位用户吗?想到去AC上面拉取用户的认证信息,不是100%能获取到,如果频繁查询对设备性能有影响,这个方案就放弃了。查阅了windows spooler api的文档,发现是可以通过遍历打印队列获取作业信息,里面的内容还是很丰富的。其中有pUserName就是认证域账号的信息。
认证用户和打印参数都获取到了,剩下的问题就是怎么匹配文档内容和身份信息:
1、尝试通过windows打印队列获取作业内容(windows提供的getJobData方法尝试后无法获取)
2、获取的文档是ps文件,里面是否可以找到跟队列信息相关联的唯一信息(搜索了ps文件中可能会有共性的jobid,未搜索到)
3、尝试找台linux系统加域测试,是否linux下面的打印队列能获取到不一样的信息(linux机器加域后,域账号登录,cups里面没有获取到有效信息)
三种方法尝试后都无法实现目的,开始尝试其他方案,无意间发现打印生成的缓存spl格式文件,文件名是jobid,jobid是唯一的。最终将spl格式转换成pdf,身份和文档就匹配上了。
测试未加域、加域的windows机器和osx系统,身份信息和文档内容均能正常匹配到,后台再将作业上传到文件服务器,写入数据库,用户点打印后只要去扫码就可以了。
结合web扫码打印,整个流程如下:
https://www.opscaff.com/wp-content/uploads/2019/08/2222.png

六、最终效果

用户web上传页面:
https://www.opscaff.com/wp-content/uploads/2019/08/3333.jpg
用户扫码前端页面:
https://www.opscaff.com/wp-content/uploads/2019/08/4444.jpg
经过两个月的稳定运行,打印统计如下:
https://www.opscaff.com/wp-content/uploads/2019/08/5555.jpg

七、客户端打印还需完善

虽然获取到了打印作业的详细信息,包括份数、单双面等,但是测试的时候发现这些参数一直不变,本来设想是用户在客户度选的参数后台获取后记录到数据库,扫码的时候自动将参数填充到前端,如果获取的参数异常,用户就需要在页面里再设置一次,降低了用户体验。这个问题会继续排查。