├── .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 | 
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 | Selecciona tu impresora
34 |
35 |
36 |
37 | Tamaño del código de barras
38 |
39 | 80
40 | 100
41 | 156
42 | 200
43 | 300
44 | 350
45 |
46 |
47 |
48 | Tipo de código de barras
49 |
50 | Barcode128
51 | Barcode39
52 | Barcode93
53 | BarcodeEAN
54 | Barcode 2 of 5 SIN interleaved
55 | Barcode 2 of 5 interleaved
56 | BarcodeCodabar
57 | UPC A
58 | UPC E
59 |
60 |
61 |
62 | Contenido del código de barras
63 |
65 |
66 |
67 | Imprimir
68 | en impresora seleccionada
69 |
70 |
71 |
72 |
73 |
Log
74 |
Limpiar
75 | log
76 |
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 |
29 |
30 |
31 |
32 |
Ajustes de impresora
33 |
Nombre de impresora seleccionada:
34 |
35 |
36 |
37 |
38 |
Refrescar lista
39 |
Establecer como predeterminada
40 |
Capacidades
41 |
Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:
42 |
Imprimir ticket
43 |
44 |
45 |
46 |
Log
47 |
Limpiar log
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 | Imprimir
46 | en impresora seleccionada
47 |
48 |
49 |
50 |
Log
51 |
Limpiar
52 | log
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 | Imprimir
49 | en impresora seleccionada
50 |
51 |
52 |
53 |
Log
54 |
Limpiar
55 | log
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 | Imprimir
45 | en impresora seleccionada
46 |
47 |
48 |
49 |
Log
50 |
Limpiar
51 | log
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 | Obtener impresoras
38 |
39 |
40 |
41 |
Log
42 |
Limpiar
43 | log
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 | Selecciona tu impresora
34 |
35 |
36 |
37 | Contenido del código QR
38 |
40 |
41 |
42 | Imprimir
43 | en impresora seleccionada
44 |
45 |
46 |
47 |
48 |
Log
49 |
Limpiar
50 | log
51 |
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 |
30 |
31 |
32 |
33 |
Ajustes de impresora
34 |
Nombre de impresora seleccionada:
35 |
36 |
37 |
38 |
39 |
Refrescar lista
40 |
Establecer como predeterminada
41 |
Capacidades
42 |
Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:
43 |
Imprimir ticket
44 |
45 |
46 |
47 |
Log
48 |
Limpiar log
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 |
29 |
30 |
31 |
32 |
Ajustes de impresora
33 |
Nombre de impresora seleccionada:
34 |
35 |
36 |
37 |
38 |
Refrescar lista
39 |
Establecer como predeterminada
40 |
Capacidades
41 |
Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:
42 |
Imprimir ticket
43 |
44 |
45 |
46 |
Log
47 |
Limpiar log
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 |
29 |
30 |
31 |
32 |
Ajustes de impresora
33 |
Nombre de impresora seleccionada:
34 |
35 |
36 |
37 |
38 |
Refrescar lista
39 |
Establecer como predeterminada
40 |
Ticket de prueba
41 |
Utiliza el siguiente botón para imprimir un recibo de prueba en la impresora predeterminada:
42 |
Imprimir ticket
43 |
44 |
45 |
46 |
Log
47 |
Limpiar log
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 |
34 |
35 |
36 |
37 |
Printer settings
38 |
Selected printer:
39 |
40 |
41 |
42 |
43 |
Refresh list
45 |
Set as default printer
47 |
Capabilities
48 |
Click the button to print a test ticket in the default printer:
49 |
Print ticket
50 |
51 |
52 |
Log
53 |
Clear
54 | log
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 |
33 |
34 |
35 |
Printer settings
36 |
Selected printer:
37 |
38 |
39 |
40 |
41 |
Refresh list
43 |
Set as default printer Sale
45 | receipt example
46 |
Click the button to print a sale receipt in default
47 | printer:
48 |
Print
49 | ticket
50 |
51 |
52 |
53 |
Log
54 |
Clear
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 | Set up your thermal printer; you can install it as a
34 | generic printer or with its drivers
35 | Print a test from the control panel, i.e. check if
36 | your printer is working
37 |
38 | Share your printer. Look
40 | at this post
41 |
42 | 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 |
47 | Optionally: Now you can go to the
48 | examples
49 | In your project, include the Impresora.js script
50 | Now you have the Impresora
class; you
51 | can create a new instance
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 |
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 | Issue / question
110 | Explanation
111 |
112 |
113 |
114 |
115 | Error en el servidor: sql: no rows in result
116 | set
117 | The 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
122 |
123 |
124 | I want to execute the plugin on the Windows
125 | Startup and hide the terminal
126 | In 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 |
132 |
133 |
134 | I want to print special chars like
135 | áéí or ñ
136 | The plugin is not able to do it yet
137 |
138 |
139 | I want to remove the header and footer
140 | Get the premium version
141 |
142 |
143 | Premium version cost
144 | 25 dollars.You get 3 domains to use the
145 | plugin, aditional domains are 2 dollars each
146 |
147 |
148 | Payment method
149 | Paypal on https://paypal.me/LuisCabreraBenito
151 |
152 |
153 |
154 | Do I get some technical support when I buy
155 | the plugin?
156 | 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
161 |
162 |
163 | Does it work on Linux and Mac?
164 | It surely should work, but I have not tested
165 | it
166 | yet.
167 |
168 |
169 |
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 | Configura tu impresora térmica, instala sus drivers
42 | (ya sean genéricos o no)
43 | Imprime una página de impresión desde el panel de
44 | control, es decir, comprueba que tu impresora
45 | funciona antes de continuar
46 |
47 | Haz que tu impresora esté compartida. Mira este
49 | tutorial
50 |
51 | Descarga
52 | el plugin (ejecutable) y ábrelo; se
53 | ejecutará en segundo plano
54 | (puedes cerrarlo desde el administrador de tareas)
55 |
56 | Opcional: Ahora puedes ir a los
57 | ejemplos, no es necesario escribir código para
58 | probar
59 | En tu proyecto, incluye el archivo Impresora.js
60 | Ahora tienes la clase Impresora. Puedes crear una
61 | instancia de la misma
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 | Pregunta / problema
186 | Explicación / respuesta
187 |
188 |
189 |
190 |
191 | Error en el servidor: sql: no rows in result
192 | set
193 | No 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 |
200 |
201 |
202 | Quiero que el plugin se ejecute al
203 | iniciar Windows, y que no aparezca la
204 | consola
205 | En 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 |
212 |
213 |
214 | Quiero imprimir caracteres especiales
215 | como áéí o la letra ñ
216 | Por el momento no es posible imprimir
217 | estos caracteres especiales ni con la
218 | versión premium
219 |
220 |
221 | Quiero remover el pie y el encabezado
222 | Consigue la versión premium
223 |
224 |
225 | Costo de la versión premium
226 | 500 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)
230 |
231 |
232 | Método de pago
233 | Aquí los puedes ver: Pagos
234 | y venta de software
235 |
236 |
237 | Proceso de compra
238 | Realiza 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
240 |
241 |
242 | ¿Es un pago único?
243 | Sí
244 |
245 |
246 | El costo es muy elevado
247 | Lo 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
256 |
257 |
258 | ¿Hay descuentos o promociones?
259 | No
260 |
261 |
262 | ¿Al comprar la versión premium obtengo
263 | soporte por algún tiempo?
264 | 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
271 |
272 |
273 | ¿Funciona en Linux y Mac?
274 | 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í
279 |
280 |
281 | Abrir el cajón de dinero
282 | Invoca al método cash
dentro de tu objeto que instancia de la clase
283 | Impresora
284 |
285 |
286 |
287 | Imprimir imagen o logotipo
288 | Por el momento no es posible
289 |
290 |
291 | ¿Es compatible con impresoras que no sean térmicas? por ejemplo, de tinta, láser,
292 | etcétera
293 | No. 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 |
300 |
301 |
302 |
303 |
304 |
305 |
Proceso de compra
306 |
307 | Realice el pago en Paypal . Puede hacerlo por
308 | 500 MXN o por 25 USD
309 | 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
313 | Yo confirmaré el pago y le enviaré el plugin lo más pronto posible
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 |
--------------------------------------------------------------------------------