2016-07-21 33 views
0

Nun, ich habe eine webbasierte Anwendung (in Elixir/Phoenix Framework geschrieben). Es ist eine Art POS für das Restaurant. "Silent" Drucken für mehrere Drucker

Das System läuft auf dem rpi 3 mit zwei zugänglichen Druckern. Einer ist lokal über USB, einer ist ein Netzwerkdrucker, der über den WLAN-Router verbunden ist. Beide Drucker wurden mit CUPS eingerichtet und funktionieren gut, wenn ich etwas drucken muss.

Ich verwende den Chromium-Browser und die Schalter "--kiosk --kiosk-printing". Aber hier wird es schwierig.

Während ich das Kiosk-Drucken verwende, wird beim Senden eines Jobs das Dialogfeld zum Drucken (zum Auswählen des Druckers) und der Standarddrucker nicht angezeigt. Ich muss lautlos drucken, wegen der Automatisierung. So müssen die Kellner nicht jedes Mal den Drucker auswählen.

Innerhalb der Web-App habe ich bestimmte divs, die auf einem Drucker gedruckt werden müssen, und andere zu einem anderen. Ich benutze einfache JS zum Drucken, aber ich kann nicht rein mit JS/HTML welchen Drucker für welchen Job zu verwenden. (Ein Drucker Rechnung, zweiten Drucker zu drucken Aufträge in die Küche drucken)

Was ich brauche, ist es, Arbeitsplätze zu verschiedenen Druckern zu senden. Nicht sicher, wie man es macht, aber jede Beratung geschätzt.

Vielen Dank im Voraus!

Update: Gefunden Jsprintsetup Add-on für Firefox, die helfen könnte. Wird jetzt testen.

Update 2: Nach dem Vorschlag von @tkowal konnte ich tun, was ich brauche. Ich habe am Ende einzelne tmp-Dateien erstellt (anstatt div zu senden) und sie zum Drucken gesendet. Hier ist mein Code, wenn Sie interessiert (getestet auf OSX) sind:

# 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 

Antwort

1

Sie System.cmd/3 verwenden können, mit dem Betriebssystem zu interagieren. Es wäre gut, eine Befehlszeilenlösung zu entwickeln, um alles, was Sie brauchen, zu drucken und dann über den Controller in Ihrer Phoenix-Anwendung aufzurufen.

Browser sind Sandboxes und können nicht auf alles in Ihrem Betriebssystem zugreifen, aber Ihr serverseitiger Code sollte in der Lage sein, fast alles zu tun.

+0

Hey, das ist eine interessante Idee! Ich wusste nichts über System.cmd/3, werde jetzt lesen – Ilya

+1

Hey @tkowal, ich habe deine Antwort akzeptiert, da ich in der Lage war zu tun, was ich brauche. Anstatt jedoch direkt System.cmd zu verwenden, habe ich zuerst Befehle erstellt, dann Enum.join und dann |> String.to_char_list |>: os.cmd übergeben, da es mir mehr Flexibilität gab! – Ilya