2

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

 2 years ago
source link: https://my.oschina.net/powertoolsteam/blog/5381916
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

突破技术限制,实现Web端静默打印 - 葡萄城技术团队博客 - OSCHINA - 中文开源技术交流社区

作为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,方法总比困难多,如果大家在遇到类似的需求时,也不用发愁,现在市面上已经出现了行之有效的方法解决问题。去解决这个问题。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK