web-dev-qa-db-fra.com

JavaScript: envoi de texte brut à l'imprimante - pas de demandes de serveur/d'appels de méthode, capable de travailler hors ligne, uniquement côté client

Mes recherches approfondies sur le Web m'ont fourni quelques idées, mais aucune ne semble fonctionner correctement dans mon cas d'utilisation particulier. Voici ce que j'ai

1) l’imprimante Zebra, qui utilise ZPL comme langage d’impression;

2) Une chaîne en javascript composée de 3 formulaires ZPL pour l’impression de 3 étiquettes. 

Notre ingénieur système a déjà vérifié que la syntaxe ZPL est tout à fait correcte… .. Ce que j'essaie de faire est d’envoyer la chaîne sous forme de texte brut à l’imprimante pour l’accepter comme instruction ZPL d’imprimer des étiquettes . Je suis venu avec jusqu'ici ressemble à ceci:

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();

Pour l'instant (à des fins de test), theDiv est le conteneur dans lequel je place la chaîne ZPL. J'ai compris en gros que la meilleure solution consiste à ouvrir une nouvelle fenêtre contextuelle, à la remplir avec la chaîne ZPL et à appeler thePopupWindow.print (); L'utilisateur sélectionne ensuite l'imprimante zébrée et clique sur 'Imprimer' . Le problème: il semble que l'imprimante interprète ce qui est imprimé comme une page html (en raison de la

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

balises, que je vois, lorsque j’inspecte la fenêtre contextuelle dans Chrome, par exemple) et affiche le code ZPL en tant que texte brut, plutôt que de l’interpréter et d’imprimer une étiquette. Je suppose que j'ai besoin de quelque chose comme thePopupWindow.write () pour éviter d'écrire dans la propriété document de la fenêtre, qui enveloppe évidemment la chaîne dans du code html . Pour le tester, j'utilise le pilote Generic/Text Only et enregistre ce qui est "imprimé" dans un fichier .txt.

Dans Chrome, je reçois un fichier vide.

Dans Mozilla, lorsque je supprime cette ligne: mywindow.document.open ('text/plain'); Je reçois le ZPL en tant que caractères, un par ligne. Quand je l'ajoute, je n'ai qu'une date et une heure, encore un caractère par ligne.

Dans IE - Je reçois ceci (avec ou sans mywindow.document.open ('text/plain');):

Page 1 o



    ^XA^PW400^LL37^





          12.4.2016

J'ai trouvé diverses solutions, mais elles impliquent l'utilisation de php, c #, même de Java et je ne veux pas que ce soit côté serveur, comme mentionné dans le titre . Toute aide sera appréciée . @ Pardonne, merci pour le point. Après avoir lu le vôtre, j’ai vu le petit «x» sur lequel je pouvais cliquer pour supprimer mon commentaire, j’ai donc ajouté le commentaire dans la question… .. Il me manquait quelque chose de très important: l’imprimante est connectée via un port USB!

12
user2177283

Lors de l'impression sur une imprimante Zebra, tout ce qui précède ^XA et après ^XZ est ignoré. Les balises html autour du zpl n'interfèrent pas.

La seule chose à faire est d’imprimer du texte RAW sur l’imprimante.

Utilisez le pilote windows Generic / Text Only intégré à votre imprimante Zebra. Au lieu du pilote de zèbre. 

  • Le pilote zebra normal: restitue le travail d'impression en bitmap
    • résultat: une image imprimée lente de votre code zpl.
  • Le pilote texte uniquement: envoie le code zpl directement à l’imprimante
    • résultat: un autocollant rapide imprimé, de zpl rendu sur l'imprimante

Exemple sur jsfiddle ou sur 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();
}

Testé dans

  • Bord
  • Internet Explorer
  • Firefox

Ne travaille pas dans:


Sélectionnez le pilote générique/texte uniquement dans les propriétés de votre imprimante:

 Zebra printer - Generic / Text Only driver

11
Lakerfield

L'extrait suivant a fonctionné pour moi sur Firefox et IE11, avec un léger changement dans les propriétés de l'imprimante.

J'utilisais this émulateur d'imprimante.

Dans Chrome, une erreur de l'émulateur s'affiche lorsque j'imprime depuis le dialogue Imprimer de Chrome. L'utilisation de la boîte de dialogue système génère une erreur concernant l'échec de l'impression depuis Chrome. CTRL + SHIFT + P (raccourci pour ignorer la boîte de dialogue Chrome) aucune erreur et rien ne se produit . Toutes ces erreurs peuvent être liées à l'émulateur, mais je n'ai pas de véritable imprimante pour le tester.

Dans Propriétés de l'imprimante J'ai défini les options suivantes:

  • Commencer le travail d'impression: ${
  • Fin du travail d'impression: }$

Comme vous pouvez le voir dans le script ci-dessous, le code ZPL est encapsulé dans '${' et '}$'

<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

Si vous souhaitez accomplir cela de manière cohérente sans impliquer l'ouverture de fenêtres contextuelles ou d'invites utilisateur, vous allez avoir besoin d'une application s'exécutant sur le PC client pour servir de médiateur entre le javascript de votre application et l'imprimante du client.

Un moyen populaire de le faire consiste à utiliser un plugin de navigateur (NPAPI). Mais cette approche devient rapidement obsolète, car de nombreux navigateurs ont commencé à supprimer complètement le support NPAPI ( Chrome , Firefox ).

Une autre approche consiste à développer une petite application qui s'exécute sur le PC de votre client et qui écoute les connexions Websocket. Votre application Web enverra le ZPL via une connexion au serveur Websocket du client, qui générera un travail d'impression.

Une troisième approche - certaines imprimantes ont une adresse IP interne qui peut être envoyée brute au format ZPL. Si vous créez votre application Web de sorte qu'un utilisateur puisse configurer cette adresse IP, vous pourrez envoyer le fichier ZPL à cette adresse. Toutefois, cela ne fonctionnera pas si vos utilisateurs utilisent des imprimantes qui ne prennent pas en charge cette fonctionnalité.

2
gmacster

Zebra a créé une application appelée (BROWSER PRINT) parue en avril 2016 . Il semble s'agir d'un service Java local qui s'exécute sur votre ordinateur et expose une api de pseudo repos. Ils fournissent une API javascript pour masquer les détails et simplifier l'utilisation.

Prend actuellement en charge (ZD500, ZD410, LP2824 +, ZT230, ZT420, QLn320, GX420)

Il vous permet de sélectionner l'imprimante s'il y a plusieurs . Permet également une communication à double sens où vous pouvez demander à l'imprimante son statut et obtenir le résultat. Ils ont récemment ajouté la prise en charge des imprimantes connectées à Ethernet mais ne prennent pas en charge les imprimantes mappées via le chemin Windows UNC. 

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

1
Nathan Smith

Vous voyez, le principal problème ici est que les commandes Zebra ne fonctionneront que si vous pouvez envoyer les octets bruts non modifiés directement au port de l'imprimante; le navigateur ne vous permettra pas de le faire, malheureusement. 

Vous aurez besoin d'un moyen d'obtenir un tel accès direct:

  • L'une des méthodes consiste à utiliser une extension de navigateur afin de limiter l'accès au matériel. vous pouvez le faire via NPAPI, mais Chrome ne le prend pas en charge et Mozilla et IE cesseront de le faire très prochainement ;; Chrome peut autoriser un accès direct au matériel via la API de messagerie native ; Mozilla pourrait prendre en charge une solution similaire très bientôt;
  • Une autre option consisterait à utiliser une application Java JNLP pour fournir un tel accès. Cette application peut être appelée à partir d'un navigateur.
0
Haroldo_OK