├── .gitattributes ├── .gitignore ├── Impresora.js ├── Impresora_ie11.js ├── README.md ├── Ticket impreso con JavaScript puro.jpg ├── ejemplos ├── barcode │ ├── index.html │ └── script.js ├── establecer-impresora-silenciosa │ ├── index.html │ └── script.js ├── imprimir-con-nombre-ie11 │ ├── index.html │ └── script.js ├── imprimir-con-nombre-y-host │ ├── index.html │ └── script.js ├── imprimir-con-nombre │ ├── index.html │ └── script.js ├── obtener-impresoras-remotas │ ├── index.html │ └── script.js ├── qr │ ├── index.html │ └── script.js ├── simple-ie11 │ ├── index.html │ └── script.js ├── simple │ ├── index.html │ └── script.js └── ticket │ ├── index.html │ └── script.js ├── en ├── examples │ ├── simple │ │ ├── index.html │ │ └── script.js │ └── ticket │ │ ├── index.html │ │ └── script.js └── index.html └── index.html /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /Impresora.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Una clase para interactuar con el plugin 3 | * 4 | * @author parzibyte 5 | * @see https://parzibyte.me/blog 6 | */ 7 | const C = { 8 | AccionWrite: "write", 9 | AccionCut: "cut", 10 | AccionCash: "cash", 11 | AccionCutPartial: "cutpartial", 12 | AccionAlign: "align", 13 | AccionFontSize: "fontsize", 14 | AccionFont: "font", 15 | AccionEmphasize: "emphasize", 16 | AccionFeed: "feed", 17 | AccionQr: "qr", 18 | AlineacionCentro: "center", 19 | AlineacionDerecha: "right", 20 | AlineacionIzquierda: "left", 21 | FuenteA: "A", 22 | FuenteB: "B", 23 | AccionBarcode128: "barcode128", 24 | AccionBarcode39: "barcode39", 25 | AccionBarcode93: "barcode93", 26 | AccionBarcodeEAN: "barcodeEAN", 27 | AccionBarcodeTwoOfFiveSinInterleaved: "barcodeTwoOfFive", 28 | AccionBarcodeTwoOfFiveInterleaved: "barcodeTwoOfFiveInterleaved", 29 | AccionBarcodeCodabar: "barcodeCodabar", 30 | AccionBarcodeUPCA: "barcodeUPCA", 31 | AccionBarcodeUPCE: "barcodeUPCE", 32 | Medida80: 80, 33 | Medida100: 100, 34 | Medida156: 156, 35 | Medida200: 200, 36 | Medida300: 300, 37 | Medida350: 350, 38 | }; 39 | 40 | const URL_PLUGIN = "http://localhost:8000"; 41 | 42 | class OperacionTicket { 43 | constructor(accion, datos) { 44 | this.accion = accion + ""; 45 | this.datos = datos + ""; 46 | } 47 | } 48 | class Impresora { 49 | constructor(ruta) { 50 | if (!ruta) ruta = URL_PLUGIN; 51 | this.ruta = ruta; 52 | this.operaciones = []; 53 | } 54 | 55 | static setImpresora(nombreImpresora, ruta) { 56 | if (ruta) URL_PLUGIN = ruta; 57 | return fetch(URL_PLUGIN + "/impresora", { 58 | method: "PUT", 59 | body: JSON.stringify(nombreImpresora), 60 | }) 61 | .then(r => r.json()) 62 | .then(respuestaDecodificada => respuestaDecodificada === nombreImpresora); 63 | } 64 | static setImpresoraSilencioso(nombreImpresora, ruta) { 65 | if (ruta) URL_PLUGIN = ruta; 66 | return fetch(URL_PLUGIN + "/impresora_silencioso", { 67 | method: "PUT", 68 | body: JSON.stringify(nombreImpresora), 69 | }) 70 | .then(r => r.json()) 71 | .then(respuestaDecodificada => respuestaDecodificada === nombreImpresora); 72 | } 73 | 74 | 75 | static getImpresora(ruta) { 76 | if (ruta) URL_PLUGIN = ruta; 77 | return fetch(URL_PLUGIN + "/impresora") 78 | .then(r => r.json()); 79 | } 80 | 81 | static getImpresoras(ruta) { 82 | if (ruta) URL_PLUGIN = ruta; 83 | return fetch(URL_PLUGIN + "/impresoras") 84 | .then(r => r.json()); 85 | } 86 | 87 | static getImpresorasRemotas(ip) { 88 | return fetch(URL_PLUGIN + "/impresoras_remotas?ip=" + ip) 89 | .then(r => r.json()); 90 | } 91 | 92 | cut() { 93 | this.operaciones.push(new OperacionTicket(C.AccionCut, "")); 94 | } 95 | 96 | cash() { 97 | this.operaciones.push(new OperacionTicket(C.AccionCash, "")); 98 | } 99 | 100 | cutPartial() { 101 | this.operaciones.push(new OperacionTicket(C.AccionCutPartial, "")); 102 | } 103 | 104 | setFontSize(a, b) { 105 | this.operaciones.push(new OperacionTicket(C.AccionFontSize, `${a},${b}`)); 106 | } 107 | 108 | setFont(font) { 109 | if (font !== C.FuenteA && font !== C.FuenteB) throw Error("Fuente inválida"); 110 | this.operaciones.push(new OperacionTicket(C.AccionFont, font)); 111 | } 112 | setEmphasize(val) { 113 | if (isNaN(parseInt(val)) || parseInt(val) < 0) throw Error("Valor inválido"); 114 | this.operaciones.push(new OperacionTicket(C.AccionEmphasize, val)); 115 | } 116 | setAlign(align) { 117 | if (align !== C.AlineacionCentro && align !== C.AlineacionDerecha && align !== C.AlineacionIzquierda) { 118 | throw Error(`Alineación ${align} inválida`); 119 | } 120 | this.operaciones.push(new OperacionTicket(C.AccionAlign, align)); 121 | } 122 | 123 | write(text) { 124 | this.operaciones.push(new OperacionTicket(C.AccionWrite, text)); 125 | } 126 | 127 | feed(n) { 128 | if (!parseInt(n) || parseInt(n) < 0) { 129 | throw Error("Valor para feed inválido"); 130 | } 131 | this.operaciones.push(new OperacionTicket(C.AccionFeed, n)); 132 | } 133 | 134 | end() { 135 | return fetch(this.ruta + "/imprimir", { 136 | method: "POST", 137 | body: JSON.stringify(this.operaciones), 138 | }) 139 | .then(r => r.json()); 140 | } 141 | 142 | imprimirEnImpresora(nombreImpresora) { 143 | const payload = { 144 | operaciones: this.operaciones, 145 | impresora: nombreImpresora, 146 | }; 147 | return fetch(this.ruta + "/imprimir_en", { 148 | method: "POST", 149 | body: JSON.stringify(payload), 150 | }) 151 | .then(r => r.json()); 152 | } 153 | 154 | qr(contenido) { 155 | this.operaciones.push(new OperacionTicket(C.AccionQr, contenido)); 156 | } 157 | 158 | validarMedida(medida) { 159 | medida = parseInt(medida); 160 | if (medida !== C.Medida80 && 161 | medida !== C.Medida100 && 162 | medida !== C.Medida156 && 163 | medida !== C.Medida200 && 164 | medida !== C.Medida300 && 165 | medida !== C.Medida350) { 166 | throw Error("Valor para medida del barcode inválido"); 167 | } 168 | } 169 | 170 | validarTipo(tipo) { 171 | if ( 172 | [C.AccionBarcode128, 173 | C.AccionBarcode39, 174 | C.AccionBarcode93, 175 | C.AccionBarcodeEAN, 176 | C.AccionBarcodeTwoOfFiveInterleaved, 177 | C.AccionBarcodeTwoOfFiveSinInterleaved, 178 | C.AccionBarcodeCodabar, 179 | C.AccionBarcodeUPCA, 180 | C.AccionBarcodeUPCE, 181 | ] 182 | .indexOf(tipo) === -1 183 | ) throw Error("Tipo de código de barras no soportado"); 184 | } 185 | 186 | barcode(contenido, medida, tipo) { 187 | this.validarMedida(medida); 188 | this.validarTipo(tipo); 189 | let payload = contenido.concat(",").concat(medida.toString()); 190 | this.operaciones.push(new OperacionTicket(tipo, payload)); 191 | } 192 | imprimirEnImpresoraConNombreEIp(nombreImpresora, ip) { 193 | const payload = { 194 | operaciones: this.operaciones, 195 | impresora: nombreImpresora, 196 | ip: ip, 197 | }; 198 | return fetch(this.ruta + "/imprimir_y_reenviar", { 199 | method: "POST", 200 | body: JSON.stringify(payload), 201 | }) 202 | .then(r => r.json()); 203 | } 204 | 205 | } -------------------------------------------------------------------------------- /Impresora_ie11.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /** 3 | * Una clase para interactuar con el plugin 4 | * Compatible con Internet Explorer 11. Requiere jQuery porque se usa $.ajax 5 | * 6 | * @author parzibyte 7 | * @see https://parzibyte.me/blog 8 | */ 9 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 10 | 11 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 12 | 13 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 14 | 15 | var C = { 16 | AccionWrite: "write", 17 | AccionCut: "cut", 18 | AccionCash: "cash", 19 | AccionCutPartial: "cutpartial", 20 | AccionAlign: "align", 21 | AccionFontSize: "fontsize", 22 | AccionFont: "font", 23 | AccionEmphasize: "emphasize", 24 | AccionFeed: "feed", 25 | AccionQr: "qr", 26 | AlineacionCentro: "center", 27 | AlineacionDerecha: "right", 28 | AlineacionIzquierda: "left", 29 | FuenteA: "A", 30 | FuenteB: "B", 31 | AccionBarcode128: "barcode128", 32 | AccionBarcode39: "barcode39", 33 | AccionBarcode93: "barcode93", 34 | AccionBarcodeEAN: "barcodeEAN", 35 | AccionBarcodeTwoOfFiveSinInterleaved: "barcodeTwoOfFive", 36 | AccionBarcodeTwoOfFiveInterleaved: "barcodeTwoOfFiveInterleaved", 37 | AccionBarcodeCodabar: "barcodeCodabar", 38 | AccionBarcodeUPCA: "barcodeUPCA", 39 | AccionBarcodeUPCE: "barcodeUPCE", 40 | Medida80: 80, 41 | Medida100: 100, 42 | Medida156: 156, 43 | Medida200: 200, 44 | Medida300: 300, 45 | Medida350: 350 46 | }; 47 | var URL_PLUGIN = "http://localhost:8000"; 48 | 49 | var OperacionTicket = function OperacionTicket(accion, datos) { 50 | _classCallCheck(this, OperacionTicket); 51 | 52 | this.accion = accion + ""; 53 | this.datos = datos + ""; 54 | }; 55 | 56 | var Impresora = /*#__PURE__*/function () { 57 | function Impresora(ruta) { 58 | _classCallCheck(this, Impresora); 59 | 60 | if (!ruta) ruta = URL_PLUGIN; 61 | this.ruta = ruta; 62 | this.operaciones = []; 63 | } 64 | 65 | _createClass(Impresora, [{ 66 | key: "cut", 67 | value: function cut() { 68 | this.operaciones.push(new OperacionTicket(C.AccionCut, "")); 69 | } 70 | }, { 71 | key: "cash", 72 | value: function cash() { 73 | this.operaciones.push(new OperacionTicket(C.AccionCash, "")); 74 | } 75 | }, { 76 | key: "cutPartial", 77 | value: function cutPartial() { 78 | this.operaciones.push(new OperacionTicket(C.AccionCutPartial, "")); 79 | } 80 | }, { 81 | key: "setFontSize", 82 | value: function setFontSize(a, b) { 83 | this.operaciones.push(new OperacionTicket(C.AccionFontSize, "".concat(a, ",").concat(b))); 84 | } 85 | }, { 86 | key: "setFont", 87 | value: function setFont(font) { 88 | if (font !== C.FuenteA && font !== C.FuenteB) throw Error("Fuente inválida"); 89 | this.operaciones.push(new OperacionTicket(C.AccionFont, font)); 90 | } 91 | }, { 92 | key: "setEmphasize", 93 | value: function setEmphasize(val) { 94 | if (isNaN(parseInt(val)) || parseInt(val) < 0) throw Error("Valor inválido"); 95 | this.operaciones.push(new OperacionTicket(C.AccionEmphasize, val)); 96 | } 97 | }, { 98 | key: "setAlign", 99 | value: function setAlign(align) { 100 | if (align !== C.AlineacionCentro && align !== C.AlineacionDerecha && align !== C.AlineacionIzquierda) { 101 | throw Error("Alineaci\xF3n ".concat(align, " inv\xE1lida")); 102 | } 103 | 104 | this.operaciones.push(new OperacionTicket(C.AccionAlign, align)); 105 | } 106 | }, { 107 | key: "write", 108 | value: function write(text) { 109 | this.operaciones.push(new OperacionTicket(C.AccionWrite, text)); 110 | } 111 | }, { 112 | key: "feed", 113 | value: function feed(n) { 114 | if (!parseInt(n) || parseInt(n) < 0) { 115 | throw Error("Valor para feed inválido"); 116 | } 117 | 118 | this.operaciones.push(new OperacionTicket(C.AccionFeed, n)); 119 | } 120 | }, { 121 | key: "end", 122 | value: function end(cb) { 123 | $.ajax(this.ruta + "/imprimir", { 124 | data: JSON.stringify(this.operaciones), 125 | contentType: "application/json", 126 | success: function success(respuesta) { 127 | cb(JSON.parse(respuesta)); 128 | }, 129 | method: "POST" 130 | }); 131 | } 132 | }, { 133 | key: "imprimirEnImpresora", 134 | value: function imprimirEnImpresora(nombreImpresora, cb) { 135 | var payload = { 136 | operaciones: this.operaciones, 137 | impresora: nombreImpresora 138 | }; 139 | $.ajax(this.ruta + "/imprimir_en", { 140 | data: JSON.stringify(payload), 141 | contentType: "application/json", 142 | success: function success(respuesta) { 143 | cb(JSON.parse(respuesta)); 144 | }, 145 | method: "POST" 146 | }); 147 | } 148 | }, { 149 | key: "qr", 150 | value: function qr(contenido) { 151 | this.operaciones.push(new OperacionTicket(C.AccionQr, contenido)); 152 | } 153 | }, { 154 | key: "validarMedida", 155 | value: function validarMedida(medida) { 156 | medida = parseInt(medida); 157 | 158 | if (medida !== C.Medida80 && medida !== C.Medida100 && medida !== C.Medida156 && medida !== C.Medida200 && medida !== C.Medida300 && medida !== C.Medida350) { 159 | throw Error("Valor para medida del barcode inválido"); 160 | } 161 | } 162 | }, { 163 | key: "validarTipo", 164 | value: function validarTipo(tipo) { 165 | if ([C.AccionBarcode128, C.AccionBarcode39, C.AccionBarcode93, C.AccionBarcodeEAN, C.AccionBarcodeTwoOfFiveInterleaved, C.AccionBarcodeTwoOfFiveSinInterleaved, C.AccionBarcodeCodabar, C.AccionBarcodeUPCA, C.AccionBarcodeUPCE].indexOf(tipo) === -1) throw Error("Tipo de código de barras no soportado"); 166 | } 167 | }, { 168 | key: "barcode", 169 | value: function barcode(contenido, medida, tipo) { 170 | this.validarMedida(medida); 171 | this.validarTipo(tipo); 172 | var payload = contenido.concat(",").concat(medida.toString()); 173 | this.operaciones.push(new OperacionTicket(tipo, payload)); 174 | } 175 | }], [{ 176 | key: "setImpresora", 177 | value: function setImpresora(nombreImpresora, cb, ruta) { 178 | if (ruta) URL_PLUGIN = ruta; 179 | $.ajax(URL_PLUGIN + "/impresora", { 180 | data: JSON.stringify(nombreImpresora), 181 | contentType: "application/json", 182 | success: function success(respuesta) { 183 | cb(JSON.parse(respuesta)); 184 | }, 185 | method: "PUT" 186 | }); 187 | } 188 | }, { 189 | key: "getImpresora", 190 | value: function getImpresora(cb, ruta) { 191 | if (ruta) URL_PLUGIN = ruta; 192 | $.ajax(URL_PLUGIN + "/impresora", { 193 | contentType: "application/json", 194 | success: function success(respuesta) { 195 | cb(JSON.parse(respuesta)); 196 | }, 197 | method: "GET" 198 | }); 199 | } 200 | }, { 201 | key: "getImpresoras", 202 | value: function getImpresoras(cb, ruta) { 203 | if (ruta) URL_PLUGIN = ruta; 204 | $.ajax(URL_PLUGIN + "/impresoras", { 205 | contentType: "application/json", 206 | success: function success(respuesta) { 207 | cb(JSON.parse(respuesta)); 208 | }, 209 | method: "GET" 210 | }); 211 | } 212 | }]); 213 | 214 | return Impresora; 215 | }(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Imprimir en impresora térmica usando JavaScript puro 2 | 3 | Al fin un plugin gratuito para imprimir con JavaScript sin depender de lenguajes de servidor; de esta manera se puede imprimir desde el lado del cliente sin abrir ventanas de confirmación 4 | ![Ticket impreso del lado del cliente usando JavaScript puro](https://raw.githubusercontent.com/parzibyte/plugin-ticket-js/master/Ticket%20impreso%20con%20JavaScript%20puro.jpg) 5 | 6 | ## Tutoriales 7 | Explicación técnica [aquí](https://parzibyte.me/blog/2019/08/01/plugin-impresora-termica-navegador-javascript/) 8 | 9 | Ejemplos explicados [aquí](https://parzibyte.me/blog/2019/08/01/imprimir-ticket-impresora-termica-javascript-plugin/) 10 | 11 | ## Ventajas 12 | 13 | 1. Corte de papel 14 | 2. Impresión sin confirmación de usuario 15 | 3. Fuentes 16 | 4. Alineación 17 | 5. Apertura de cajón de dinero 18 | 6. Impresión totalmente del lado del cliente 19 | 7. No requiere dependencias, descarga el plugin y listo 20 | 21 | ## Documentación y ejemplos 22 | Mira la documentación y los ejemplos [aquí](https://parzibyte.me/plugin-impresora-termica-v1/). 23 | -------------------------------------------------------------------------------- /Ticket impreso con JavaScript puro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parzibyte/plugin-ticket-js/eac6ded18f77fc59f9c1465253cf6a6baa790178/Ticket impreso con JavaScript puro.jpg -------------------------------------------------------------------------------- /ejemplos/barcode/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 9 | 10 | Imprimir códigos de barras en impresora térmica 11 | 12 | 17 | 18 | 19 |
20 |
21 |
22 |

Códigos de barras en thermal printer

23 |

En este ejemplo se muestra cómo imprimir un código de barras en una ticketera

24 | By Parzibyte 25 |
26 | Documentación 28 |
Recuerda que el plugin debe estar ejecutándose en segundo plano
29 |
30 | 31 |
32 |
33 | 34 | 35 |
36 |
37 | 38 | 46 |
47 |
48 | 49 | 60 |
61 |
62 | 63 | 65 |
66 |
67 | 70 |
71 |
72 |
73 |

Log

74 | 77 |

78 |         
79 |
80 |
81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /ejemplos/barcode/script.js: -------------------------------------------------------------------------------- 1 | const $estado = document.querySelector("#estado"), 2 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 3 | $codigo = document.querySelector("#codigo"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnImprimir = document.querySelector("#btnImprimir"), 6 | $tamanioBarcode = document.querySelector("#tamanioBarcode"), 7 | $tipoBarcode = document.querySelector("#tipoBarcode"); 8 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 9 | const limpiarLog = () => $estado.textContent = ""; 10 | 11 | $btnLimpiarLog.addEventListener("click", limpiarLog); 12 | const limpiarLista = () => { 13 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 14 | $listaDeImpresoras.remove(i); 15 | } 16 | }; 17 | const obtenerListaDeImpresoras = () => { 18 | loguear("Cargando lista..."); 19 | Impresora.getImpresoras() 20 | .then(listaDeImpresoras => { 21 | loguear("Lista cargada"); 22 | limpiarLista(); 23 | listaDeImpresoras.forEach(nombreImpresora => { 24 | const option = document.createElement('option'); 25 | option.value = option.text = nombreImpresora; 26 | $listaDeImpresoras.appendChild(option); 27 | }) 28 | }); 29 | }; 30 | obtenerListaDeImpresoras(); 31 | /* 32 | * La magia sucede a continuación 33 | * */ 34 | $btnImprimir.addEventListener("click", () => { 35 | // Recuperar el código de barras 36 | let contenido = $codigo.value; 37 | // Validar 38 | if (!contenido) { 39 | return alert("Escribe el contenido del código de barras"); 40 | } 41 | // Ahora la impresora 42 | let impresoraSeleccionada = $listaDeImpresoras.options[$listaDeImpresoras.selectedIndex].value; 43 | if (!impresoraSeleccionada) { 44 | return alert("Selecciona una impresora"); 45 | } 46 | // El tamaño.. 47 | let tamanioBarcode = $tamanioBarcode.options[$tamanioBarcode.selectedIndex].value; 48 | if (!tamanioBarcode) { 49 | return alert("Selecciona el tamaño"); 50 | } 51 | // El tipo.. 52 | let tipoBarcode = $tipoBarcode.options[$tipoBarcode.selectedIndex].value; 53 | if (!tipoBarcode) { 54 | return alert("Selecciona el tipo"); 55 | } 56 | // Si está bien se ejecuta esto... 57 | let impresora = new Impresora(); 58 | impresora.barcode(contenido, tamanioBarcode, tipoBarcode); 59 | // Dos saltos de línea 60 | impresora.feed(2); 61 | // Terminar en la impresora seleccionada 62 | loguear("Imprimiendo..."); 63 | impresora.imprimirEnImpresora(impresoraSeleccionada) 64 | .then(respuesta => { 65 | loguear("Al imprimir el código de barras tenemos: " + respuesta); 66 | }) 67 | }); -------------------------------------------------------------------------------- /ejemplos/establecer-impresora-silenciosa/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | Establecer impresora predeterminada de manera silenciosa 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Demostrar capacidades de plugin de impresión

25 | By Parzibyte 26 |
27 | Documentación 28 |
29 | 30 |
31 | 32 |

Ajustes de impresora

33 | Nombre de impresora seleccionada: 34 |

35 |
36 | 37 |
38 | 39 | 40 |

Capacidades

41 |

Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:

42 | 43 | 44 |
45 |
46 |

Log

47 | 48 |

49 |             
50 |
51 |
52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /ejemplos/establecer-impresora-silenciosa/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 6 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 7 | $texto = document.querySelector("#texto"), 8 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | 12 | 13 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 14 | const limpiarLog = () => $estado.textContent = ""; 15 | 16 | $btnLimpiarLog.addEventListener("click", limpiarLog); 17 | 18 | const limpiarLista = () => { 19 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 20 | $listaDeImpresoras.remove(i); 21 | } 22 | }; 23 | 24 | const obtenerListaDeImpresoras = () => { 25 | loguear("Cargando lista..."); 26 | Impresora.getImpresoras() 27 | .then(listaDeImpresoras => { 28 | refrescarNombreDeImpresoraSeleccionada(); 29 | loguear("Lista cargada"); 30 | limpiarLista(); 31 | listaDeImpresoras.forEach(nombreImpresora => { 32 | const option = document.createElement('option'); 33 | option.value = option.text = nombreImpresora; 34 | $listaDeImpresoras.appendChild(option); 35 | }) 36 | }); 37 | } 38 | 39 | const establecerImpresoraComoPredeterminada = nombreImpresora => { 40 | loguear("Estableciendo impresora..."); 41 | Impresora.setImpresoraSilencioso(nombreImpresora) 42 | .then(respuesta => { 43 | refrescarNombreDeImpresoraSeleccionada(); 44 | if (respuesta) { 45 | loguear(`Impresora ${nombreImpresora} establecida correctamente`); 46 | } else { 47 | loguear(`No se pudo establecer la impresora con el nombre ${nombreImpresora}`); 48 | } 49 | }); 50 | }; 51 | 52 | const refrescarNombreDeImpresoraSeleccionada = () => { 53 | Impresora.getImpresora() 54 | .then(nombreImpresora => { 55 | $impresoraSeleccionada.textContent = nombreImpresora; 56 | }); 57 | } 58 | 59 | 60 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 61 | $btnEstablecerImpresora.addEventListener("click", () => { 62 | const indice = $listaDeImpresoras.selectedIndex; 63 | if (indice === -1) return loguear("No hay ninguna impresora seleccionada") 64 | const opcionSeleccionada = $listaDeImpresoras.options[indice]; 65 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 66 | }); 67 | 68 | $btnImprimir.addEventListener("click", () => { 69 | let impresora = new Impresora(RUTA_API); 70 | impresora.setFontSize(1, 1); 71 | impresora.write("Fuente 1,1\n"); 72 | impresora.setFontSize(1, 2); 73 | impresora.write("Fuente 1,2\n"); 74 | impresora.setFontSize(2, 2); 75 | impresora.write("Fuente 2,2\n"); 76 | impresora.setFontSize(2, 1); 77 | impresora.write("Fuente 2,1\n"); 78 | impresora.setFontSize(1, 1); 79 | impresora.setEmphasize(1); 80 | impresora.write("Emphasize 1\n"); 81 | impresora.setEmphasize(0); 82 | impresora.write("Emphasize 0\n"); 83 | impresora.setAlign("center"); 84 | impresora.write("Centrado\n"); 85 | impresora.setAlign("left"); 86 | impresora.write("Izquierda\n"); 87 | impresora.setAlign("right"); 88 | impresora.write("Derecha\n"); 89 | impresora.setFont("A"); 90 | impresora.write("Fuente A\n"); 91 | impresora.setFont("B"); 92 | impresora.write("Fuente B\n"); 93 | impresora.feed(2); 94 | impresora.write("Separado por 2\n"); 95 | impresora.cut(); 96 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 97 | impresora.end() 98 | .then(valor => { 99 | loguear("Al imprimir: " + valor); 100 | }); 101 | }); 102 | 103 | // En el init, obtenemos la lista 104 | obtenerListaDeImpresoras(); 105 | // Y también la impresora seleccionada 106 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre-ie11/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 11 | Indicar nombre de impresora by parzibyte 12 | 13 | 18 | 19 | 20 | 21 | 22 |
23 |
24 |
25 |

Imprimir indicando nombre de la impresora

26 |

En este ejemplo se muestra cómo imprimir indicando el 27 | nombre de la impresora al momento de imprimir, en lugar 28 | de siempre tomar la impresora predeterminada 29 |

30 | By Parzibyte 31 |
32 | Documentación 34 |
35 |
36 |
37 | 39 |
40 |
41 | 43 |
44 |
45 | 47 |
48 |
49 |
50 |

Log

51 | 53 |

54 |                 
55 |
56 |
57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre-ie11/script.js: -------------------------------------------------------------------------------- 1 | 2 | "use strict"; 3 | 4 | var RUTA_API = "http://localhost:8000"; 5 | var $estado = document.querySelector("#estado"), 6 | $nombreImpresora = document.querySelector("#nombre"), 7 | $mensaje = document.querySelector("#mensaje"), 8 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | var loguear = function loguear(texto) { 12 | return $estado.textContent += new Date().toLocaleString() + " " + texto + "\n"; 13 | }; 14 | 15 | var limpiarLog = function limpiarLog() { 16 | return $estado.textContent = ""; 17 | }; 18 | 19 | $btnLimpiarLog.addEventListener("click", limpiarLog); 20 | $btnImprimir.addEventListener("click", function () { 21 | var nombreImpresora = $nombreImpresora.value, 22 | mensaje = $mensaje.value; 23 | if (!nombreImpresora || !mensaje) return; 24 | var impresora = new Impresora(RUTA_API); 25 | impresora.setFontSize(1, 1); 26 | impresora.write("Tratando de imprimir en ".concat(nombreImpresora, "\n")); 27 | impresora.write(mensaje); 28 | impresora.cut(); 29 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 30 | 31 | impresora.imprimirEnImpresora(nombreImpresora, function (valor) { 32 | loguear("Al imprimir: " + valor); 33 | }); 34 | }); -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre-y-host/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 11 | Indicar nombre de impresora by parzibyte 12 | 13 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Imprimir indicando nombre de la impresora y el host en red

25 |

En este ejemplo se muestra cómo imprimir indicando el 26 | nombre de la impresora al momento de imprimir, en lugar 27 | de siempre tomar la impresora predeterminada 28 |

29 | By Parzibyte 30 |
31 | Documentación 33 |
34 |
35 |
36 | 38 |
39 |
40 | 42 |
43 |
44 | 46 |
47 |
48 | 50 |
51 |
52 |
53 |

Log

54 | 56 |

57 |                 
58 |
59 |
60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre-y-host/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $nombreImpresora = document.querySelector("#nombre"), 4 | $ipImpresora = document.querySelector("#ip"), 5 | $mensaje = document.querySelector("#mensaje"), 6 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 7 | $btnImprimir = document.querySelector("#btnImprimir"); 8 | 9 | 10 | 11 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 12 | const limpiarLog = () => $estado.textContent = ""; 13 | 14 | $btnLimpiarLog.addEventListener("click", limpiarLog); 15 | 16 | 17 | $btnImprimir.addEventListener("click", () => { 18 | 19 | let nombreImpresora = $nombreImpresora.value 20 | mensaje = $mensaje.value, 21 | ip = $ipImpresora.value; 22 | if(!nombreImpresora || !mensaje || !ip) return; 23 | 24 | let impresora = new Impresora(RUTA_API); 25 | impresora.setFontSize(1, 1); 26 | impresora.write(`Tratando de imprimir en ${nombreImpresora} con host ${ip} 27 | `); 28 | console.log(`Tratando de imprimir en ${nombreImpresora} con host ${ip} 29 | `); 30 | impresora.write(mensaje); 31 | impresora.cut(); 32 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 33 | impresora.imprimirEnImpresoraConNombreEIp(nombreImpresora, ip) 34 | .then(valor => { 35 | loguear("Al imprimir: " + valor); 36 | }); 37 | }); -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 11 | Indicar nombre de impresora by parzibyte 12 | 13 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Imprimir indicando nombre de la impresora

25 |

En este ejemplo se muestra cómo imprimir indicando el 26 | nombre de la impresora al momento de imprimir, en lugar 27 | de siempre tomar la impresora predeterminada 28 |

29 | By Parzibyte 30 |
31 | Documentación 33 |
34 |
35 |
36 | 38 |
39 |
40 | 42 |
43 |
44 | 46 |
47 |
48 |
49 |

Log

50 | 52 |

53 |                 
54 |
55 |
56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /ejemplos/imprimir-con-nombre/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $nombreImpresora = document.querySelector("#nombre"), 4 | $mensaje = document.querySelector("#mensaje"), 5 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 6 | $btnImprimir = document.querySelector("#btnImprimir"); 7 | 8 | 9 | 10 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 11 | const limpiarLog = () => $estado.textContent = ""; 12 | 13 | $btnLimpiarLog.addEventListener("click", limpiarLog); 14 | 15 | 16 | $btnImprimir.addEventListener("click", () => { 17 | 18 | let nombreImpresora = $nombreImpresora.value 19 | mensaje = $mensaje.value; 20 | if(!nombreImpresora || !mensaje) return; 21 | 22 | let impresora = new Impresora(RUTA_API); 23 | impresora.setFontSize(1, 1); 24 | impresora.write(`Tratando de imprimir en ${nombreImpresora} 25 | `); 26 | impresora.write(mensaje); 27 | impresora.cut(); 28 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 29 | impresora.imprimirEnImpresora(nombreImpresora) 30 | .then(valor => { 31 | loguear("Al imprimir: " + valor); 32 | }); 33 | }); -------------------------------------------------------------------------------- /ejemplos/obtener-impresoras-remotas/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 11 | Obtener impresoras remotas 12 | 13 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Obtener impresoras remotas

25 |

A partir de la IP de otra PC que ejecuta el plugin de impresión, obtener la lista de impresoras

26 | By Parzibyte 27 |
28 | Documentación 30 |
31 |
32 |
33 | 35 |
36 |
37 | 38 |
39 |
40 |
41 |

Log

42 | 44 |

45 |                 
46 |
47 |
48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ejemplos/obtener-impresoras-remotas/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $nombreImpresora = document.querySelector("#nombre"), 4 | $ipImpresora = document.querySelector("#ip"), 5 | $mensaje = document.querySelector("#mensaje"), 6 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 7 | $btnObtenerImpresoras = document.querySelector("#btnObtenerImpresoras"); 8 | 9 | 10 | 11 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 12 | const limpiarLog = () => $estado.textContent = ""; 13 | 14 | $btnLimpiarLog.addEventListener("click", limpiarLog); 15 | 16 | 17 | $btnObtenerImpresoras.addEventListener("click", () => { 18 | 19 | let ip = $ipImpresora.value; 20 | if (!ip) return; 21 | Impresora.getImpresorasRemotas(ip) 22 | .then(impresoras => { 23 | impresoras.forEach(impresora => { 24 | loguear(`Encontré una impresora: ${impresora}`); 25 | }); 26 | }); 27 | }); -------------------------------------------------------------------------------- /ejemplos/qr/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 9 | 10 | Imprimir códigos QR en impresora térmica 11 | 12 | 17 | 18 | 19 |
20 |
21 |
22 |

Códigos QR en thermal printer

23 |

En este ejemplo se muestra cómo imprimir un código QR en una ticketera

24 | By Parzibyte 25 |
26 | Documentación 28 |
Recuerda que el plugin debe estar ejecutándose en segundo plano
29 |
30 | 31 |
32 |
33 | 34 | 35 |
36 |
37 | 38 | 40 |
41 |
42 | 45 |
46 |
47 |
48 |

Log

49 | 52 |

53 |         
54 |
55 |
56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /ejemplos/qr/script.js: -------------------------------------------------------------------------------- 1 | const $estado = document.querySelector("#estado"), 2 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 3 | $codigo = document.querySelector("#codigo"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnImprimir = document.querySelector("#btnImprimir"); 6 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 7 | const limpiarLog = () => $estado.textContent = ""; 8 | 9 | $btnLimpiarLog.addEventListener("click", limpiarLog); 10 | const limpiarLista = () => { 11 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 12 | $listaDeImpresoras.remove(i); 13 | } 14 | }; 15 | const obtenerListaDeImpresoras = () => { 16 | loguear("Cargando lista..."); 17 | Impresora.getImpresoras() 18 | .then(listaDeImpresoras => { 19 | loguear("Lista cargada"); 20 | limpiarLista(); 21 | listaDeImpresoras.forEach(nombreImpresora => { 22 | const option = document.createElement('option'); 23 | option.value = option.text = nombreImpresora; 24 | $listaDeImpresoras.appendChild(option); 25 | }) 26 | }); 27 | }; 28 | obtenerListaDeImpresoras(); 29 | /* 30 | * La magia sucede a continuación 31 | * */ 32 | $btnImprimir.addEventListener("click", () => { 33 | // Recuperar el QR 34 | let contenido = $codigo.value; 35 | // Validar 36 | if (!contenido) { 37 | return alert("Escribe el contenido del QR"); 38 | } 39 | // Ahora la impresora 40 | let impresoraSeleccionada = $listaDeImpresoras.options[$listaDeImpresoras.selectedIndex].value; 41 | if (!impresoraSeleccionada) { 42 | return alert("Selecciona una impresora") 43 | } 44 | // Si está bien se ejecuta esto... 45 | let impresora = new Impresora(); 46 | impresora.qr(contenido); 47 | // Dos saltos de línea 48 | impresora.feed(2); 49 | // Terminar en la impresora seleccionada 50 | loguear("Imprimiendo..."); 51 | impresora.imprimirEnImpresora(impresoraSeleccionada) 52 | .then(respuesta => { 53 | loguear("Al imprimir el código QR tenemos: " + respuesta); 54 | }) 55 | }); -------------------------------------------------------------------------------- /ejemplos/simple-ie11/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | Demostrar capacidades de plugin de impresión 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 |
24 |
25 |

Demostrar capacidades de plugin de impresión

26 | By Parzibyte 27 |
28 | Documentación 29 |
30 | 31 |
32 | 33 |

Ajustes de impresora

34 | Nombre de impresora seleccionada: 35 |

36 |
37 | 38 |
39 | 40 | 41 |

Capacidades

42 |

Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:

43 | 44 | 45 |
46 |
47 |

Log

48 | 49 |

50 |             
51 |
52 |
53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /ejemplos/simple-ie11/script.js: -------------------------------------------------------------------------------- 1 | 2 | "use strict"; 3 | 4 | var RUTA_API = "http://localhost:8000"; 5 | var $estado = document.querySelector("#estado"), 6 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 7 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 8 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 9 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 10 | $texto = document.querySelector("#texto"), 11 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 12 | $btnImprimir = document.querySelector("#btnImprimir"); 13 | 14 | var loguear = function loguear(texto) { 15 | return $estado.textContent += new Date().toLocaleString() + " " + texto + "\n"; 16 | }; 17 | 18 | var limpiarLog = function limpiarLog() { 19 | return $estado.textContent = ""; 20 | }; 21 | 22 | $btnLimpiarLog.addEventListener("click", limpiarLog); 23 | 24 | var limpiarLista = function limpiarLista() { 25 | for (var i = $listaDeImpresoras.options.length; i >= 0; i--) { 26 | $listaDeImpresoras.remove(i); 27 | } 28 | }; 29 | 30 | var obtenerListaDeImpresoras = function obtenerListaDeImpresoras() { 31 | loguear("Cargando lista..."); 32 | Impresora.getImpresoras(function (listaDeImpresoras) { 33 | refrescarNombreDeImpresoraSeleccionada(); 34 | loguear("Lista cargada"); 35 | limpiarLista(); 36 | listaDeImpresoras.forEach(function (nombreImpresora) { 37 | var option = document.createElement('option'); 38 | option.value = option.text = nombreImpresora; 39 | $listaDeImpresoras.appendChild(option); 40 | }); 41 | }); 42 | }; 43 | 44 | var establecerImpresoraComoPredeterminada = function establecerImpresoraComoPredeterminada(nombreImpresora) { 45 | loguear("Estableciendo impresora..."); 46 | Impresora.setImpresora(nombreImpresora, function (respuesta) { 47 | refrescarNombreDeImpresoraSeleccionada(); 48 | 49 | if (respuesta) { 50 | loguear("Impresora ".concat(nombreImpresora, " establecida correctamente")); 51 | } else { 52 | loguear("No se pudo establecer la impresora con el nombre ".concat(nombreImpresora)); 53 | } 54 | }); 55 | }; 56 | 57 | var refrescarNombreDeImpresoraSeleccionada = function refrescarNombreDeImpresoraSeleccionada() { 58 | Impresora.getImpresora(function (nombreImpresora) { 59 | $impresoraSeleccionada.textContent = nombreImpresora; 60 | }); 61 | }; 62 | 63 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 64 | $btnEstablecerImpresora.addEventListener("click", function () { 65 | var indice = $listaDeImpresoras.selectedIndex; 66 | if (indice === -1) return loguear("No hay ninguna impresora seleccionada"); 67 | var opcionSeleccionada = $listaDeImpresoras.options[indice]; 68 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 69 | }); 70 | $btnImprimir.addEventListener("click", function () { 71 | var impresora = new Impresora(RUTA_API); 72 | impresora.setFontSize(1, 1); 73 | impresora.write("Fuente 1,1\n"); 74 | impresora.setFontSize(1, 2); 75 | impresora.write("Fuente 1,2\n"); 76 | impresora.setFontSize(2, 2); 77 | impresora.write("Fuente 2,2\n"); 78 | impresora.setFontSize(2, 1); 79 | impresora.write("Fuente 2,1\n"); 80 | impresora.setFontSize(1, 1); 81 | impresora.setEmphasize(1); 82 | impresora.write("Emphasize 1\n"); 83 | impresora.setEmphasize(0); 84 | impresora.write("Emphasize 0\n"); 85 | impresora.setAlign("center"); 86 | impresora.write("Centrado\n"); 87 | impresora.setAlign("left"); 88 | impresora.write("Izquierda\n"); 89 | impresora.setAlign("right"); 90 | impresora.write("Derecha\n"); 91 | impresora.setFont("A"); 92 | impresora.write("Fuente A\n"); 93 | impresora.setFont("B"); 94 | impresora.write("Fuente B\n"); 95 | impresora.feed(2); 96 | impresora.write("Separado por 2\n"); 97 | impresora.cut(); 98 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 99 | 100 | impresora.end(function (valor) { 101 | loguear("Al imprimir: " + valor); 102 | }); 103 | }); // En el init, obtenemos la lista 104 | 105 | obtenerListaDeImpresoras(); // Y también la impresora seleccionada 106 | 107 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /ejemplos/simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | Demostrar capacidades de plugin de impresión 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Demostrar capacidades de plugin de impresión

25 | By Parzibyte 26 |
27 | Documentación 28 |
29 | 30 |
31 | 32 |

Ajustes de impresora

33 | Nombre de impresora seleccionada: 34 |

35 |
36 | 37 |
38 | 39 | 40 |

Capacidades

41 |

Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:

42 | 43 | 44 |
45 |
46 |

Log

47 | 48 |

49 |             
50 |
51 |
52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /ejemplos/simple/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 6 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 7 | $texto = document.querySelector("#texto"), 8 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | 12 | 13 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 14 | const limpiarLog = () => $estado.textContent = ""; 15 | 16 | $btnLimpiarLog.addEventListener("click", limpiarLog); 17 | 18 | const limpiarLista = () => { 19 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 20 | $listaDeImpresoras.remove(i); 21 | } 22 | }; 23 | 24 | const obtenerListaDeImpresoras = () => { 25 | loguear("Cargando lista..."); 26 | Impresora.getImpresoras() 27 | .then(listaDeImpresoras => { 28 | refrescarNombreDeImpresoraSeleccionada(); 29 | loguear("Lista cargada"); 30 | limpiarLista(); 31 | listaDeImpresoras.forEach(nombreImpresora => { 32 | const option = document.createElement('option'); 33 | option.value = option.text = nombreImpresora; 34 | $listaDeImpresoras.appendChild(option); 35 | }) 36 | }); 37 | } 38 | 39 | const establecerImpresoraComoPredeterminada = nombreImpresora => { 40 | loguear("Estableciendo impresora..."); 41 | Impresora.setImpresora(nombreImpresora) 42 | .then(respuesta => { 43 | refrescarNombreDeImpresoraSeleccionada(); 44 | if (respuesta) { 45 | loguear(`Impresora ${nombreImpresora} establecida correctamente`); 46 | } else { 47 | loguear(`No se pudo establecer la impresora con el nombre ${nombreImpresora}`); 48 | } 49 | }); 50 | }; 51 | 52 | const refrescarNombreDeImpresoraSeleccionada = () => { 53 | Impresora.getImpresora() 54 | .then(nombreImpresora => { 55 | $impresoraSeleccionada.textContent = nombreImpresora; 56 | }); 57 | } 58 | 59 | 60 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 61 | $btnEstablecerImpresora.addEventListener("click", () => { 62 | const indice = $listaDeImpresoras.selectedIndex; 63 | if (indice === -1) return loguear("No hay ninguna impresora seleccionada") 64 | const opcionSeleccionada = $listaDeImpresoras.options[indice]; 65 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 66 | }); 67 | 68 | $btnImprimir.addEventListener("click", () => { 69 | let impresora = new Impresora(RUTA_API); 70 | impresora.setFontSize(1, 1); 71 | impresora.write("Fuente 1,1\n"); 72 | impresora.setFontSize(1, 2); 73 | impresora.write("Fuente 1,2\n"); 74 | impresora.setFontSize(2, 2); 75 | impresora.write("Fuente 2,2\n"); 76 | impresora.setFontSize(2, 1); 77 | impresora.write("Fuente 2,1\n"); 78 | impresora.setFontSize(1, 1); 79 | impresora.setEmphasize(1); 80 | impresora.write("Emphasize 1\n"); 81 | impresora.setEmphasize(0); 82 | impresora.write("Emphasize 0\n"); 83 | impresora.setAlign("center"); 84 | impresora.write("Centrado\n"); 85 | impresora.setAlign("left"); 86 | impresora.write("Izquierda\n"); 87 | impresora.setAlign("right"); 88 | impresora.write("Derecha\n"); 89 | impresora.setFont("A"); 90 | impresora.write("Fuente A\n"); 91 | impresora.setFont("B"); 92 | impresora.write("Fuente B\n"); 93 | impresora.feed(2); 94 | impresora.write("Separado por 2\n"); 95 | impresora.cut(); 96 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 97 | impresora.end() 98 | .then(valor => { 99 | loguear("Al imprimir: " + valor); 100 | }); 101 | }); 102 | 103 | // En el init, obtenemos la lista 104 | obtenerListaDeImpresoras(); 105 | // Y también la impresora seleccionada 106 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /ejemplos/ticket/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | Imprimir ticket de venta desde JavaScript usando plugin 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 |

Imprimir ticket de venta desde JavaScript usando plugin

25 | By Parzibyte 26 |
27 | Documentación 28 |
29 | 30 |
31 | 32 |

Ajustes de impresora

33 | Nombre de impresora seleccionada: 34 |

35 |
36 | 37 |
38 | 39 | 40 |

Ticket de prueba

41 |

Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:

42 | 43 | 44 |
45 |
46 |

Log

47 | 48 |

49 |             
50 |
51 |
52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /ejemplos/ticket/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000" 2 | const $estado = document.querySelector("#estado"), 3 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 6 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 7 | $texto = document.querySelector("#texto"), 8 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | 12 | 13 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 14 | const limpiarLog = () => $estado.textContent = ""; 15 | 16 | $btnLimpiarLog.addEventListener("click", limpiarLog); 17 | 18 | const limpiarLista = () => { 19 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 20 | $listaDeImpresoras.remove(i); 21 | } 22 | }; 23 | 24 | 25 | const obtenerListaDeImpresoras = () => { 26 | loguear("Cargando lista..."); 27 | Impresora.getImpresoras() 28 | .then(listaDeImpresoras => { 29 | refrescarNombreDeImpresoraSeleccionada(); 30 | loguear("Lista cargada"); 31 | limpiarLista(); 32 | listaDeImpresoras.forEach(nombreImpresora => { 33 | const option = document.createElement('option'); 34 | option.value = option.text = nombreImpresora; 35 | $listaDeImpresoras.appendChild(option); 36 | }) 37 | }); 38 | } 39 | 40 | const establecerImpresoraComoPredeterminada = nombreImpresora => { 41 | loguear("Estableciendo impresora..."); 42 | Impresora.setImpresora(nombreImpresora) 43 | .then(respuesta => { 44 | refrescarNombreDeImpresoraSeleccionada(); 45 | if (respuesta) { 46 | loguear(`Impresora ${nombreImpresora} establecida correctamente`); 47 | } else { 48 | loguear(`No se pudo establecer la impresora con el nombre ${nombreImpresora}`); 49 | } 50 | }); 51 | }; 52 | 53 | const refrescarNombreDeImpresoraSeleccionada = () => { 54 | Impresora.getImpresora() 55 | .then(nombreImpresora => { 56 | $impresoraSeleccionada.textContent = nombreImpresora; 57 | }); 58 | } 59 | 60 | 61 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 62 | $btnEstablecerImpresora.addEventListener("click", () => { 63 | const indice = $listaDeImpresoras.selectedIndex; 64 | if (indice === -1) return loguear("No hay ninguna impresora seleccionada") 65 | const opcionSeleccionada = $listaDeImpresoras.options[indice]; 66 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 67 | }); 68 | 69 | $btnImprimir.addEventListener("click", () => { 70 | let impresora = new Impresora(RUTA_API); 71 | impresora.setFontSize(1, 1); 72 | impresora.setEmphasize(0); 73 | impresora.setAlign("center"); 74 | impresora.write("Parzibyte's blog\n"); 75 | impresora.write("Blog de un programador\n"); 76 | impresora.write("Telefono: 123456789\n"); 77 | impresora.write("Fecha/Hora: 2019-08-01 13:21:22\n"); 78 | impresora.write("--------------------------------\n"); 79 | impresora.write("Venta de plugin para impresora\n"); 80 | impresora.setAlign("right"); 81 | impresora.write("25 USD\n"); 82 | impresora.write("--------------------------------\n"); 83 | impresora.write("TOTAL: 25 USD\n"); 84 | impresora.write("--------------------------------\n"); 85 | impresora.setAlign("center"); 86 | impresora.write("***Gracias por su compra***"); 87 | impresora.cut(); 88 | impresora.cutPartial(); // Pongo este y también cut porque en ocasiones no funciona con cut, solo con cutPartial 89 | impresora.end() 90 | .then(valor => { 91 | loguear("Al imprimir: " + valor); 92 | }) 93 | }); 94 | 95 | // En el init, obtenemos la lista 96 | obtenerListaDeImpresoras(); 97 | // Y también la impresora seleccionada 98 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /en/examples/simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 12 | 14 | 15 | Plugin capabilities 16 | 17 | 22 | 23 | 24 | 25 |
26 |
27 |
28 |

Show plugin capabilities 29 |

30 | By Parzibyte 31 |
32 | Docs 33 |
34 | 35 |
36 | 37 |

Printer settings

38 | Selected printer: 39 |

40 |
41 | 42 |
43 | 45 | 47 |

Capabilities

48 |

Click the button to print a test ticket in the default printer:

49 | 50 |
51 |
52 |

Log

53 | 55 |

56 |                 
57 |
58 |
59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /en/examples/simple/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000"; 2 | const $estado = document.querySelector("#estado"), 3 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 6 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 7 | $texto = document.querySelector("#texto"), 8 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | 12 | 13 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 14 | const limpiarLog = () => $estado.textContent = ""; 15 | 16 | $btnLimpiarLog.addEventListener("click", limpiarLog); 17 | 18 | const limpiarLista = () => { 19 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 20 | $listaDeImpresoras.remove(i); 21 | } 22 | }; 23 | 24 | const obtenerListaDeImpresoras = () => { 25 | loguear("Getting printers..."); 26 | Impresora.getImpresoras() 27 | .then(listaDeImpresoras => { 28 | refrescarNombreDeImpresoraSeleccionada(); 29 | loguear("Printers loaded"); 30 | limpiarLista(); 31 | listaDeImpresoras.forEach(nombreImpresora => { 32 | const option = document.createElement('option'); 33 | option.value = option.text = nombreImpresora; 34 | $listaDeImpresoras.appendChild(option); 35 | }) 36 | }); 37 | } 38 | 39 | const establecerImpresoraComoPredeterminada = nombreImpresora => { 40 | loguear("Setting printer..."); 41 | Impresora.setImpresora(nombreImpresora) 42 | .then(respuesta => { 43 | refrescarNombreDeImpresoraSeleccionada(); 44 | if (respuesta) { 45 | loguear(`Printer ${nombreImpresora} set successfully`); 46 | } else { 47 | loguear(`Cannot set the printer ${nombreImpresora}`); 48 | } 49 | }); 50 | }; 51 | 52 | const refrescarNombreDeImpresoraSeleccionada = () => { 53 | Impresora.getImpresora() 54 | .then(nombreImpresora => { 55 | $impresoraSeleccionada.textContent = nombreImpresora; 56 | }); 57 | } 58 | 59 | 60 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 61 | $btnEstablecerImpresora.addEventListener("click", () => { 62 | const indice = $listaDeImpresoras.selectedIndex; 63 | if (indice === -1) return loguear("No printers") 64 | const opcionSeleccionada = $listaDeImpresoras.options[indice]; 65 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 66 | }); 67 | 68 | $btnImprimir.addEventListener("click", () => { 69 | let impresora = new Impresora(RUTA_API); 70 | impresora.setFontSize(1, 1); 71 | impresora.write("Font 1,1\n"); 72 | impresora.setFontSize(1, 2); 73 | impresora.write("Font 1,2\n"); 74 | impresora.setFontSize(2, 2); 75 | impresora.write("Font 2,2\n"); 76 | impresora.setFontSize(2, 1); 77 | impresora.write("Font 2,1\n"); 78 | impresora.setFontSize(1, 1); 79 | impresora.setEmphasize(1); 80 | impresora.write("Emphasize 1\n"); 81 | impresora.setEmphasize(0); 82 | impresora.write("Emphasize 0\n"); 83 | impresora.setAlign("center"); 84 | impresora.write("Centered\n"); 85 | impresora.setAlign("left"); 86 | impresora.write("Left\n"); 87 | impresora.setAlign("right"); 88 | impresora.write("Right\n"); 89 | impresora.setFont("A"); 90 | impresora.write("Font A\n"); 91 | impresora.setFont("B"); 92 | impresora.write("Font B\n"); 93 | impresora.feed(2); 94 | impresora.write("New line 2\n"); 95 | impresora.cut(); 96 | impresora.cutPartial(); // use both because sometimes cut and/or cutPartial do not work 97 | impresora.end() 98 | .then(valor => { 99 | loguear("Response: " + valor); 100 | }); 101 | }); 102 | 103 | // En el init, obtenemos la lista 104 | obtenerListaDeImpresoras(); 105 | // Y también la impresora seleccionada 106 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /en/examples/ticket/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 12 | 14 | 15 | Print a receipt using plugin 16 | 17 | 22 | 23 | 24 | 25 |
26 |
27 |
28 |

Print a sale ticket

29 | By Parzibyte 30 |
31 | Docs 32 |
33 | 34 |
35 |

Printer settings

36 | Selected printer: 37 |

38 |
39 | 40 |
41 | 43 |

Sale 45 | receipt example

46 |

Click the button to print a sale receipt in default 47 | printer:

48 | 50 | 51 |
52 |
53 |

Log

54 | 55 |

56 |                 
57 |
58 |
59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /en/examples/ticket/script.js: -------------------------------------------------------------------------------- 1 | const RUTA_API = "http://localhost:8000" 2 | const $estado = document.querySelector("#estado"), 3 | $listaDeImpresoras = document.querySelector("#listaDeImpresoras"), 4 | $btnLimpiarLog = document.querySelector("#btnLimpiarLog"), 5 | $btnRefrescarLista = document.querySelector("#btnRefrescarLista"), 6 | $btnEstablecerImpresora = document.querySelector("#btnEstablecerImpresora"), 7 | $texto = document.querySelector("#texto"), 8 | $impresoraSeleccionada = document.querySelector("#impresoraSeleccionada"), 9 | $btnImprimir = document.querySelector("#btnImprimir"); 10 | 11 | 12 | 13 | const loguear = texto => $estado.textContent += (new Date()).toLocaleString() + " " + texto + "\n"; 14 | const limpiarLog = () => $estado.textContent = ""; 15 | 16 | $btnLimpiarLog.addEventListener("click", limpiarLog); 17 | 18 | const limpiarLista = () => { 19 | for (let i = $listaDeImpresoras.options.length; i >= 0; i--) { 20 | $listaDeImpresoras.remove(i); 21 | } 22 | }; 23 | 24 | 25 | const obtenerListaDeImpresoras = () => { 26 | loguear("Getting printers..."); 27 | Impresora.getImpresoras() 28 | .then(listaDeImpresoras => { 29 | refrescarNombreDeImpresoraSeleccionada(); 30 | loguear("Printers loaded"); 31 | limpiarLista(); 32 | listaDeImpresoras.forEach(nombreImpresora => { 33 | const option = document.createElement('option'); 34 | option.value = option.text = nombreImpresora; 35 | $listaDeImpresoras.appendChild(option); 36 | }) 37 | }); 38 | } 39 | 40 | const establecerImpresoraComoPredeterminada = nombreImpresora => { 41 | loguear("Setting printer..."); 42 | Impresora.setImpresora(nombreImpresora) 43 | .then(respuesta => { 44 | refrescarNombreDeImpresoraSeleccionada(); 45 | if (respuesta) { 46 | loguear(`Printer ${nombreImpresora} set successfully`); 47 | } else { 48 | loguear(`Cannot set the printer ${nombreImpresora}`); 49 | } 50 | }); 51 | }; 52 | 53 | const refrescarNombreDeImpresoraSeleccionada = () => { 54 | Impresora.getImpresora() 55 | .then(nombreImpresora => { 56 | $impresoraSeleccionada.textContent = nombreImpresora; 57 | }); 58 | } 59 | 60 | 61 | $btnRefrescarLista.addEventListener("click", obtenerListaDeImpresoras); 62 | $btnEstablecerImpresora.addEventListener("click", () => { 63 | const indice = $listaDeImpresoras.selectedIndex; 64 | if (indice === -1) return loguear("No printers") 65 | const opcionSeleccionada = $listaDeImpresoras.options[indice]; 66 | establecerImpresoraComoPredeterminada(opcionSeleccionada.value); 67 | }); 68 | 69 | $btnImprimir.addEventListener("click", () => { 70 | let impresora = new Impresora(RUTA_API); 71 | impresora.setFontSize(1, 1); 72 | impresora.setEmphasize(0); 73 | impresora.setAlign("center"); 74 | impresora.write("Parzibyte's blog\n"); 75 | impresora.write("A programmer's blog\n"); 76 | impresora.write("Phone: 123456789\n"); 77 | impresora.write("Timestamp: 2019-10-10 23:35:37\n"); 78 | impresora.write("--------------------------------\n"); 79 | impresora.write("Plugin premium version\n"); 80 | impresora.setAlign("right"); 81 | impresora.write("25 USD\n"); 82 | impresora.write("--------------------------------\n"); 83 | impresora.write("TOTAL: 25 USD\n"); 84 | impresora.write("--------------------------------\n"); 85 | impresora.setAlign("center"); 86 | impresora.write("***Thanks for your purchase!***"); 87 | impresora.cut(); 88 | impresora.cutPartial(); // use both because sometimes cut and/or cutPartial do not work 89 | impresora.end() 90 | .then(valor => { 91 | loguear("Response: " + valor); 92 | }) 93 | }); 94 | 95 | // En el init, obtenemos la lista 96 | obtenerListaDeImpresoras(); 97 | // Y también la impresora seleccionada 98 | refrescarNombreDeImpresoraSeleccionada(); -------------------------------------------------------------------------------- /en/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 11 | A plugin to print in thermal printers directly from browser | By 12 | Parzibyte 13 | 14 | 16 | 17 | 18 | 19 |
20 |
21 |
22 |

Print a ticket/receipt without browser dialog

23 | Español | English |By Parzibyte 24 |
25 | Finally a free plugin to send a ticket to thermal 26 | printer by using only JavaScript. Compatible with all 27 | modern browsers 28 |
29 |
30 |
31 |

How to use

32 |
    33 |
  1. Set up your thermal printer; you can install it as a 34 | generic printer or with its drivers
  2. 35 |
  3. Print a test from the control panel, i.e. check if 36 | your printer is working
  4. 37 |
  5. 38 | Share your printer. Look 40 | at this post 41 |
  6. 42 |
  7. Download 43 | the free plugin (it's the exe file) and open 44 | it. It will be executed in the background 45 | (if you want to stop it use the Task Manager) 46 |
  8. 47 |
  9. Optionally: Now you can go to the 48 | examples
  10. 49 |
  11. In your project, include the Impresora.js script
  12. 50 |
  13. Now you have the Impresora class; you 51 | can create a new instance
  14. 52 |
53 |
54 |
55 |

Limitations

56 |
    57 |
  • The plugin does not work in printers connected 58 | through the network, the plugin must be in the 59 | computer where the thermal printer is physically 60 | connected
  • 61 |
62 |
63 |
64 |

Examples

65 |
    66 |
  1. 67 | Show plugin 68 | capabilities 69 |
  2. 70 |
  3. 71 | Sale receipt 72 |
  4. 73 | 74 |
75 |
76 |
77 |

API REST

78 |
79 | 80 |

The plugin starts a web server in the port 8000 81 |
Feel free to check the source code of 82 | Impresora.js and the 83 | examples to see how to use the class 84 |

85 |
86 |

GET /impresoras

87 |

Get available printers

88 |

GET /impresora

89 |

Get selected thermal printer. It returns a empty string 90 | if none.

91 |

POST /imprimir

92 |

Print a document in the default printer. You must send an 93 | array of objects (encoded as JSON) with "accion" and 94 | "datos" keys; again, check the source code for more info

95 |

PUT /impresora

96 |

Set a printer. You must send a string encoded with JSON 97 | with the printer name (you can get it from GET 98 | /impresoras). 99 | If the printer is a thermal printer and everything is 100 | fine, a receipt will be printed. If not, please check 101 | your settings.

102 |
103 |
104 |

FAQ

105 |

Some faqs and issues

106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 117 | 122 | 123 | 124 | 126 | 132 | 133 | 134 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 146 | 147 | 148 | 149 | 152 | 153 | 154 | 156 | 161 | 162 | 163 | 164 | 167 | 168 | 169 |
Issue / questionExplanation
Error en el servidor: sql: no rows in result 116 | setThe printer has not been set, either because 118 | the action has not been performed or because 119 | there are no valid printers, remember that 120 | if you want to print ,first you must set the 121 | printer, and then try to print
I want to execute the plugin on the Windows 125 | Startup and hide the terminalIn the 127 | 0.6 version i have removed the terminal, if 128 | you want to start it when the system starts, 129 | put it on the startup folder; more info here. 131 |
I want to print special chars like 135 | áéí or ñThe plugin is not able to do it yet
I want to remove the header and footerGet the premium version
Premium version cost25 dollars.You get 3 domains to use the 145 | plugin, aditional domains are 2 dollars each
Payment methodPaypal on https://paypal.me/LuisCabreraBenito 151 |
Do I get some technical support when I buy 155 | the plugin?No, you just get a licence to use the 157 | plugin. I can only provide you with the docs 158 | and 159 | examples. However you can hire 160 | me
Does it work on Linux and Mac?It surely should work, but I have not tested 165 | it 166 | yet.
170 |
171 |
172 |
173 | 174 | 177 | 178 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 13 | 15 | 16 | Imprimir ticket desde JavaScript sin confirmación 17 | 18 | 20 | 21 | 22 | 23 |
24 |
25 |
26 |

Imprimir ticket desde JavaScript sin pedir confirmación

27 | Español | English |By Parzibyte 28 |
29 | Al fin un plugin gratuito que imprime usando JavaScript 30 | sin pedir confirmación ni nombre de la impresora 31 |
32 |
33 | Actualización ya existe la versión 35 | 2 de este plugin con soporte para texto con acentos e imágenes. 36 |
37 |
38 |
39 |

Modo de uso

40 |
    41 |
  1. Configura tu impresora térmica, instala sus drivers 42 | (ya sean genéricos o no)
  2. 43 |
  3. Imprime una página de impresión desde el panel de 44 | control, es decir, comprueba que tu impresora 45 | funciona antes de continuar
  4. 46 |
  5. 47 | Haz que tu impresora esté compartida. Mira este 49 | tutorial 50 |
  6. 51 |
  7. Descarga 52 | el plugin (ejecutable) y ábrelo; se 53 | ejecutará en segundo plano 54 | (puedes cerrarlo desde el administrador de tareas) 55 |
  8. 56 |
  9. Opcional: Ahora puedes ir a los 57 | ejemplos, no es necesario escribir código para 58 | probar
  10. 59 |
  11. En tu proyecto, incluye el archivo Impresora.js
  12. 60 |
  13. Ahora tienes la clase Impresora. Puedes crear una 61 | instancia de la misma
  14. 62 |
63 |
64 |
65 |

Limitaciones

66 |
    67 |
  • No funciona con impresoras en red. El plugin debe 68 | estar en la computadora en donde la impresora está 69 | presente físicamente
  • 70 |
71 |
72 | 106 |
107 |

API REST

108 |
109 | 110 |

El plugin inicia un servidor web en el puerto 8000 111 |
Recuerda que eres libre de analizar el archivo 112 | Impresora.js y los 113 | ejemplos para ver cómo se realiza esta comunicación 114 |

115 |
116 |

GET /impresoras

117 |

Obtiene la lista de impresoras disponibles

118 |

GET /impresora

119 |

Obtiene la impresora predeterminada. Regresa una cadena 120 | vacía si no hay impresora configurada

121 |

POST /imprimir

122 |

Imprime en la impresora predeterminada. Recibe un arreglo 123 | de objetos (codificado como JSON) que deben tener la 124 | propiedad "accion" y "datos"

125 | 126 |

PUT /impresora

127 |

Establece una impresora como predeterminada. Recibe una 128 | cadena codificada como JSON, indicando el nombre de la 129 | impresora (preferentemente obtenida de la lista). Si es 130 | correcto, se imprime un ticket de prueba y la impresora 131 | se convierte 132 | en predeterminada, si no, se indica y no se imprime 133 | ticket

134 |
135 |
136 |

FAQ

137 |

Aquí detallo algunas preguntas frecuentes y errores

138 |

Sobre los dominios

139 |

140 | Cuando obtiene la versión premium del plugin, tiene derecho a 3 dominios o subdominios. 141 | Cada dominio o subdominio cuentan por separado, y los subdominios de un dominio no están incluidos 142 | al registrar un dominio. También se toman por separado los puertos. Así que, por ejemplo, los 143 | siguientes dominios cuentan como separados: 144 |

    145 |
  • ejemplo.com
  • 146 |
  • subdominio.ejemplo.com
  • 147 |
  • ejemplo.com:8080
  • 148 |
149 | Puede igualmente registrar a localhost, solo tome en cuenta los puertos. Pues los siguientes dominios 150 | cuentan como separados 151 |
    152 |
  • localhost
  • 153 |
  • localhost:7000
  • 154 |
  • localhost:8080
  • 155 |
156 | Por poner otro ejemplo, los siguientes dominios cuentan como separados debido a que son distintos 157 | puertos 158 |
    159 |
  • ejemplo.com
  • 160 |
  • ejemplo.com:1000
  • 161 |
  • ejemplo.com:4000
  • 162 |
163 | Finalmente veamos un ejemplo de 3 dominios/subdominios distintos: 164 |
    165 |
  • 166 | pruebas.parzibyte.me 167 |
  • 168 |
  • parzibyte.me
  • 169 |
  • parzibyte.me:8080
  • 170 |
171 |
172 | Si anteriormente ha agregado un dominio y desea cambiarlo, el cambio tiene un costo, pues no hay forma 173 | de que yo elimine (de manera remota) 174 | el plugin que le envié anteriormente. 175 |
176 | Nota: también puede registrar un dominio con subdominios ilimitados. Cada dominio se 177 | incluye a sí mismo y a todos los subdominios 178 | del mismo. El costo es de 25 USD por cada dominio. Recuerde que igualmente puede registrar 179 | Dominios o subdominios adicionales por 2.5 USD o 40 MXN 180 |

181 |

Preguntas y respuestas

182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 193 | 200 | 201 | 202 | 205 | 212 | 213 | 214 | 216 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 230 | 231 | 232 | 233 | 235 | 236 | 237 | 238 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 264 | 271 | 272 | 273 | 274 | 279 | 280 | 281 | 282 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 293 | 300 | 301 | 302 |
Pregunta / problemaExplicación / respuesta
Error en el servidor: sql: no rows in result 192 | setNo se ha establecido la impresora, ya sea 194 | porque no se ha realizado la acción o porque 195 | no hay impresoras válidas, recuerda que si 196 | quieres imprimir primero debes establecer la 197 | impresora, y luego imprimir.
También puedes usar el método 198 | imprimirEnImpresora("nombreDeImpresoraAquí") 199 |
Quiero que el plugin se ejecute al 203 | iniciar Windows, y que no aparezca la 204 | consolaEn la versión 207 | 0.6 he desaparecido la consola, 208 | basta con agregar el ejecutable al 209 | startup folder. Más información aquí. 211 |
Quiero imprimir caracteres especiales 215 | como áéí o la letra ñPor el momento no es posible imprimir 217 | estos caracteres especiales ni con la 218 | versión premium
Quiero remover el pie y el encabezadoConsigue la versión premium
Costo de la versión premium500 pesos Mexicanos (aproximadamente 26 dólares). Con la versión premium se 227 | remueve el encabezado y pie. Obtienes 228 | licencia para 3 dominios/subdominios, cada dominio/subdominio 229 | adicional cuesta 40 pesos mexicanos (aproximadamente 2.5 dólares)
Método de pagoAquí los puedes ver: Pagos 234 | y venta de software
Proceso de compraRealiza el pago en los medios listados anteriormente, después envíame un correo en mi 239 | página de contacto con los 3 dominios/subdominios que usarás
¿Es un pago único?
El costo es muy elevadoLo siento, es una forma de cobrar por el 248 | trabajo que realizo (el reconocimiento y 249 | las estrellas de GitHub no pagan mis 250 | gastos). Además, también me gusta el open 251 | source, puedes ver los proyectos 253 | que he 254 | creado y por los que no cobro ni un 255 | peso
¿Hay descuentos o promociones?No
¿Al comprar la versión premium obtengo 263 | soporte por algún tiempo?No, solo obtienes una licencia para usar 265 | el plugin. El máximo soporte que puedo 266 | dar es la documentación y los ejemplos, 267 | lo demás es responsabilidad del 268 | desarrollador. Sin embargo, puedes contratarme 270 | para que lo adapte a tu sistema
¿Funciona en Linux y Mac?Sí; teóricamente, solo que no lo he 275 | probado porque no he tenido la 276 | necesidad, pero estoy un 99.99 % seguro 277 | de 278 | que sí
Abrir el cajón de dineroInvoca al método cash dentro de tu objeto que instancia de la clase 283 | Impresora 284 |
Imprimir imagen o logotipoPor el momento no es posible
¿Es compatible con impresoras que no sean térmicas? por ejemplo, de tinta, láser, 292 | etcéteraNo. Es compatible únicamente con impresoras térmicas. 294 | Si quieres imprimir a otras impresoras puede que quieras generar un PDF y enviarlo a 295 | imprimir 296 | usando 298 | mi otro plugin 299 |
303 |
304 |
305 |

Proceso de compra

306 |
    307 |
  1. Realice el pago en Paypal. Puede hacerlo por 308 | 500 MXN o por 25 USD
  2. 309 |
  3. Envíeme un correo o mensaje indicando el correo 310 | desde donde realizó el pago e indíqueme los 311 | dominios en donde usará el plugin. Si no cuenta con la lista de los 3 dominios, no importa, 312 | puede comenzar con uno o dos, y agregar el resto más tarde
  4. 313 |
  5. Yo confirmaré el pago y le enviaré el plugin lo más pronto posible
  6. 314 |
315 | Por favor, lea bien y responda sus dudas antes de proceder al pago, pues no hago 316 | reembolsos 317 |
318 | 319 |
320 |
321 | 324 | 325 | 326 | --------------------------------------------------------------------------------