DEV Community

Retro-imprimiendo (y II)

En la década de los 80 y 90 del siglo pasado (el siglo XX), era muy típico imprimir utilizando interfaces de tipo paralelo, o serie. En aquella época, el estándar USB no existía, y, en cualquier caso, la impresión era muy, muy distinta a como es hoy en día, que básicamente se basa en imprimir una imagen, incluso cuando lo que se está imprimiendo es texto puro.

Pero no nos desviemos. Las impresoras de aquella época imprimían en verdadero modo texto. Es decir, les mandabas un texto, y los caracteres (no sus mapas de bits), viajaban por el cable entre el ordenador y la impresora, imprimiéndose directamente. Lo que controlaba el aspecto del texto (lo que hoy conocemos como font, y traducimos como fuente), eran unos dips o palanquitas de configuración de la impresora. Así, y según lo completa que fuera la impresora, podrías elegir entre Times New Roman o Helvetia, por poner un ejemplo. Si es que existían en aquella época, claro. También se utilizaban para establecer la página de códigos para el idioma utilizado, como por ejemplo Latin-1 para Español.

Una vez que nos poníamos a imprimir, el texto podía controlarse mediante códigos de impresión. Algunos eran estándar ASCII, pero había otros más elaborados que veremos a continuación.

Código Significado
8 BS - Back Space, borrado hacia atrás
9 HT - Horizontal Tab, tabulador
10 LF - Line Feed, salto de línea
12 FF - Form Feed, salto de página
13 CR - Carriage return, retorno de carro

Como comentábamos en la anterior entrega, realmente en estas impresoras (de ellas las más conocidas eran las matriciales), tenían un carro que era el que se movía para imprimir por la página, de ahí la diferencia entre CR y LF.

También como vimos, podemos imprimir directamente con print.py desde línea de comando con:

$ python print.py --send "¡Hola, mundo!^v"
Enter fullscreen mode Exit fullscreen mode

El código ^v es entendido por el programa como el carácter número 12, por lo que se imprimirá el mensaje de saludo, y después saldrá la página de la impresora. Esto código 12 al principio era innecesario, pues el usuario podía manipular directamente el rodillo de alimentación de papel (sí, se parecía mucho a una máquina de escribir). Pero se fue haciendo particularmente útil con las impresoras modernas, que tienen un buffer de impresión que, si no se llena (y tampoco se alcanza el final de página), aparentemente no pasa nada, de manera frustrante.

Pero la impresora manejaba más que estos códigos, y seguía haciéndolo utilizando la manera estándar que proporcionan los códigos ASCII por debajo de 32: utilizando el código 27. Efectivamente, también es el código de la tecla de escape. La idea es que, anteponiendo ESC a la secuencia de códigos, se pueden definir las secuencias de código de control que se desee. El fabricante EPSON creó las secuencias de códigos de control de impresión ESC/P, es decir, Epson Standard Code for Printers, que se hicieron muy, muy populares. Por supuesto, tenía que haber otro estándar (estándares de facto, claro), apareciendo la competencia: las secuencias de códigos de control de impresión de IBM. Estos códigos de control estaban sobre todo dedicados a las impresoras de los grandes ordenadores o mainframes, siendo ESC/P el estándar más popular para el IBM PC y compatibles.

El sistema de secuencias de control ESC/P se configuraba a partir del código ESC. En el programa anterior print.py, ESC se representa como ^], algo muy habitual en la época. Así, a continuación podemos ver una tabla con los códigos más habituales.

Código Enviar Significado
ESC E ^]E Comienzo del texto en negrita.
ESC F ^]F Fin del texto en negrita.
ESC 4 ^]4 Comienzo del texto en itálica.
ESC 5 ^]5 Fin del texto en itálica.
ESC - ^]- Comienzo o fin de subrayado.
ESC W 0 ^]W0 Comienzo de caracteres de doble ancho.
ESC W 1 ^]W1 Fin de caracteres de doble ancho.
ESC SI ^]SI Comienzo de caracteres comprimidos.
DC2 ^DC2 Fin de los caracteres comprimidos.

Efectivamente, podíamos especificar caracteres con el doble de ancho (permitiendo hasta 40 caracteres por línea), o caracteres comprimidos (alcanzando las 120 columnas, un modo muy popular para informes).

Así que, si ejecutamos:

$ python print.py --send "¡Hola, ^]EMundo^]F!^V"
Enter fullscreen mode Exit fullscreen mode

¿Obtendremos en el papel: "¡Hola, mundo!"?

Por desgracia, no. Las impresoras modernas han eliminado de sus firmwares el soporte para ESC/P. En su mayoría, las impresoras que lo soportan hoy en día son impresoras de tickets. Las impresoras modernas "normales", a veces lo soportan configurándolas previamente como en modo de línea o modo texto. También hay que recordar que las impresoras láser nacieron soportando PostScript, por lo que esos modelos nunca han tenido la necesidad de soportar ESC/P.

Así que, si quieres practicar retro-impresión, solo puedes hacerlo adquiriendo una impresora de tickets que indique que es compatible con ESC/POS (la variante moderna de ESC/P, especializada en POS, Point Of Sale o punto de venta). ESC/POS tiene muchos códigos nuevos como abrir el monedero, por ejemplo, pero los básicos de la tabla anterior siguen siendo soportados.

La mejor forma es adquirir una impresora matricial propiamente. Puede ser una impresora retro de los 80 o 90, adquirida a través de aplicaciones especializadas en productos de segunda mano como eBay o Wallapop. Pero todavía las hay modernas, tanto de tickets como de tamaño folio (DIN A4). Por ejemplo, en el momento de escribir este texto, la Epson LX-350, o la OKI 3320ECO son de tamaño folio y soportan ESC/P.

Top comments (0)