浏览器静默打印

5
我在过去几天里进行了大量研究,并且已经对这个问题有了足够的了解。我的目标是使用打印按钮直接从网页上打印,而不想出现浏览器的打印弹窗。我的 Web 应用程序将连接 2 台打印机,我希望能自动选择打印机。
我知道 PHP 或没有任何浏览器扩展或 ActiveX 插件是不可能实现的。
我也考虑过通过 Websockets 发送打印请求,同时安装 Java Socket 客户端应用程序到用户系统中。
请给我建议,提供省时的解决方案来解决我的问题。

1
你无法覆盖客户端浏览器的打印功能。PHP/Java 与此无关。 - kevingreen
你想要构建一个Java Web客户端,调用一个网站并打印页面吗? - kevingreen
重点是从 PHP 客户端向 PHP Socket 服务器发送打印请求,然后 PHP Socket 服务器将请求传递给 Java 客户端。 - Faizan Afzal
这篇文章可能对你有所帮助:https://dev59.com/sEvSa4cB1Zd3GeqPbx0_#32264059 - Ramdrupal7
回复:“让Java客户端应用程序处理打印请求”... @FaizanAfzal 如果可以接受Java客户端应用程序(而不是小程序),这里有一个可以处理HTTPS的产品 https://github.com/qzind/tray。 - tresf
显示剩余3条评论
2个回答

11
在上面的评论中,你提到过你已经研究了Chrome扩展和FireFox插件,然而这些浏览器中已经内置了禁用打印对话框的功能。如果你正在制作的Web应用程序将在受控环境(您管理哪些浏览器可以访问它以及它们如何配置)中运行,那么你可以相当容易地做到这一点。 Chrome 首先,转到chrome://settings/并将您的主页更改为Web应用程序。接下来,在桌面上为Chrome浏览器创建一个快捷方式,然后右键单击该快捷方式以打开属性窗口。在“目标”输入字段中,添加--kiosk --kiosk-printing到结尾。应用更改,关闭所有Chrome窗口,然后单击快捷方式。这应该会使您进入全屏模式(kiosk mode),当您尝试打印时,它应该自动打印在默认打印机上,而不显示弹出窗口。 FireFox 在FireFox中,转到about:config并同意任何警告消息。然后,在页面的某个地方右键单击并创建一个“New -> Boolean”。它将提示您输入名称和状态。对于名称,请输入print.always_print_silent,对于状态,请将其设置为true。然后,您需要保存更改并重新启动您已打开的任何FireFox窗口。如果您尝试打印某些内容,它将不再要求显示弹出窗口,并且将自动打印在默认打印机上。
使用这两种浏览器中的任何一种以此方式配置后,您可以使用标准的window.print();JavaScript方法进行打印,而无需任何服务器端交互。 批处理文件? 如果您想要更简单的方法来完成这些操作,可以使用这两个命令提示脚本自动配置和/或运行它们以满足您的需求:
Chrome:
cd Program Files (x86)\Google\Chrome\Application
chrome.exe --kiosk --kiosk-printing

火狐浏览器:

FOR /D %%G in ("%APPDATA%\Mozilla\Firefox\Profiles\*.default") DO SET prof=%%G
cd %prof%
echo user_pref("print.always_print_silent", true);>>prefs.js
cd \..
cd Program Files (x86)\Mozilla Firefox
firefox.exe

2
简而言之,处理套接字连接上的HTTPS是棘手的,因为存在混合内容限制和不断变化的SSL标准,因此从头开始编写以在所有平台上工作可能很困难。

我还想到了一种解决方案,即使用Web套接字发送打印请求,同时在用户系统上安装Java套接字客户端应用程序。

QZ Tray正是这样工作的。
qz.websocket.connect().then(function() { 
   return qz.printers.find("zebra");              // Pass the printer name into the next Promise
}).then(function(printer) {
   var config = qz.configs.create(printer);       // Create a default config for the found printer
   var data = ['^XA^FO50,50^ADN,36,20^FDRAW ZPL EXAMPLE^FS^XZ'];   // Raw ZPL
   return qz.print(config, data);
}).catch(function(e) { console.error(e); }

上面的示例是针对原始打印的,但该应用程序也适用于其他格式(如HTML、PDF和图像)。
项目页面: https://github.com/qzind/tray 完全声明...作为上述插件的作者,我认为提到PrintNode做了一个几乎相同的任务是公平的。这两个插件都是开源的,但由商业服务支持。
项目页面: https://github.com/PrintNode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接