乐趣区

关于前端:突破技术限制实现Web端静默打印

作为 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…;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,办法总比艰难多,如果大家在遇到相似的需要时,也不必发愁,当初市面上曾经呈现了卓有成效的办法解决问题。去解决这个问题。

退出移动版