2016-04-12 39 views
8

La mia ricerca approfondita sul web mi ha fornito un paio di idee, ma nessuna sembra funzionare correttamente nel mio particolare caso d'uso. Ecco cosa ho:JavaScript: invia testo non elaborato alla stampante - nessun server richiede/chiama metodo, in grado di funzionare offline, puramente clientide

1) stampante Zebra, che utilizza ZPL come linguaggio di stampa;

2) Una stringa in javascript che consiste di 3 moduli ZPL per la stampa di 3 etichette.

Il nostro ingegnere di sistema ha già verificato che la sintassi ZPL è corretta. Quello che sto cercando di ottenere è inviare la stringa come testo normale affinché la stampante possa accettarla come istruzioni ZPL per stampare etichette. Il migliore che ho elaborato finora assomiglia a questo:

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

Per ora (a scopo di test), theDiv è il contenitore in cui ho posto la stringa ZPL. Fondamentalmente, ho capito, che la soluzione migliore è aprire una nuova finestra popup, riempirla con la stringa ZPL e chiamare thePopupWindow.print(); L'utente seleziona quindi la stampante zebra e fa clic su "Stampa". Il problema: sembra che la stampante interpreta ciò che viene stampato come una pagina HTML (a causa delle

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

tag, che vedo, quando ho ispezionare il popup in Chrome, per esempio) e stampa il Codice ZPL come testo normale, piuttosto che interpretarlo e stampare un'etichetta. Suppongo di aver bisogno di qualcosa come thePopupWindow.write() per evitare di scrivere sulla proprietà del documento della finestra, che ovviamente avvolge la stringa nel codice html. Per testarlo, utilizzo il driver Generico/Solo testo e salvo ciò che viene "stampato" in un file .txt.

In Chrome, ottengo un file vuoto.

In Mozilla, quando rimuovo questa riga: mywindow.document.open ('text/plain'); Ricevo lo ZPL come caratteri, uno per riga. Quando lo aggiungo, ottengo solo una data e un'ora, sempre un carattere per riga.

In IE - ho questa (con o senza mywindow.document.open ('text/plain');):

Page 1 o 



    ^XA^PW400^LL37^ 





      12.4.2016 

ho trovato diverse soluzioni, ma coinvolgono utilizzando PHP, C#, anche java e non voglio che sia lato server, come menzionato nel titolo. Qualsiasi aiuto sarà apprezzato. @forgivenson, grazie per il punto. Dopo aver letto il tuo, ho visto la piccola 'x', che posso cliccare per cancellare il mio commento, così ho aggiunto il commento all'interno della domanda. Ho perso qualcosa di molto importante: la stampante è collegata tramite porta USB!

+0

FYI, è possibile modificare la tua domanda per aggiungere queste informazioni. – forgivenson

+0

Interessante domanda. Quando ho affrontato un problema simile, ho dovuto creare un applet Java firmato la cui unica funzione era quella di inviare byte alla porta della stampante. Un'altra opzione potrebbe essere quella di scrivere un'estensione specifica per il browser. Dubito che ci sia un modo per inviare byte direttamente alla stampante usando solo javascript, a causa di problemi di sicurezza. –

+0

Vedete, il problema principale qui è che i comandi Zebra funzioneranno solo se è possibile inviare i byte non modificati direttamente alla porta della stampante; il browser non ti permetterà di farlo, sfortunatamente Avrai bisogno di un modo per ottenere tale accesso diretto, in un modo sarebbe attraverso un'estensione del browser, quindi avresti accesso meno limitato all'hardware; un'altra opzione sarebbe quella di utilizzare un applet Java o un'applicazione JNLP per fornire tale accesso. –

risposta

4

Quando si stampa a una stampante Zebra, ogni cosa prima e dopo ^XA^XZ viene ignorato. I tag html attorno allo zpl non interferiscono.

L'unica cosa che è necessario assicurarsi è che si stampa il testo RAW sulla stampante.

Utilizzare il driver build in windows Generic/Text Only per la stampante Zebra. Invece del driver zebra.

  • Il conducente zebra normale: rende il lavoro di stampa in una bitmap
    • risultato: un'immagine lenta stampata del vostro codice ZPL.
  • Il testo unico driver: invia il codice ZPL direttamente alla stampante
    • risultato: un adesivo veloce stampata, da ZPL resi sulla stampante

Esempio su jsfiddle o su 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(); 
} 

testato in

  • bordo
  • Internet Explorer
  • Firefox

Non funziona in:


Selezionare il generico/solo testo driver nelle proprietà della stampante:

Zebra printer - Generic/Text Only driver

+0

+1 Grazie per la tua utile risposta. Esattamente come hai detto, ora siamo in grado di stampare etichette usando una stampante Zebra e il driver Generico/Solo testo in Internet Explorer e Firefox. Chrome non stampa quando apriamo la finestra di dialogo Stampa di sistema (ctrl + maiusc + p) e seleziona il driver Generico/Solo testo e visualizza un avviso di errore. Ora stiamo avendo un problema relativo alla codifica. Tutti i caratteri cirillici vengono trasformati in un '.' (punto) carattere. Questo è legato al driver generico/solo testo, perché anche quando stampo sth dal blocco note in cirillico, otteniamo un numero di punti. Qualche idea su questo? – user2177283

+0

Felice di sapere che ha funzionato per te. Dai un'occhiata alla seguente risposta, su come evitare errori di codifica con il comando^FH: http://stackoverflow.com/a/13041688 – Lakerfield

+0

Grazie per aver suggerito anche il comando^FH! In realtà mi sono imbattuto in questo stesso thread quando cercavo una soluzione al problema di codifica. Nei documenti ZPL di Zebra ho trovato il comando^CI e ho provato con^CI33 a fare il trucco. Non sono sicuro di dove dovrei metterlo. L'ho appena inserito prima dei campi (prima del primo^FD nella ZPL). – user2177283

1

seguente frammento ha lavorato per me su Firefox e IE11, con un piccolo cambiamento alle proprietà della stampante.

Stavo usando l'emulatore di stampante this.

In Chrome Ottengo errore dall'emulatore quando si stampa dalla finestra di dialogo Stampa di Chrome. L'utilizzo della finestra di dialogo del sistema fornisce un errore sulla stampa non riuscita da Chrome. CTRL + MAIUSC + P (collegamento per saltare la finestra di dialogo di Chrome) nessun errore e non succede nulla. Tutti questi errori possono essere correlati all'emulatore, ma non ho una vera stampante per testarlo.

In Proprietà della stampante ho impostato seguenti opzioni:

  • cominciare il processo di stampa: ${
  • Fine lavoro di stampa: }$

Come si può vedere nel seguente script di codice ZPL viene avvolto in '${' e '}$'

<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

+0

Grazie, ma, sfortunatamente, non ha funzionato questa volta. Sono andato dal nostro ingegnere di servizio e abbiamo entrambi testato la soluzione. Ha impostato le proprietà della stampante per Begin & End Print Job. Questa volta, otteniamo la stringa '$ {^ XA^FO50,100^BXN, 10,200^FDYourTextHere^FS^XZ} $' stampata, piuttosto che una vera etichetta. Forse, ha qualcosa a che fare con la codifica della nuova finestra, che contiene la ZPL e dove chiamo theWindow.print(); printWindow.document.open ('text/plain') non ha aiutato neanche. Vedo, che ne ho bisogno come testo grezzo, in qualche modo. – user2177283

2

Se si vuole realizzare questo in modo coerente senza coinvolgere l'apertura di popup o richieste degli utenti, che si sta per bisogno di un'applicazione in esecuzione sul PC client di agire come mediatore tra la stampante javascript e il cliente del dell'applicazione .

Un modo popolare per farlo è tramite un plug-in del browser (NPAPI). Ma questo approccio sta diventando rapidamente obsoleto poiché molti browser hanno iniziato a rimuovere completamente il supporto NPAPI (Chrome, Firefox).

Un altro approccio è quello di sviluppare una piccola applicazione che gira sul PC del tuo cliente che ascolta le connessioni web socket. La tua applicazione web invierà la ZPL attraverso una connessione al server websocket del cliente, che a sua volta genererà un lavoro di stampa.

Un terzo approccio: alcune stampanti hanno un indirizzo IP interno che può essere inviato come ZPL non elaborato. Se costruisci la tua applicazione web in modo che un utente possa configurare questo indirizzo IP, sarebbe un'opzione per inviare lo ZPL a quell'indirizzo. Tuttavia, questo non funzionerà se gli utenti utilizzano stampanti che non supportano questa funzionalità.

0

Si vede, il problema principale qui è che i comandi Zebra funzioneranno solo se è possibile inviare i byte non modificati direttamente alla porta della stampante; il browser non ti permetterà di farlo, sfortunatamente

Avrete bisogno di un modo per ottenere tale acess diretto:

  • Un modo potrebbe essere attraverso un'estensione del browser, in modo che ci ha accesso meno limitato all'hardware; puoi farlo tramite NPAPI, ma Chrome non lo supporta, e sia Mozilla che IE smetteranno di supportarlo a breve; Chrome può consentire l'accesso diretto all'hardware tramite lo Native Messaging API; Mozilla potrebbe supportare un similar solution molto presto;
  • Un'altra opzione consiste nell'utilizzare un'applicazione JNLP Java per fornire tale accesso e può essere richiamata da un browser.
1

Zebra creato un'applicazione denominata (BROWSER PRINT) rilasciata nell'aprile 2016. Sembra essere un servizio JAVA locale che viene eseguito sul computer ed espone una ps eudo rest api. Forniscono una API javascript per nascondere i dettagli e semplificare l'utilizzo.

attualmente supporta (ZD500, ZD410, LP2824 +, ZT230, ZT420, QLn320, GX420)

Esso consente di selezionare la stampante se ci sono più. Consente inoltre la comunicazione bidirezionale in cui è possibile chiedere alla stampante il suo stato e ottenere il risultato. Recentemente hanno aggiunto il supporto per le stampanti connesse a Ethernet ma non supportano le stampanti mappate tramite il percorso UNC di Windows.

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