选择一台打印机并进行静默打印。

17

这个答案展示了如何在Google Chrome中启用静默打印。然而,我有两个网页需要使用两个不同的打印机进行无人工干预的静默打印。在调用window.print()之前是否有一种自动选择打印机的方法?如果真的必要,我可以编写一个Chrome扩展程序。


3
如果要打印的文档之一是纯文本,则可以使用一个简单的批处理文件包装器将其打开,并打印文本。您可以弹出自定义MIME类型的DataURL,并将您的批处理文件与该类型相关联。然后,您可以使用dataURL打印文本,使用window.print()打印HTML。另一个答案是“不”。 - dandavis
5个回答

25
也许您可以使用Google Cloud Print设置打印机,然后使用云打印API静默地向它们提交作业。看起来您可以在提交作业时指定打印机ID。您可能需要使用类似html2canvas的工具将网页栅格化。

可以使用蓝牙打印机吗?或者有类似的解决方案吗? - ishan shah
5
更新:Google Cloud Print自2020年12月31日起不再支持。请参阅支持文章以获取帮助进行迁移。https://support.google.com/chrome/a/answer/9633006 - Lucas Argate

7

如果您在一个熟悉的环境中,并且拥有足够的权限(我假设您知道要使用的打印机),则可以尝试通过命令行更改它。

为此,您应该调用:

@RunDLL32.EXE printui.dll,PrintUIEntry /y /n "Printer name"

打印机名称必须与控制面板中显示的值相同。

如果启用了适当的ActiveX控件,可以使用以下方法从JavaScript调用命令行:

var run=new ActiveXObject('WSCRIPT.Shell').Run("commands to run");

另外,你可以尝试使用shell.application的ShellExecute。
 var objShell = new ActiveXObject("shell.application");
objShell.ShellExecute("cmd.exe", 'RunDLL32.EXE printui.dll,PrintUIEntry /y /n "Printer name"', "C:\\WINDOWS\\system32", "open", 1);

欲了解更多信息,请访问http://msdn.microsoft.com/en-us/library/windows/desktop/gg537745(v=vs.85).aspx

我没有测试过,祝好运!


你的解决方案看起来很奇特,我打算试一下。你是否知道我可以模仿打印机设置的方法?目前我无法访问实际的打印机(它将是徽章打印机,Zebra或Evolis)。 - alex
刚刚测试了一下,它可以工作,但是只能在IE中工作,并且需要在IE安全设置中允许“初始化和脚本ActiveX控件未标记为安全脚本”,有关更多详细信息,请参见此答案 - Gyrocode.com

4

最终我使用F#编写了一个服务器,并通过WebSocket进行通信。


9
请问您能否提供更多关于您解决方案的细节? - Amro

2
我曾经搜索过答案,但看起来没有办法通过编程方式设置打印机。因此,我的解决方案可能比较复杂:
创建一个命令行应用程序,能够切换操作系统的默认打印机。如果您使用的是 Windows,则可以使用 .NET 应用程序完成此操作。如果使用的是 Linux,则应该有一个用于打印机管理的命令行接口(我不确定)。
现在,创建一个 PHP、asp.net 或 Ruby 等页面,能够调用打印机启用/禁用程序。
如果这样工作了,您就可以使用 Javascript 调用先打印到打印机一,然后切换到打印机二。然而,这种方法存在一些缺点:
- 如果打印机一正在打印文档,您无法切换到打印机二,因为这会禁用打印机一。所以需要计算出一个常见任务所需的时间。 - 这种解决方案存在大量的开销。您需要进行额外的调用来切换打印机。 - 可维护性绝对不是最优的,因为您需要维护打印机切换程序和 Web 服务。
希望有人能提出更好的解决方案,但我至少想分享我的想法。也许它们可以帮助您解决问题。

这个解决方案有两个主要问题(我希望我们能克服): 1-首先:如果服务器是客户端机器,并且您调用了JavaScript,那么PHP、ASP、Ruby或其他服务器应该在同一台机器上,它能做什么? 2-第二个同样重要的问题:如果您能够(通过JavaScript)更改系统的默认打印机,则这不会更改Chrome的默认打印机,因为它固定为上次使用的打印机........我有一个通过JavaScript更改系统设置的解决方案,虽然复杂,但可以高效地工作,现在的问题是:我在哪里可以更改Chrome的默认打印机??!! - Amro

0
如果您正在为将在存在打印机等硬件的环境中运行的产品或Web应用程序执行此操作,那么比仅提供要运行的Web应用程序更好的解决方案可能是使用Chromium嵌入式框架将您的Web应用程序包装为桌面应用程序。像Chromely(类似于Electron,但更轻),EdgeSharp或CEFSharp等。

使用这种技术,您可以编写可以实际枚举网络上的打印机并与硬件通信的代码,同时仍在运行您的Web应用程序,并且您可以将桌面应用程序中构建的新JS API公开到您的Web应用程序中。

然后,为使其智能化,您可以使您的Web应用程序在两个环境中运行,即在桌面应用程序中运行或直接在浏览器中运行。其中,在桌面应用程序中运行具有高级扩展功能。

然后,您可以以多种方式部署该应用程序。例如,在Windows 10+上,您可以拥有公司的私人Windows Store,并将应用程序部署到您的私人Windows Store中,可以通过Windows上的组策略设置安装私人Windows Store。

或者,您可以拥有私人npm存储库并脚本安装/更新您的应用程序。甚至可以使用老派技术,如Microsoft Click Once安装等等。

但是,为您的Web应用程序提供最大的能力的方法是为其提供一个自定义浏览器,并且使用Chromium嵌入式框架非常容易。

在C#中,您可以在不到60秒的时间内启动一个简单的Chrome包装器。

例如,使用.Net 6+和EdgeSharp,您可以将其跨平台运行在Linux、Windows和MacOsx上,并且还可以轻松地将其移植到Xamarin和IOS上,以便在手机、电脑、Mac和平板电脑上拥有这种功能。


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