it-swarm.com.de

JavaScript: Senden Sie unformatierten Text an den Drucker - keine Serveranforderungen/Methodenaufrufe, die offline arbeiten können, rein clientseitig

Meine gründliche Recherche im Internet lieferte mir ein paar Ideen, aber in meinem Anwendungsfall scheint keine davon richtig zu funktionieren. Folgendes habe ich:

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

2) Eine Zeichenfolge in Javascript, die aus 3 ZPL-Formularen besteht, um 3 Etiketten zu drucken. 

Unser Systemingenieur hat bereits bestätigt, dass die ZPL-Syntax korrekt ist. Was ich versuche, ist, den String als Klartext für den Drucker zu senden, damit er als ZPL-Anweisung zum Drucken von Etiketten akzeptiert wird Ich habe mir bisher so ausgesehen:

var mywindow = window.open('', 'Printing', 'width=800,height=600');
//mywindow.write("testDirectWrite"); // not working
mywindow.document.open('text/plain');
////mywindow.document.write('<html><head><title>Printing</title><meta charset="ISO-8859-1">');
///*optional stylesheet*/ //mywindow.document.write('<link rel="stylesheet" href="main.css" type="text/css" />');
////mywindow.document.write('</head><body>');
var theDiv = $(".test-printirane-po-usb");
var printContents = theDiv[0].innerText;
mywindow.document.write(printContents);
////mywindow.document.write('</body></html>');

//mywindow.document.close(); // necessary for IE >= 10
//mywindow.focus(); // necessary for IE >= 10

//mywindow.print();
//mywindow.close();

Zur Zeit (zu Testzwecken) ist theDiv der Container, in dem die ZPL-Zeichenfolge platziert wird. Grundsätzlich habe ich verstanden, dass die beste Lösung darin besteht, ein neues Popup-Fenster zu öffnen, die ZPL-Zeichenfolge einzugeben und thePopupWindow.print () aufzurufen. Der Benutzer wählt dann den Zebra-Drucker aus und klickt auf "Drucken" . Das Problem: Es scheint, als würde der Drucker das, was gedruckt wird, als HTML-Seite interpretieren (wegen der

<html><head></head><body>theZPLString comes here</body></html>

tags, die ich sehe, wenn ich beispielsweise das Popup in Chrome inspiziere) und den ZPL-Code als einfachen Text druckt, anstatt ihn zu interpretieren und ein Etikett zu drucken. Ich nehme an, ich brauche so etwas wie thePopupWindow.write (), um zu vermeiden, dass in die document -Eigenschaft des Fensters geschrieben wird, die den String offensichtlich in HTML-Code einschließt. Um dies zu testen, verwende ich den Generic/Text Only-Treiber und speichere Was wird in eine TXT-Datei "gedruckt"?.

In Chrome bekomme ich eine leere Datei.

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

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

Page 1 o



    ^XA^PW400^LL37^





          12.4.2016

Ich habe verschiedene Lösungen gefunden, aber es geht um die Verwendung von PHP, c #, sogar Java, und ich möchte nicht, dass es serverseitig ist, wie im Titel erwähnt. Jede Hilfe wird dankbar sein. _. @ Forgivenson, danke für den Punkt. Nachdem ich Ihre gelesen hatte, sah ich das kleine "x", auf das ich klicken kann, um meinen Kommentar zu löschen. Ich fügte den Kommentar in die Frage ein: Ich habe etwas sehr wichtiges übersehen: Der Drucker ist über einen USB-Anschluss angeschlossen!

12
user2177283

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 drucken.

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

  • Der normale Zebra-Treiber: Rendert den Druckauftrag in eine Bitmap
    • ergebnis: ein langsames gedrucktes Bild Ihres zpl-Codes.
  • Der Nur-Text-Treiber: Sendet den ZPL-Code direkt an den Drucker
    • ergebnis: ein schnell gedruckter Aufkleber, der auf dem Drucker dargestellt wird

Beispiel auf jsfiddle oder auf Gist.run

function printZpl(zpl) {
  var printWindow = window.open();
  printWindow.document.open('text/plain')
  printWindow.document.write(zpl);
  printWindow.document.close();
  printWindow.focus();
  printWindow.print();
  printWindow.close();
}

Getestet in

  • Kante
  • Internet Explorer
  • Feuerfuchs

Funktioniert nicht in:


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

 Zebra printer - Generic / Text Only driver

11
Lakerfield

Das folgende Snippet arbeitete für mich an Firefox und IE11, mit ein paar Änderungen an den Druckereigenschaften.

Ich habe this printer emulator verwendet.

In Chrome erhalte ich beim Drucken im Druckdialog von Chrome eine Fehlermeldung vom Emulator. Beim Verwenden des Systemdialogfelds wird ein Fehler beim Drucken aus Chrome angezeigt. STRG + UMSCHALT + P (Abkürzung zum Überspringen des Chrome-Dialogfelds) Kein Fehler und nichts passiert .. Alle diese Fehler können mit dem Emulator zusammenhängen, aber ich habe keinen echten Drucker, um es zu testen.

In Druckereigenschaften stelle ich folgende Optionen ein:

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

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

<script type="text/javascript">
  function openWin() {
    var printWindow = window.open();
    printWindow.document.open('text/plain')
    printWindow.document.write('${^XA^FO50,100^BXN,10,200^FDYourTextHere^FS^XZ}$');
    printWindow.document.close();
    printWindow.focus();
    printWindow.print();
  }
</script>
<input type="button" value="Print code" onclick="openWin()" />

JSFiddle

2
lukbl

Wenn Sie dies konsequent tun möchten, ohne Popups oder Benutzeraufforderungen zu öffnen, benötigen Sie eine auf dem Client-PC ausgeführte Anwendung, die als Vermittler zwischen dem Javascript Ihrer Anwendung und dem Drucker des Clients fungiert.

Eine beliebte Methode ist dies über ein Browser-Plugin (NPAPI). Dieser Ansatz wird jedoch schnell veraltet, da viele Browser damit 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 Client-PC ausgeführt wird und auf Websocket-Verbindungen wartet. Ihre Webanwendung sendet die ZPL über eine Verbindung an den Websocket-Server des Clients, der wiederum einen Druckauftrag generiert.

Ein dritter Ansatz: Einige Drucker haben eine interne IP-Adresse, die als unformatierte ZPL gesendet werden kann. Wenn Sie Ihre Webanwendung so erstellen, dass ein Benutzer diese IP-Adresse konfigurieren kann, können Sie die ZPL an diese Adresse senden. Dies funktioniert jedoch nicht, wenn Ihre Benutzer Drucker verwenden, die diese Funktion nicht unterstützen.

2
gmacster

Zebra hat eine Anwendung mit dem Namen BROWSER PRINT erstellt, die im April 2016 veröffentlicht wurde .. Es scheint ein lokaler Java-Dienst zu sein, der auf Ihrem Computer ausgeführt wird und eine Pseudo-Rest-API freigibt. Sie bieten eine Javascript-API, um die Details auszublenden und die Verwendung zu vereinfachen.

Derzeit unterstützt (ZD500, ZD410, LP2824 +, ZT230, ZT420, QLn320, GX420)

Sie können den Drucker auswählen, wenn mehrere vorhanden sind . Ermöglicht auch die bidirektionale Kommunikation, bei der Sie den Status des Druckers abfragen und das Ergebnis erhalten können. Vor kurzem wurde Unterstützung für Drucker hinzugefügt, die an Ethernet angeschlossen sind. Drucker, die über den Windows-UNC-Pfad zugeordnet werden, werden jedoch nicht unterstützt. 

https://www.zebra.com/us/de/products/software/barcode-printers/link-os/browser-print.html

1
Nathan Smith

Das Hauptproblem hier ist, dass die Zebra-Befehle nur funktionieren, wenn Sie die rohen, unveränderten Bytes direkt an den Druckerport senden können. Der Browser lässt das leider nicht zu. 

Sie benötigen einen Weg, um einen solchen direkten Zugang zu erhalten:

  • Eine Möglichkeit wäre die Erweiterung eines Browsers, sodass Sie weniger eingeschränkten Zugriff auf die Hardware haben. Sie könnten dies über NPAPI tun, aber Chrome unterstützt das nicht, und Mozilla und IE werden das bald nicht mehr unterstützen ;; Chrome kann direkten Zugriff auf die Hardware über die Native Messaging-API ermöglichen. Mozilla unterstützt möglicherweise eine ähnliche Lösung sehr bald;
  • 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.
0
Haroldo_OK