"Silent" 为多台打印机打印
"Silent" printing for multiple printers
嗯,我有一个基于 Web 的应用程序(用 Elixir/Phoenix 框架编写)。这是餐厅的一种 POS。
系统在 rpi 3 上运行,有两个可访问的打印机。一种是本地通过USB,一种是网络打印机,通过WIFI路由器连接。当我需要打印一些东西时,两台打印机都设置了 CUPS 并且工作正常。
我使用的是 Chromium 浏览器和“--kiosk --kiosk-printing”开关。然而,这就是它变得棘手的地方。
因为我正在使用 kiosk 打印,打印对话框(到 select 打印机)不会出现,并且在发送作业时默认为默认打印机.由于自动化,我需要使用静默打印。所以服务员不需要每次都 select 打印机。
在网络应用程序中,我有某些 div 需要打印到一台打印机,而其他的需要打印到另一台打印机。我正在使用简单的 JS 进行打印,但是我不能仅使用 JS/HTML 指定要使用哪台打印机,用于哪个作业。 (一台打印机打印账单,第二台打印机打印厨房订单)
我需要的是将作业发送到不同的打印机。不知道怎么做,但任何建议表示赞赏。
在此先感谢!
更新: 找到可能有帮助的 Firefox Jsprintsetup 附加组件。现在将测试。
更新 2: 按照@tkowal 的建议,我能够做我需要的。我最终创建了 dividual tmp 文件(而不是发送 div)并发送它们进行打印。这是我的代码,如果您有兴趣(在 OSX 上测试):
# Generating tmp for printing and sending jobs
for item <- order_items do
file_name = Enum.join([item.order_id, "-", item.id, ".txt"], "")
file_create = Enum.join(["touch", file_name], " ")
file_create |> String.to_char_list |> :os.cmd
file_inject = Enum.join(["echo", item.food.name, item.quantity, ">", file_name], " ")
file_inject |> String.to_char_list |> :os.cmd
# Send to print
print_path = Enum.join(["~/Developer/elixir/myApp/", file_name], "")
file_print = Enum.join(["lp", "-d", "HP_LaserJet_3050", print_path], " ")
file_print |> String.to_char_list |> :os.cmd
# Remove tmp file
file_remove = Enum.join(["rm", file_name], " ")
file_remove |> String.to_char_list |> :os.cmd
end
您可以使用System.cmd/3
与操作系统交互。最好想出一个命令行解决方案来打印您需要的任何内容,然后通过 Phoenix 应用程序中的控制器调用它。
浏览器是沙盒,无法访问您操作系统中的所有内容,但您的服务器端代码应该能够执行几乎所有操作。
嗯,我有一个基于 Web 的应用程序(用 Elixir/Phoenix 框架编写)。这是餐厅的一种 POS。
系统在 rpi 3 上运行,有两个可访问的打印机。一种是本地通过USB,一种是网络打印机,通过WIFI路由器连接。当我需要打印一些东西时,两台打印机都设置了 CUPS 并且工作正常。 我使用的是 Chromium 浏览器和“--kiosk --kiosk-printing”开关。然而,这就是它变得棘手的地方。 因为我正在使用 kiosk 打印,打印对话框(到 select 打印机)不会出现,并且在发送作业时默认为默认打印机.由于自动化,我需要使用静默打印。所以服务员不需要每次都 select 打印机。 在网络应用程序中,我有某些 div 需要打印到一台打印机,而其他的需要打印到另一台打印机。我正在使用简单的 JS 进行打印,但是我不能仅使用 JS/HTML 指定要使用哪台打印机,用于哪个作业。 (一台打印机打印账单,第二台打印机打印厨房订单)我需要的是将作业发送到不同的打印机。不知道怎么做,但任何建议表示赞赏。
在此先感谢! 更新: 找到可能有帮助的 Firefox Jsprintsetup 附加组件。现在将测试。 更新 2: 按照@tkowal 的建议,我能够做我需要的。我最终创建了 dividual tmp 文件(而不是发送 div)并发送它们进行打印。这是我的代码,如果您有兴趣(在 OSX 上测试): # Generating tmp for printing and sending jobs
for item <- order_items do
file_name = Enum.join([item.order_id, "-", item.id, ".txt"], "")
file_create = Enum.join(["touch", file_name], " ")
file_create |> String.to_char_list |> :os.cmd
file_inject = Enum.join(["echo", item.food.name, item.quantity, ">", file_name], " ")
file_inject |> String.to_char_list |> :os.cmd
# Send to print
print_path = Enum.join(["~/Developer/elixir/myApp/", file_name], "")
file_print = Enum.join(["lp", "-d", "HP_LaserJet_3050", print_path], " ")
file_print |> String.to_char_list |> :os.cmd
# Remove tmp file
file_remove = Enum.join(["rm", file_name], " ")
file_remove |> String.to_char_list |> :os.cmd
end
您可以使用System.cmd/3
与操作系统交互。最好想出一个命令行解决方案来打印您需要的任何内容,然后通过 Phoenix 应用程序中的控制器调用它。
浏览器是沙盒,无法访问您操作系统中的所有内容,但您的服务器端代码应该能够执行几乎所有操作。