作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了?

真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源。所以,在Web上实现无预览和打印并不是一个简单的问题,而是突破权限、突破平台的问题。这就导致了用户在打印报表时,至少需要点击两个按钮才能完成打印,如果是需要批量打印的场景,用户则需要重复多次点击按钮,非常麻烦。

而不了解详细内情的甲方则会非常不解,这么简单的一个诉求,只是省去点击一个操作步骤,为什么你们办不到呢?

这种对于我们卑微乙方的灵魂拷问,让我们也很头疼,不是我们办不到,是客观条件不允许我们办到。

作为一个资历比较老的 Wyn Enterprise(读音:One)嵌入式BI和ActiveReports报表控件的技术顾问,这两年接触的客户,基本不再使用 Winform或WPF了,大部分项目都迁移到B/S 端,采用前后端分离的架构,或者 MVC。

在这种情况下,客户都会面临需要打印却无法直接连接打印机,进行默认打印的能力。如果是物流行业的企业或者生产制造企业,网页端打印,都是批量性的操作,比如物流单,每次批量打印上千张,如果每打印一张弹出一次打印预览界面,可能用不了多久,我们的可爱的甲方会将我们的电话打爆炸。

在如此严峻的形势之下,外加众多用户都追着询问这个问题,静默打印在 Web端的功能实现也是非常急迫的。

现在大部分打印过程基本是将需要打印的内容导出为PDF文件,然后调用浏览器的打印预览,进行打印。既然有了第一步,就一定有直接实现静默打印的方法,。以下是本人搜索全网,觉得比较合适的内容,现将结果分享给大家。

实现思路有两种:

  1. 设置浏览器
  2. 安装插件,使用代理软件

话不多说直接干货,看看测试结果。

设置浏览器

有限制的地方就会有需求,既然打印时浏览器限制,那么就一定也有别的用户也有我们同样的需求,方法总比困难多。搜索后,我们找到在Chrome 和火狐浏览器的设置中,有解决的方法,这法子看着像模像样,点赞也很多:

大致内容是:

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

  • 打开桌面快捷方式,修改在后缀输入--kiosk --kiosk-printing。

而走到这一步,此路就不通了。系统会一直弹出如下的错误,无法修改。

让我们换个浏览器试试。

  1. 修改-火狐浏览器

  2. 在浏览器输入:about:config

  3. 在输入框输入 print.always_print_silent

并设置为Boolean 类型,点+号

  1. 重启-测试打印

此时系统依然会弹出打印预览对话框,此方法依旧无效。

使用代理软件

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 带来了突破性的报表打印——静默打印。

示例下载:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MTgzNDk3fDg2YWRhNTgyfDE2NDA1OTEzMzd8MjkzODJ8MTM2MTU1

操作步骤:

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端静默打印的更多相关文章

  1. WEB端实现打印

    首先需要下载一个JQ插件: 地址: http://files.cnblogs.com/files/SabWoF/jq%E6%89%93%E5%8D%B0%E6%8F%92%E4%BB%B6%E5%AE ...

  2. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  3. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  4. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  5. Comet技术详解:基于HTTP长连接的Web端实时通信技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  6. web端及时通讯原理

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  7. 新手入门贴:史上最全Web端即时通讯技术原理详解

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  8. SSE(Server-sent events)技术在web端消息推送和实时聊天中的使用

    最近在公司闲着没事研究了几天,终于搞定了SSE从理论到实际应用,中间还是有一些坑的. 1.SSE简介 SSE(Server-sent events)翻译过来为:服务器发送事件.是基于http协议,和W ...

  9. 技术实践丨React Native 项目 Web 端同构

    摘要:尽管 React Native 已经进入开源的第 6 个年头,距离发布 1.0 版本依旧是遥遥无期."Learn once, write anywhere",完全不影响 Re ...

随机推荐

  1. 『与善仁』Appium基础 — 18、元素定位工具(二)

    目录 1.Appium Inspector介绍 2.Appium Inspector打开方式 3.Appium Inspector布局介绍 4.Appium Inspector工具的配置 5.Appi ...

  2. 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具

    原文链接: 一劳永逸,使用 PicGo + GitHub 搭建个人图床工具 经常写博客的同学都知道,有一个稳定又好用的图床是多么重要.我之前用过七牛云 + Mpic 和微博图床,但总感觉配置起来比较麻 ...

  3. Hadoop入门 运行环境搭建

    模板虚拟机 目录 模板虚拟机 1 硬件 2 操作系统 3 IP地址和主机名称 vm windows10 Hadoop100服务器 远程访问工具 其他准备 克隆虚拟机 克隆 修改主机名/ip 安装jdk ...

  4. nit是虱子的卵

    如题.[牛津] (egg of a) louse or other parasitic insect 虱或其他寄生虫(的卵). 忘了在那个帖子里说nit: 虱子了. 为了凑字数,迄今为止六级/考研单词 ...

  5. Shell变量与算术运算

    区分两个 Shell Shell 语言与 Shell 解释器 Shell 语言 写 Shell 脚本使用的是 Shell 语言,Shell 既是一种命令语言,又是一种程序设计语言. 作为命令语言,它交 ...

  6. How exactly does Google AdWords work?

    The key to how Google AdWords works is the Quality Score. Quality Score is generally how well an ad ...

  7. 【分布式】Zookeeper的Leader选举-选举过程介绍(经典的Paxos算法解析)

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...

  8. ebs 初始化登陆

    BEGIN fnd_global.APPS_INITIALIZE(user_id => youruesr_id, esp_id => yourresp_id, resp_appl_id = ...

  9. JS - 获取当前的时间,并且转换成年 - 月 - 日格式!

    先获取当前时间,并转换成年月日格式! function getNowFormatDate() { var date = new Date(); var seperator1 = "-&quo ...

  10. java实现数组集合转成json格式

    一.下载fastjson.jar http://repo1.maven.org/maven2/com/alibaba/fastjson 二.项目添加jar包 Java Build Path 三.导入类 ...