viernes, 29 de septiembre de 2017

Impresión

Tras pasar el último par de capítulos manipulando texto, es hora de poner ese texto en un papel. En este capítulo, veremos las herramientas de línea de comandos que se usan para imprimir archivos y controlar la operación de impresión. No veremos como configurar la impresión, ya que varía según la distribución y normalmente se configura automáticamente durante la instalación. Fíjate que necesitaremos un impresora funcionando y configurada para realizar los ejercicios de este capítulo.
Veremos los siguientes comandos:

  • pr - Convierte archivos de texto para imprimir
  • lpr - Imprime archivos
  • a2ps - Formatea archivos para imprimir en una impresora PostScript
  • lpstat - Muestra la información de estado de la impresora
  • lpq - Muestra el estado de la cola de impresión
  • lprm - Cancela trabajos de impresión
Una breve historia de la impresión

Para entender completamente las características de impresión que encontramos en los sistemas operativos como-Unix, tenemos que aprender antes algo de historia. Imprimir en los sistemas como-Unix nos lleva de vuelta al origen del sistema operativo en sí. En aquellos días, las impresoras y su uso eran muy diferentes a hoy.

Imprimiendo en los tiempos oscuros

Como los propios ordenadores, las impresoras en la era pre-PC tendían a ser grandes, caras y centralizadas. El típico usuario de ordenador de 1980 trabajaba en un terminal conectado a un ordenador que estaba a cierta distancia. La impresora se encontraba cerca del ordenador y estaba bajo los ojos vigilantes de los operadores del ordenador.

Cuando las impresoras eran caras y centralizadas, como lo eran a menudo en los primeros tiempos de Unix, era una práctica común para muchos usuarios compartir una impresora. Para identificar los trabajos de impresión pertenecientes a un usuario en particular, se imprimía a menudo una página cabecera mostrando el nombre del usuario al principio de cada trabajo de impresión. El equipo de soporte del ordenador cargaría entonces un carro con los trabajos de impresión del día y los enviaría a cada usuario individual.

Impresoras basadas en caracteres


La tecnología de impresión de los 80 era muy diferente en dos aspectos. Primero, las impresoras de dicho periodo eran casi todas impresoras de impacto. Las impresoras de impacto usan un mecanismo mecánico que golpea una cinta contra el papel para formar impresiones de caracteres en la página. Dos de las tecnologías populares de aquella época eran la impresión de margarita y la impresión por matriz de puntos.

La segunda, y más importante característica de las primeras impresoras era que las impresoras usaban una colección limitada de caracteres que era intrínseca al propio dispositivo. Por ejemplo, una impresora de margarita sólo podía imprimir los caracteres que estaban moldeados en los pétalos de la margarita. Esto hacía que las impresoras fueran casi como máquinas de escribir de alta velocidad. Como la mayoría de máquinas de escribir, imprimían usando fuentes mono espacio (de anchura fija). Esto significa que cada carácter tiene la misma anchura. La impresión se realizaba en posiciones fijas de la página, y el área imprimible de una página contenía un número fijo de caracteres. La mayoría de las impresoras imprimían diez caracteres por pulgada (CPI) horizontalmente y seis líneas por pulgada (LPI) verticalmente. Usando este esquema, una hoja de papel tamaño US-letter tenía 85 caracteres de ancho y 66 líneas de ancho. Teniendo en cuenta un pequeño margen a cada lado, se consideraba que 80 caracteres era el ancho máximo de una línea impresa. Esto explica porque las pantallas de terminales (y nuestros emuladores de terminal) tienen normalmente 80 caracteres de ancho. Proporciona una vista WYSIWYG (What you see is what you get - Lo que ves es lo que obtendrás) de la salida impresa, usando una fuente mono espacio.

Los datos son enviados a una impresora tipo máquina de escribir en una cadena simple de bytes que contiene los caracteres a imprimir. Por ejemplo, para imprimir una "a", se envía el código ASCII de carácter 97. Además, los códigos de control ASCII con número bajos proporcionan un medio de mover el carro de la impresora y el papel, usando códigos para retorno de carro, salto de línea, salto de página, etc. Usando los códigos de control, es posible conseguir efectos de texto limitados, como negrita, haciendo a la impresora imprimir un carácter, un paso atrás, e imprimir el carácter de nuevo para conseguir una impresión más oscura en la página. En realidad podemos comprobar ésto si usamos nroff para renderizar una man page y ver la salida usando cat -A:

[me@linuxbox ~]$ zcat /usr/share/man/man1/ls.1.gz | nroff -man | cat -A | head
LS(1)                       User Commands                           LS(1)
$
$
$
N^HNA^HAM^HME^HE$
       ls - list directory contents$
$
S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS$
       l^Hls^Hs [_^HO_^HP_^HT_^HI_^HO_^HN]... _^HF_^HI_^HL_^HE]...$

Los caracteres ^H (Control-h) son dos pasos atrás usados para crear el efecto negrita. De igual forma, podemos ver una secuencia paso atrás/subrayado para producir un subrayado.

Impresoras gráficas

El desarrollo de GUIs condujo a grandes cambios en la tecnología de impresión. Como los ordenadores evolucionaron a pantallas más basadas en imágenes, la impresión evolucionó de técnicas basadas en caracteres a otras basadas en gráficos. Esto fue ayudado por la llegada de impresoras láser de bajo costo que, en lugar de imprimir caracteres fijos, podían imprimir diminutos puntos en cualquier parte del área imprimible de la página. Esto hizo posible la impresión de fuentes proporcionales (como las usadas en los teletipos) e incluso fotografías y diagramas de alta resolución.

Sin embargo, evolucionar de un esquema basado en caracteres a otro basado en gráficos requería un desafío tecnológico formidable. Aquí está el por qué: El número de bytes necesarios para llenar una página usando una impresora basada en caracteres podía calcularse de esta forma (asumiendo 60 líneas por página cada una con 80 caracteres):

60 X 80 = 4800 bytes

En comparación, una impresora de 300 puntos por pulgada (DPI) (asumiendo un área de impresión por página de 8 por 10 pulgadas) requiere:

(8 X 300) X (10 X 300) / 8 = 900000 bytes

Muchas de las lentas redes de PC simplemente no podían soportar el casi un megabyte de datos requeridos para imprimir una página completa en una impresora láser, así que estaba claro que se necesitaba una invención ingeniosa.

Esa invención resultó ser el lenguaje de descripción de página (PDL - page descriptión language). Un lenguaje de descripción de página es un lenguaje de programación que describe el contenido de una página. Básicamente dice, "ve a esta posición, dibuja del carácter 'a' en Helvetica de 10 puntos, ve a esta posición..." hasta que todo lo que haya en la página haya sido descrito. El primer gran PDL fue PostScript de Adobe Systems, que todavía está en uso hoy en día. El lenguaje PostScript es un lenguaje de programación completo adaptado a tipografía y otros tipos de gráficos e imágenes. Incluye soporte integrado para 35 fuentes estándar de gran calidad, más la capacidad de aceptar definiciones de fuentes adicionales al ejecutarse. De principio, el soporte para PostScript está incluido en las propias impresoras. Ésto solucionaba el problema de la transmisión de datos. Aunque el típico programa PostScript era muy verbal en comparación a la simple cadena de caracteres de las impresoras basadas en caracteres, era mucho más pequeño que el número de bytes requeridos para representar la página impresa completa.

Una impresora PostScript acepta un programa PostScript como entrada. La impresora cuenta con su propio procesador y memoria (haciendo que a veces la impresora sea más potente que el ordenador al que está conectada) y ejecuta un programa especial llamadointérprete PostScript, que lee el programa PostScript entrante y renderiza el resultado en la memoria interna de la impresora, que forma el patrón de bits (puntos) que serán transferidos al papel. El nombre genérico de este proceso de renderizar algo a un gran patrón de puntos (llamado bitmap) es raster image processor o RIP.

Según pasaron los años, tanto los ordenadores como las redes se hicieron mucho más rápidas. Esto permitió mover el RIP del la impresora al ordenador, que, a cambio, permitió que las impresoras de gran calidad fueran mucho menos caras.

Muchas impresoras hoy todavía aceptan cadenas basadas en caracteres, pero muchas impresoras de bajo coste no. Confían en el RIP del ordenador para que les proporcione una cadena de bits para imprimir como puntos. Todavía hay algunas impresoras PostScript, también.

Imprimiendo con Linux

Los sistemas Linux modernos emplean dos paquetes de software para realizar y gestionar impresiones. El primero, CUPS (Common Unix Printing System - Sistema Común de Impresión Unix) proporciona controladores de impresión y gestión de trabajos de impresión, y el segundo, Ghostscript, un interprete PostScript, actúa como un RIP.

CUPS gestiona impresoras creando y manteniendo colas de impresión. Como vimos en nuestra lección de historia anterior, la impresión Unix fue originalmente diseñada para manejar una impresora central compartida por múltiples usuarios. Como las impresoras son lentas por naturaleza, comparadas con los ordenadores que las alimentan, los sistemas de impresión necesitan un modo de programar múltiples trabajos de impresión y mantener las cosas organizadas. CUPS también tiene la capacidad de reconocer diferentes tipos de datos (dentro de lo razonable) y puede convertir archivos a una forma imprimible.


Preparando archivos para imprimir

Como usuarios de la línea de comandos, estamos principalmente interesados en imprimir texto, aunque es realmente posible imprimir otros formatos de datos también.


pr - Convierte archivos de texto para imprimir

Vimos un poco sobre pr en el capítulo anterior. Ahora examinaremos algunas de sus muchas opciones usadas junto a la impresión. En nuestra historia de la impresión, vimos como las impresoras basadas en caracteres usan fuentes mono espacio, que producen números fijos de caracteres por línea y líneas por página. pr se usa para ajustar texto para encajarlo en un tamaño específico de página, con encabezados y márgenes opcionales. Aquí hay un sumario de sus opciones más comúnmente usadas:

Opciones comunes de pr

+first[:last] 

Genera un rango de páginas que comienza con first y , opcionalmente termina con last.

-columns 
Organiza el contenido de la página en el número de columnas especificado por columns.
-a 
Por defecto, la salida multicolumna se lista verticalmente. Añadiendo la opción -a (across), el contenido se lista horizontalmente.

-d Salida a doble espacio.

-D "format" Formatea la fecha mostrada en los encabezados de página usando format. Mira la man page del comando date para ver una descripción de la cadena format.

-f Usa saltos de página en lugar de retornos de carro para separar páginas.

-h "header" 
En la porción central del encabezado de página, usa headeren lugar del nombre del archivo que está siendo procesado.

-l lenght 
Establece la longitud de página a length. Por defecto es 66 (Tamaño US letter a 6 líneas por pulgada)

-n 
Numera las líneas.

-o offset 
Crea un margen izquierdo de offset caracteres de ancho.

-w width 

Establece el ancho de página a witdth. Por defecto es 72.

pr se usa a menudo como filtro en entubados. En este ejemplo, produciremos un listado del directorio /usr/bin y los formatearemos paginado en 3 columnas usando pr:

[me@linuxbox ~]$ ls /usr/bin | pr -3 -w 65 | head



2009-02-18 14:00                                  
Page 1

[                apturl               bsd-write            
411toppm         ar                   bsh
a2p              arecord              btcflash
a2ps             arecordmidi          bug-buddy
a2ps-lpr-wrapper ark                  buildhash

Enviando un trabajo de impresión a una impresora

La suite de impresión CUPS soporta dos métodos para imprimir usados históricamente en sistemas como-Unix. Un método, llamado Berkeley o LPD (usado en la versión de Unix Berkeley Software Distribution), usa el programa lpr, mientras que el otro método, llamado SysV (De la versión de Unix System V), usa el programa lp. Ambos programas hacen básicamente lo mismo. Usar uno u otro es cuestión de gustos.

lpr - Imprime archivos (Estilo Berkeley)

El programa lpr puede usarse para enviar archivos a la impresora. También puede usarse en entubados, ya que acepta entrada estándar. Por ejemplo, para imprimir resultados de nuestro directorio multicolumna listado antes, podríamos hacer ésto:

 [me@linuxbox ~]$ ls /usr/bin | pr -3 | lpr

y el informe será enviado a la impresora por defecto del sistema. Para enviar el archivo a una impresora distinta, puede usarse la opción -P así:

 lpr -P nombre_impresora
donde nombre_impresora es el nombre de la impresora que queremos. Para ver una lista de impresoras conocidas por el sistema:

 [me@linuxbox ~]$ lpstat -a

Consejo: Muchas distribuciones Linux permiten definir una "impresora" que produce archivos en PDF (Portable Document Format - Formato de Documento Portable), en lugar de imprimirla en la impresora física. Esto es muy útil para experimentar con comandos de impresión. Comprueba tu programa de configuración de impresora para ver si soporta esta configuración. En algunas distribuciones, puedes necesitar instalar paquetes adicionales (como cups-pdf) para habilitar esta capacidad.

Aquí tienes algunas de las opciones comunes de lpr:

Opciones comunes de lpr

-# número
Establece el número de copias a número.


-p

Imprime cada página con una cabecera sombreada con la fecha, hora, nombre del trabajo y número de página. Esta opción denominada "impresión bonita" puede usarse cunado imprimimos archivos de texto.

-P impresora
Especifica el nombre de la impresora usada para la salida. Si no se especifica una impresora, se usa la impresora por defecto del sistema.

-r
Borra archivos tras imprimirlos. Esto sería útil para programas que producen archivos temporales de impresora.

lp - Imprime archivos (Estilo System V)

Como lpr, lp acepta tanto archivos como entrada estándar para imprimir. Se diferencia de lpr en que soporta una colección de opciones diferente (y algo más sofisticada). Aquí tenemos las opciones comunes:

Opciones comunes de lp

-d impresora
Establece el destino (impresora) a impresora. Si no se especifica la opción d, se usa la impresora por defecto del sistema.


-n número
Establece el número de copias a número.

-o landscape
Establece la salida a orientación apaisada.

-o fitplot
Escala el archivo para encajarlo a la página. Esto es útil cuando imprimimos imágenes, como archivos JPEG.

-o scaling=número
Escala el archivo a número. El valor 100 rellena la página. Los valores menores de 100 se reducen, mientras que los valores mayores de 100 hacen que esl archivo se imprima en varias páginas.

-o cpi=número
Establece los caracteres por pulgada de salida a número. La opción por defecto es 10.

-o lpi=número
Establece las líneas por pulgada de salida a número. La opción por defecto es 6.

-o page-bottom=puntos
-o page-left=puntos
-o page-right=puntos
-o page-top=puntos
Establece los márgenes de página. Los valores se expresan en puntos, una unidad de medida tipográfica. Hay 72 puntos en una pulgada.

-P páginas
Especifica la lista de páginas. Las páginas pueden expresarse como una lista separada por comas y/o un rango. Por ejemplo "1,3,5,7-10"

Generaremos nuestro listado de directorio de nuevo, esta vez imprimiendo 12 CPI y 8 LPI con un margen izquierdo de media pulgada. Fijate que hemos ajustado las opciones de pr para que cuente para el nuevo tamaño de página:

[me@linuxbox ~]$ ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi=12 -o lpi=8

Este entubado produce un listado de cuatro columnas usando un tamaño de letra más pequeño que el que viene por defecto. El incremento de número de caracteres por pulgada nos permite ajustar más columnas en la página.


Otra opción: a2ps

El programa a2ps es interesante. Como podemos suponer por su nombre, es un programa de conversión de formatos, pero también es algo más. Su nombre originalmente significa "ASCII to PostScript - ASCII a PostScript" y se usaba para preparar archivos de texto para imprimir en impresoras PostScript. A lo largo de los años, sin embargo, las capacidades del programa han crecido, y ahora su nombre significa "Cualquier cosa a PostScript". Mientras que su nombre nos sugiere un programa de conversión de formatos, es realmente un programa de impresión. Manda su salida por defecto a la impresora predeterminada del sistema en lugar de a la salida estándar. El comportamiento del programa por defecto es como el de una "impresora bonita", lo que significa que mejora la apariencia de la salida. Si usamos el programa para crear un archivo PostScript en nuestro escritorio:

[me@linuxbox ~]$ ls /usr/bin | pr -3 -t | a2ps -o ~/Desktop/ls.ps -L 66
[stdin (plain): 11 pages on 6 sheets]

[Total: 11 pages on 6 sheets] saved into the file `/home/me/Desktop/ls.ps'

Aquí filtramos la cadena con pr, usando la opción -t (que omite encabezados y pies) y luego con a2ps, especificamos un archivo de salida (opción -o) y 66 líneas por página (opción -L) para igualar la paginación de pr. Si vemos el archivo resultante con un visor de archivos adecuado, veremos esto:


Viendo la salida de a2ps


Como podemos ver, la plantilla de salida por defecto es en formato dos páginas por hoja. Esto provoca que el contenido de dos pagínas se impriman en cada hoja de papel. a2psaplica bonitos encabezados y pies de página también.

a2ps tiene muchas opciones. Aquí tenemos un sumario:

--center-tittletexto
Establece el título del centro de la página a texto.

--columns número
Ordena páginas en número columnas. La opción por defecto 2.

--footer texto
Establece el pie de página a texto.

--guess
Muestra los tipo de archivos dados como argumentos. Como a2ps trata de convertir todos los tipos de datos, esta opción puede ser útil para predecir que hará a2ps cuando se le de un archivo en particular.

--left-footertexto
Establece el pie izquierdo de la página a texto.

--left-titletexto
Establece el título izquierdo de la página a texto.

--line-numbers=intervalo
Numera las líneas de salida cada intervalo líneas.

--list=defaults
Muestra la configuración por defecto.

--list=tema
Muestra las configuración de tema, donde tema es uno de los siguientes: delegaciones (programas externos que se usarán para convertir datos), codificación, características, variables, medios (tamaño de papel y similares), ppd (descripciones de impresora PostScript), impresoras, prólogos (porciones de código que aparecen antes de la salida normal), hojas de estilo y opciones de usuario.

--pages rango
Imprime páginas en rango.

--right-footertexto
Establece el pie derecho de la página a texto.

--right-titletexto
Establece el título derecho de la página a texto.

--rows número
Ordena páginas en número filas. Por defecto es una.

-B
Sin encabezados de página.

-b texto
Establece el encabezado de página a texto.

-f tamaño
Usa fuente de tamaño puntos.

-l número
Establece los caracteres por línea a número. Ésta y la opción -L (a continuación) pueden usarse para hacer que archivos paginados con otros programas, como pr, encajen correctamente en la página.

-L número
Establece las líneas por página a número.

-M nombre
Usa el medio nombre. Por ejemplo, "A4"

-n número
Muestra el número de copias de cada página.

-o archivo
Envía la salida a archivo. Si archivo se especifica como "-", usa la salida estándar.

-P impresora
Usa impresora. Si no se especifica la impresora, se usa la impresora por defecto del sistema.

-R
Orientación retrato.

-r
Orientación apaisada.

-T número
Establece etiquetas de stop para cada número caracteres.

-u texto
Sobrescribe (marca de agua) páginas con texto.

Esto es sólo un resumen. a2ps tiene varias opciones más.

Nota: a2ps está todavía en desarrollo activo. Durante mi prueba, he notado comportamientos diferentes en varias distribuciones. En CentOS 4, la salida siempre va a la salida estándar por defecto. En CentOS 4 y Fedora 10, la salida va por defecto a un medio A4, a pesar de que el programa esté configurado para usar un medio tamaño carta por defecto. Podría superar estos problemas especificando específicamente la opción deseada. En Ubuntu 8.04, a2ps se comporta como está documentado.

Ten en cuenta también que hay otro formateador de salida útil para convertir texto a PostScript. Se llama enscript, puede realizar muchos de los mismos tipos de trucos de formateo e impresión, pero al contrario que a2ps, sólo acepta entrada de texto.

Monitorizando y controlando trabajos de impresión

Como los sistemas de impresión Unix están diseñados para manejar múltiples trabajos de impresión de múltiples usuarios, CUPS está diseñado para hacer lo mismo. A cada impresora se le da una cola de impresión, donde se aparcan los trabajos hasta que pueden ser puestos en cola hacia la impresora. CUPS proporciona varios programas de línea de comandos que se usan para manejar estados y colas de impresión. Como los programas lpr y lp, estos programas de gestión siguen el modelo de los sistemas de impresión Berkeley y System V.

lpstat - Muestra el estado del sistema de impresión

El programa lpstat es útil para determinar los nombres y la disponibilidad de las impresoras en el sistema. Por ejemplo, si tuviéramos un sistema con una impresora física (llamada "printer") y una impresora virtual (llamada "PDF"), podríamos comprobar su estado así:

[me@linuxbox ~]$ lpstat -a
PDF accepting requests since Mon 08 Dec 2008 03:05:59 PM EST
printer accepting requests since Tue 24 Feb 2009 08:43:22 AM EST

Además, podríamos determinar una descripción más detallada de la configuración del sistema de impresión de esta forma:

[me@linuxbox ~]$ lpstat -s
system default destination: printer
device for PDF: cups-pdf:/
device for printer: ipp://print-server:631/printers/printer

En este ejemplo, vemos que "printer" es la impresora por defecto del sistema y que es una impresora de red que usa el Protocolo de Impresión de Internet - Internet Printing Protocol (ipp://) que está conectada a un sistema llamado "print-server".

Las opciones útiles usada más habitualmente incluyen:

-a [impresora...]
Muestra el estado de la cola de impresión de impresora. Fíjate que es el estado de la capacidad de la cola de la impresora de aceptar trabajos, no el estado de las impresoras físicas. Si no se especifican impresoras, se muestran todas las colas de impresión.


-d
Muestra el nombre de la impresora por defecto del sistema.

-p [impresora...]
Muestra el estado de la impresora especificada. Si no se especifican impresoras, se muestran todas.

-r
Muestra el estado de los servidores de impresión.

-s
Muestra un sumario de estado.

-t
Muestra un completo informe de estado.

lpq - Muestra el estado de la cola de impresión

Para ver el estado de una cola de impresión, se utiliza el programa lpq. Esto nos permite ver el estado de la cola y de los trabajos de impresión que contiene. Aquí tenemos un ejemplo de una cola vacía de una impresora por defecto del sistema llamada "printer":

 [me@linuxbox ~]$ lpq
 printer is ready
 no entries

Si no especificamos una impresora (usando la opción -P), se muestra la impresora por defecto del sistema. Si enviamos un trabajo a la impresora y luego vemos la cola, lo veremos listado:

[me@linuxbox ~]$ ls *.txt | pr -3 | lp
request id is printer-603 (1 file(s))
[me@linuxbox ~]$ lpq
printer is ready and printing
Rank    Owner   Job     File(s)           Total Size
active  me      603    (stdin)            1024 bytes

lprm/cancel - Cancela trabajos de impresión

CUPS aporta dos programas usados para terminar trabajos de impresión y eliminarlos de la cola de impresión. Uno es estilo Berkeley (lprm) y el otro es System V (cancel). Difieren ligéramente en la opciónes que soportan, pero basícamente hacen lo mismo. Usando nuestro trabajo de impresión anterior como ejemplo, podríamos parar el trabajo y eliminarlo de la siguiente forma:

 [me@linuxbox ~]$ cancel 603
 [me@linuxbox ~]$ lpq
 printer is ready
 no entries

Cada comando tiene opciones para eliminar todos los trabajos pertenecientes a un usuario en particular, una impresora en particular y múltiples números de trabajos. Sus respectivas man pages tienen todos los detalles.

Resumiendo

En este capítulo, hemos visto como las impresoras del pasado han influido el diseño de los sistema de impresión de las máquinas como-Linux, y cuanto control tenemos en la línea de comandos para controlar no sólo la programación y ejecución de trabajos de impresión, si no también la variedad de opciones de salida.

Para saber más

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.