突破技术限制,实现Web端静默打印

【突破技术限制,实现Web端静默打印】作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了?
真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源 。所以,在Web上实现无预览和打印并不是一个简单的问题,而是突破权限、突破平台的问题 。这就导致了用户在打印报表时,至少需要点击两个按钮才能完成打印,如果是需要批量打印的场景,用户则需要重复多次点击按钮,非常麻烦 。
而不了解详细内情的甲方则会非常不解,这么简单的一个诉求,只是省去点击一个操作步骤,为什么你们办不到呢?
这种对于我们卑微乙方的灵魂拷问,让我们也很头疼,不是我们办不到,是客观条件不允许我们办到 。
作为一个资历比较老的 Wyn Enterprise(读音:One)嵌入式BI和ActiveReports报表控件的技术顾问,这两年接触的客户,基本不再使用 Winform或WPF了,大部分项目都迁移到B/S 端,采用前后端分离的架构,或者 MVC 。
在这种情况下,客户都会面临需要打印却无法直接连接打印机,进行默认打印的能力 。如果是物流行业的企业或者生产制造企业,网页端打印,都是批量性的操作,比如物流单,每次批量打印上千张,如果每打印一张弹出一次打印预览界面,可能用不了多久,我们的可爱的甲方会将我们的电话打爆炸 。
在如此“严峻“的形势之下,外加众多用户都追着询问这个问题,静默打印在 Web端的功能实现也是非常急迫的 。
现在大部分打印过程基本是将需要打印的内容导出为PDF文件,然后调用浏览器的打印预览,进行打印 。既然有了第一步,就一定有直接实现静默打印的方法 。以下是本人搜索全网,觉得比较合适的内容,现将结果分享给大家 。
实现思路有两种:

  1. 设置浏览器
  2. 安装插件,使用代理软件
话不多说直接干货,看看测试结果 。
设置浏览器有限制的地方就会有需求,既然打印时浏览器限制,那么就一定也有别的用户也有我们同样的需求,方法总比困难多 。搜索后,我们找到在Chrome 和火狐浏览器的设置中,有解决的方法,这法子看着像模像样,点赞也很多:
突破技术限制,实现Web端静默打印

文章插图
 
大致内容是:
  1. 进入 Chrome的高级设置,设置浏览器默认的主页为我们的 Web应用需要静默打印的页面 。跟着介绍,我们也操作起来 。
  • 点击设置
  • 外观-设置显示主页按钮,并输入我们要访问的 Web页面 。

突破技术限制,实现Web端静默打印

文章插图
 
  • 打开桌面快捷方式,修改在后缀输入--kIOSk --kiosk-printing 。
而走到这一步,此路就不通了 。系统会一直弹出如下的错误,无法修改 。
突破技术限制,实现Web端静默打印

文章插图
 
让我们换个浏览器试试 。
  1. 修改-火狐浏览器
  2. 在浏览器输入:about:config
  3. 在输入框输入 print.always_print_silent
并设置为Boolean 类型,点+号
突破技术限制,实现Web端静默打印

文章插图
 

突破技术限制,实现Web端静默打印

文章插图
 
  • 重启-测试打印
此时系统依然会弹出打印预览对话框,此方法依旧无效 。
突破技术限制,实现Web端静默打印

文章插图
 
使用代理软件JSPrint
使用方法简单,先用Demo网站调用JSPrintManager打印接口,然后使用客户端进行代理,就可以实现打印 。支持的平台有:windows 10,IE,Edge, 火狐,Chrome,Safari 。
突破技术限制,实现Web端静默打印

文章插图
 
下面是一些常用能介绍 。
使用用户选择打印机代码示例:
const cpj = new JSPM.ClientPrintJob();cpj.clientPrinter =  new JSPM.UserSelectedPrinter();const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);cpj.files.push(printFile);await cpj.sendToClient();会出现打印对话框
突破技术限制,实现Web端静默打印

文章插图
 
使用默认打印机
const cpj = new JSPM.ClientPrintJob();cpj.clientPrinter =  new JSPM.DefaultPrinter();const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);cpj.files.push(printFile);await cpj.sendToClient();


推荐阅读