作为 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 带来了突破性的报表打印——静默打印。
示例下载:
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,办法总比艰难多,如果大家在遇到相似的需要时,也不必发愁,当初市面上曾经呈现了卓有成效的办法解决问题。去解决这个问题。