JavaScript: Raw-Text an Drucker senden - keine Serveranfragen / Methodenaufrufe, kann offline arbeiten, rein clientseitig

8

Meine gründliche Recherche im Internet hat mir einige Ideen gegeben, aber keine davon scheint in meinem speziellen Anwendungsfall richtig zu funktionieren. Hier ist was ich habe:

1) Zebra-Drucker, der ZPL als Drucksprache verwendet;

2) Eine Zeichenfolge in Javascript, die aus 3 ZPL-Formularen zum Drucken von 3 Etiketten besteht.

Unser Systemingenieur hat bereits verifiziert, dass die ZPL-Syntax korrekt ist. Was ich versuche zu erreichen, ist, die Zeichenfolge als Klartext zu senden, damit der Drucker sie als ZPL-Anweisungen zum Drucken von Etiketten akzeptiert. Das Beste, was mir bisher eingefallen ist, sieht so aus:

%Vor%

Vorerst (zu Testzwecken) ist theDiv der Container, in dem ich den ZPL-String platziere. Grundsätzlich habe ich verstanden, dass die beste Lösung darin besteht, ein neues Popup-Fenster zu öffnen, es mit der ZPL-Zeichenfolge zu füllen und thePopupWindow.print () aufzurufen; Der Benutzer wählt dann den Zebra-Drucker aus und drückt 'Drucken'. Das Problem: Es scheint, als ob der Drucker interpretiert, was als HTML-Seite gedruckt wird (wegen des

%Vor%

Tags, die ich sehe, wenn ich beispielsweise das Popup in Chrome untersuche) und den ZPL-Code als einfachen Text ausdrucke, anstatt ihn zu interpretieren und ein Etikett auszudrucken. Ich nehme an, ich brauche etwas wie thePopupWindow.write (), um zu vermeiden, in die Dokumenteigenschaft des Fensters zu schreiben, die die Zeichenfolge offensichtlich in HTML-Code umschließt. Um es zu testen, benutze ich den Generic / Text Only Treiber und speichere was "gedruckt" ist in eine .txt Datei.

In Chrome erhalte ich eine leere Datei.

In Mozilla, wenn ich diese Zeile entferne: mywindow.document.open ('text / plain'); Ich bekomme die ZPL als Zeichen, eins pro Zeile. Wenn ich es hinzufüge, bekomme ich nur ein Datum und eine Zeit, wieder ein Zeichen pro Zeile.

In IE - ich bekomme das (mit oder ohne mywindow.document.open ('text / plain');):

%Vor%

Ich habe verschiedene Lösungen gefunden, aber sie beinhalten die Verwendung von PHP, C #, sogar Java und ich möchte nicht, dass es serverseitig ist, wie im Titel erwähnt. Jede Hilfe wird geschätzt. @ Forgivenson, danke für den Punkt. Nachdem ich deine gelesen hatte, sah ich das kleine "x", auf das ich klicken konnte, um meinen Kommentar zu löschen, also fügte ich den Kommentar in die Frage ein. Ich habe etwas sehr Wichtiges verpasst: Der Drucker ist über USB angeschlossen!

    
user2177283 12.04.2016, 10:33
quelle

5 Antworten

4

Beim Drucken auf einem Zebra-Drucker wird alles vor ^XA und nach ^XZ ignoriert. Die HTML-Tags um die zpl stören nicht.

Sie müssen nur sicherstellen, dass Sie RAW-Text auf dem Drucker ausdrucken.

Verwenden Sie den Windows-Treiber Generic / Text Only für Ihren Zebra-Drucker . Anstelle des Zebratreibers.

  • Der normale Zebra-Treiber: rendert den Druckauftrag auf eine Bitmap
    • Ergebnis: ein langsames Bild Ihres Zpl-Codes.
  • Der Nur-Text-Treiber: sendet den zpl-Code direkt an den Drucker
    • Ergebnis: ein schneller gedruckter Aufkleber, von zpl gerendert auf dem Drucker

Beispiel für jsfiddle oder für gist.run

%Vor%

Getestet in

  • Kante
  • Internet Explorer
  • Firefox

funktioniert nicht in:

  • Chrome
    • Chrome erstellt ein Bild, bevor es an den Druckertreiber gesendet wird ( Ссылка )

Wählen Sie den Treiber "Allgemein / Nur Text" in den Druckereigenschaften:

    
Lakerfield 10.05.2016, 11:23
quelle
2

Wenn Sie dies konsistent durchführen möchten, ohne Popups oder Benutzeraufforderungen zu öffnen, benötigen Sie eine Anwendung, die auf dem Client-PC als Vermittler zwischen dem Javascript Ihrer Anwendung und dem Client-Drucker ausgeführt wird.

Eine populäre Art, dies zu tun, ist über ein Browser-Plugin (NPAPI). Aber dieser Ansatz wird schnell veraltet, da viele Browser begonnen haben, die NPAPI-Unterstützung vollständig zu entfernen ( Chrome , Firefox ).

Ein anderer Ansatz besteht darin, eine kleine Anwendung zu entwickeln, die auf dem PC Ihres Kunden läuft, der nach Socket-Verbindungen lauscht. Ihre Webanwendung sendet die ZPL über eine Verbindung zum Websocket-Server des Clients, der wiederum einen Druckauftrag generiert.

Ein dritter Ansatz - einige Drucker haben eine interne IP-Adresse, die rohe ZPL gesendet werden kann. Wenn Sie Ihre Webanwendung so erstellen, dass ein Benutzer diese IP-Adresse konfigurieren kann, wäre es eine Option, die ZPL an diese Adresse zu senden. Dies funktioniert jedoch nicht, wenn Ihre Benutzer Drucker verwenden, die diese Funktionalität nicht unterstützen.

    
gmacster 13.04.2016 02:29
quelle
1

Das folgende Snippet funktionierte für mich auf Firefox und IE11 , mit ein paar Änderungen an den Eigenschaften des Druckers.

Ich habe diesen Druckeremulator verwendet.

In Chrome erhalte ich beim Drucken über den Druckdialog von Chrome einen Fehler beim Emulator. Beim Verwenden des Systemdialogs wird ein Fehler bezüglich eines Druckfehlers in Chrome angezeigt. STRG + UMSCHALT + P (Verknüpfung zum Überspringen des Chrome-Dialogfelds) Kein Fehler und nichts passiert. All diese Fehler können mit dem Emulator zusammenhängen, aber ich habe keinen echten Drucker, um es zu testen.

In Druckereigenschaften habe ich folgende Optionen eingestellt:

  • Druckauftrag starten: ${
  • Druckauftrag beenden: }$

Wie Sie im folgenden Skript sehen können, ist der ZPL-Code in '${' und '}$'

eingeschlossen %Vor%

JSFiddle

    
lukbl 12.04.2016 22:08
quelle
1

Zebra hat eine Anwendung mit dem Namen (BROWSER PRINT) erstellt, die im April 2016 veröffentlicht wurde. Es scheint sich um einen lokalen JAVA-Dienst zu handeln, der auf Ihrem Computer ausgeführt wird und eine Pseudo-Ruhe-API verfügbar macht. Sie bieten eine Javascript-API, um die Details zu verbergen und die Verwendung zu vereinfachen.

Unterstützt derzeit (ZD500, ZD410, LP2824 +, ZT230, ZT420, QLn320, GX420)

Damit können Sie den Drucker auswählen, wenn mehrere vorhanden sind. Ermöglicht auch eine 2-Wege-Kommunikation, bei der Sie den Drucker nach seinem Status fragen und das Ergebnis erhalten können. Sie haben kürzlich die Unterstützung für Drucker hinzugefügt, die an Ethernet angeschlossen sind, unterstützen jedoch keine Drucker, die über den Windows UNC-Pfad zugeordnet sind.

Ссылка

    
Nathan Smith 30.01.2017 22:51
quelle
0

Sie sehen, das Hauptproblem besteht darin, dass die Zebra-Befehle nur funktionieren, wenn Sie die rohen, unmodifizierten Bytes direkt an den Druckerport senden können; der Browser wird dies leider nicht zulassen.

Sie werden einen Weg brauchen, um einen solchen direkten Zugriff zu bekommen:

  • Eine Möglichkeit wäre eine Browsererweiterung, sodass Sie weniger eingeschränkten Zugriff auf die Hardware haben. Du könntest das über NPAPI tun, aber Chrome unterstützt das nicht, und sowohl Mozilla als auch IE werden das bald nicht mehr unterstützen ;; Chrome kann über die Native Messaging-API direkten Zugriff auf die Hardware ermöglichen. Mozilla kann eine ähnliche Lösung sehr bald unterstützen
  • Eine andere Option wäre die Verwendung einer Java JNLP-Anwendung, um einen solchen Zugriff bereitzustellen, und sie kann von einem Browser aus aufgerufen werden.
Haroldo_OK 14.04.2016 13:34
quelle

Tags und Links