突破技术限制,实现Web端静默打印
作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了?
真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源。所以,在Web上实现无预览和打印并不是一个简单的问题,而是突破权限、突破平台的问题。这就导致了用户在打印报表时,至少需要点击两个按钮才能完成打印,如果是需要批量打印的场景,用户则需要重复多次点击按钮,非常麻烦。
而不了解详细内情的甲方则会非常不解,这么简单的一个诉求,只是省去点击一个操作步骤,为什么你们办不到呢?
这种对于我们卑微乙方的灵魂拷问,让我们也很头疼,不是我们办不到,是客观条件不允许我们办到。
作为一个资历比较老的 Wyn Enterprise(读音:One)嵌入式BI和ActiveReports报表控件的技术顾问,这两年接触的客户,基本不再使用 Winform或WPF了,大部分项目都迁移到B/S 端,采用前后端分离的架构,或者 MVC。
在这种情况下,客户都会面临需要打印却无法直接连接打印机,进行默认打印的能力。如果是物流行业的企业或者生产制造企业,网页端打印,都是批量性的操作,比如物流单,每次批量打印上千张,如果每打印一张弹出一次打印预览界面,可能用不了多久,我们的可爱的甲方会将我们的电话打爆炸。
在如此严峻的形势之下,外加众多用户都追着询问这个问题,静默打印在 Web端的功能实现也是非常急迫的。
现在大部分打印过程基本是将需要打印的内容导出为PDF文件,然后调用浏览器的打印预览,进行打印。既然有了第一步,就一定有直接实现静默打印的方法,。以下是本人搜索全网,觉得比较合适的内容,现将结果分享给大家。
实现思路有两种:
- 设置浏览器
- 安装插件,使用代理软件
话不多说直接干货,看看测试结果。
设置浏览器
有限制的地方就会有需求,既然打印时浏览器限制,那么就一定也有别的用户也有我们同样的需求,方法总比困难多。搜索后,我们找到在Chrome 和火狐浏览器的设置中,有解决的方法,这法子看着像模像样,点赞也很多:
大致内容是:
- 进入 Chrome的高级设置,设置浏览器默认的主页为我们的 Web应用需要静默打印的页面。跟着介绍,我们也操作起来。
- 点击设置
- 外观-设置显示主页按钮,并输入我们要访问的 Web页面。
- 打开桌面快捷方式,修改在后缀输入--kiosk --kiosk-printing。
而走到这一步,此路就不通了。系统会一直弹出如下的错误,无法修改。
让我们换个浏览器试试。
修改-火狐浏览器
在浏览器输入:about:config
在输入框输入 print.always_print_silent
并设置为Boolean 类型,点+号
- 重启-测试打印
此时系统依然会弹出打印预览对话框,此方法依旧无效。
使用代理软件
JSPrint
使用方法简单,先用Demo网站调用JSPrintManager打印借口接口,然后使用客户端进行代理,就可以实现打印。支持的平台有:windows 10, IE,Edge, 火狐,Chrome,Safari。
下面是一些常用能介绍。
使用用户选择打印机代码示例:
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();
会出现打印对话框
使用默认打印机
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();
使用安装的打印机
const cpj = new JSPM.ClientPrintJob();
cpj.clientPrinter = new JSPM.InstalledPrinter('Microsoft Print to PDF);
const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);
cpj.files.push(printFile);
await cpj.sendToClient();
获取打印机列表:
const printersInfo = await JSPM.JSPrintManager.getPrintersInfo();
console.log(printersInfo);
JSPrintManager使用起来并不难,但在的使用过程中,存在一些较为明显的技术限制。 在测试过程中,我们发现由于未知的因素,会出现旧示例无法使用工作,需要我们新建一个示例来完成JSPrint的静默打印的调用;除此之外,这种方法在火狐浏览器中无法正常执行。如果你是Mac OS需要注意,一旦试用JSPrintManager将无法卸载。
Wyn Enterpriese
实现在线报表设计,预览及静默打印一体功能 Wyn Enterprise V5.0 Update1 带来了突破性的报表打印——静默打印。
示例下载:
操作步骤:
1 、启动打印代理服务(打印代理是使用PowerShell脚本完成的)
包含文件如下:
启动代理必须的环境资源:
1、【Visual Studio 2022】(https://visualstudio.microsoft.com/vs/) 17.0 及以上版本(编译实例需要)
2、【.NET 6.0 SDK】 (https://www.microsoft.com/net/download)
3、【.NET Core Hosting Bundle】(https://docs.microsoft.com/en-us ... view=aspnetcore-5.0) (IIS 部署环境)
资源文件介绍:
./switchPrinter.ps1 切换默认的打印机资源
`./start.ps1` 启动和安装打印服务
./stop.ps1 停止服务
./build.ps1 如果修改了 src文件夹下的文件,需要启动该脚本,进行重新编译,编译的项目会放置在./PrintAgent 文件夹中
./debug.ps1 如果修改了src文件夹,可以使用该脚本进行调试。
启动代理服务器:
将示例下载后,以管理员权限打开powershell 工具可先执行以下命令:
- 执行命令 Set-ExecutionPolicy Bypass -Scope CurrentUser -Force 启用执行脚本功能
- 调用 ./switchPrinter.ps1 命令选择默认的打印机
- 使用 ./start.ps1 命令启动服务,如果结束后,调用./stop.ps1 关闭案例
2、启动成功后,我们再来运行WynReportDesigner 或WynViewer示例:
执行这些示例,会自动加载到默认的打印机选项,。实现打印需求。
该示例代理使用葡萄城内部的PDF打印库进行无声打印。 可以通过附件中的powerhellpowershell脚本启动Agent并在Windows 10上注册其自动运行。
配置成功后,可以看到点击打印按钮后,后台会连接默认的打印机进行打印。
总结
解决静默打印是没有捷径可以走的,设置浏览器该方法是看着是非常便捷,但是结果是并无效果。这时使用代理是一个行之有效的方法,但是现成的智慧结晶往往需要一些知识付费。Anyway,方法总比困难多,如果大家在遇到类似的需求时,也不用发愁,现在市面上已经出现了行之有效的方法解决问题。去解决这个问题。
突破技术限制,实现Web端静默打印的更多相关文章
- WEB端实现打印
首先需要下载一个JQ插件: 地址: http://files.cnblogs.com/files/SabWoF/jq%E6%89%93%E5%8D%B0%E6%8F%92%E4%BB%B6%E5%AE ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- Comet技术详解:基于HTTP长连接的Web端实时通信技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- web端及时通讯原理
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- 新手入门贴:史上最全Web端即时通讯技术原理详解
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- SSE(Server-sent events)技术在web端消息推送和实时聊天中的使用
最近在公司闲着没事研究了几天,终于搞定了SSE从理论到实际应用,中间还是有一些坑的. 1.SSE简介 SSE(Server-sent events)翻译过来为:服务器发送事件.是基于http协议,和W ...
- 技术实践丨React Native 项目 Web 端同构
摘要:尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期."Learn once, write anywhere",完全不影响 Re ...
随机推荐
- 前端4 — jQuery — 更新完毕
1.下载jQuery 网址:Download jQuery | jQuery 最好下载最新版的,因为有什么bug问题,最新版的都会有,所以学技术就用最新版的,实际开发用的时候就要讲究了 2.开始用j ...
- 一站式Flink&Spark平台解决方案——StreamX
大家好,我是独孤风.今天为大家推荐的是一个完全开源的项目StreamX.该项目的发起者Ben也是我的好朋友. ****什么是StreamX,StreamX 是Flink & Spark极速开发 ...
- python-3.x-生成器使用
生成器函数代码: 1 def gen(n): 2 i = 1; 3 sum = 0; 4 while i <= n: 5 ''' 6 方法体1 -- sum求和是1到9的和 7 yield su ...
- Shell学习(八)——dd命令
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- c学习 - 第三章:数据类型、运算符与表达式
数据类型 基本类型 整型 短整型(short int) 基本整型(int) 长整型(long int) 字符型(char) 浮点型 单精度(float) 双精度(double) 长双精度(long d ...
- android转换透明度
比方说 70% 白色透明度. 就用255*0.7=185.5 在把185.5转换成16进制就是B2 你只需要写#B2FFFFFF 如果是黑色就换成6个0就可以了.前2位是控制透明度的.
- Linux基础命令---get获取ftp文件
get 使用lftp登录ftp服务器之后,可以使用get指令从服务器获取文件. 1.语法 get [-E] [-a] [-c] [-O base] rfile [-o lfil ...
- 深入 char
深入 char * ,char ** ,char a[ ] ,char *a[] 内核分类: c语言 2013-02-23 15:34 15176人阅读 评论(8) 收藏 举报Charcharchar ...
- Non-terminating decimal expansion; no exact representable decimal result.
Non-terminating decimal expansion; no exact representable decimal result. 翻译为:非终止十进制扩展; 没有确切的可表示的小数 ...
- Linux系统下安装tomcat
一.前置条件 安装tomcat需要先安装jdk,所以没有安装jdk同学,详见参考文章 二.Linux上安装tomcat 1. 下载Apache tomcat tomcat官网下载地址 在左边,可以选择 ...