next up previous contents
Next: Redes Heterogeneas Up: Configuración Previous: Red TCP/IP   Contents

Subsections

Impresión

En unix existen dos elementos clave para la impresión: el unix printer spooler lpd (line printer daemon), y el uso extenso del formato Postscript para el formateo del contenido de impresión.

El printer spooler es un sistema o colección de programas que permiten remitir trabajos de impresión a uno computadora, inclusive remota, mantenerla en una cola de espera y enviarla a la impresora especificada, sin intervención del/de la usuario/a. De esta manera se pueden enviar varios trabajos de impresión al mismo tiempo, sin que hay colisión, ya que el sistema secuencializa su ejecución, y además se pueden ejecutar los trabajos con una prioridad baja, solo usando recursos del sistema, cuando este esté desocupado y así no se bloquean procesos interactivos de usuarios.

Existen dos implementaciones con diferentes comandos: los Unix de la tradición System V utilizan ``lp/lpstat'' como comando de remisión y de supervisión de trabajos de impresión, BSD-Unix utiliza ``lpr/lpq'' para este mismo efecto.

Desde la primera implementación se han sofisticado los programas y se han hecho más compatibles. CUPS (Common unified printing system) es una iniciativa que trata de crear un nuevo estándar para el control de trabajos de impresión, y que integra el estílo BSD y System V como subelementos.

El printer spooler no tiene (casi) ningún conocimiento ni influencia en el formato o la calidad de la impresión. Por un lado porque viene de un tiempo donde una impresora solo podía imprimir tipos de letras fijos, y no había (prácticamente) formas de imprimir información gráfica. Por otro lado es consistente con la filosofía Unix, de que cada programa solo realiza una tarea.

Mientras en MS-Windows cada aplicación tiene que contener el convertidor de impresión de su formato de archivo al formato de impresión de una impresora específica, en Unix es el sistema que se encarga de convertir los diferentes formatos de archivos en su forma imprimible. Ambos enfoques tienen sus ventajas y desventajas, en Unix es efectivamente la falta de un estándar suficientemente reconocido e implementado, que la impresión funcione bajo cualquier circunstancias.

El lenguaje de programación gráfica Postscript ha llegado a llenar a cierta medida esta deficiencia. Practicamente todos los programas en unix pueden convertir su formato interno al formato Postscript, o existen programas auxiliares que pueden realizar esta tarea, y con el programa Ghostscript, se puede convertir el formato Postscript en virtualmente cualquier formato de impresión que existe en el planeta. De esta manera, un sistema Unix puede combinar lo mejor de ambos mundos, siempre y cuando todos los componentes están en su lugar.

En este capítulo se presentará implementaciónes concretas del sistema de impresión y su configuración. Los detalles técnicos de la implementación pueden leerse en la literatura correspondiente, que es muy extensa. La lectura puede comenzar con la documentación en línea de los programas LprNg y CUPSys, que es muy buena y ámplia.

Interfáz programático

A continuación se presentan los comandos usados comúnmente usados por el/la usuario/a para imprimir un archivo con una descripción corta en la comparación entre BSD y System V.

Función BSD System V

Nótese, que al crear un trabajo de impresión (con lpr o lp), se retorna un número de trabajo (Print Job Number), en la tabla indicado con trabajo. En el uso diario pasa muchas veces, que se manda un archivo a la cola de impresión, y después se quiera cancelar. En este caso se revisa la cola con ``lpq'' o ``lpstat para'' obtener el número de trabajo, en caso (común) que no se conoce o no se ha memorizado al crear el trabajo. Este número se utiliza para cancelar el trabajo con ``lprm'' o con ``cancel''.

Para enviar un trabajo a la cola local es suficiente especificar cualquiera de los nombres de la cola u omitirlo completamente en caso se trata de la impresora por defecto ``lp''. Si queremos enviar un trabajo a una impresora remota podemos especificar su nombre concatenando el nombre de la cola remota con el de la computadora remota, por ejemplo: lp@venta.cigarros.com. En System V se puede especificar la computadora remota (host) con el parámetro ``-h computadora''.

No existe, ni es necesario una función ``especial'' del sistema operativo para la impresión, cada programa que quiera imprimir ``algo'' puede hacerlo creando un sub-proceso en el cual se ejecuta ``lp -'' o ``lpr -'', y redireccionar la información a imprimir al stdin de este sub-proceso. Esto es válido también para lenguajes scripting o programas shell. Obviamente también pueden crearse archivos temporales, usándose como argumentos para lp o lpr y que se eliminan a continuación, una técnica que puede proveer facilidad multiplataformas con sistemas operativos más pobres.

printcap

El archivo /etc/printcap es la clave de la configuración de las colas de impresión en Unix, independientemente del sistema lpd, sea BSD o System V. El nombre se derive de ``printer capabilities'' o capacidades de impresoras. Es un homólogo de la base de datos termcap, que tiene una estructura parecida, pero está sustituida en la actualidad por un sistema más flexible y poderoso llamado terminfo.

/etc/printcap está compuesto por entradas, uno por línea, que describen cada uno una cola de impresión, con una gran variedad de parámetros posibles. Efectivamente se reestructuran las líneas con el símbolo de continuación de línea ``\'' para facilitar mejor legibilidad para los seres humanos.

Cada cola de impresión tiene uno o varios nombres, que conforman la primera entrada en la línea. Si son más que un nombre se separan por el símbolo ``|''. A continuación de los nombres se anexan campos de parámetros, separados entre ellos por el separador tradicional ``:'', que tiene la forma: et=texto o et#número, donde et es una etiqueta de dos letras que designa el parámetro a describir. a continuación presentamos dos entradas printcap mínimales, una para una impresora local y una para una cola de impresión en otra computadora - local y remote printcap entry:

lp|localprinter|impresora_local|Epson_LX300:\

    :lp=/dev/lp0:\

    :sd=/var/spool/lpd/lp:\

    :mx#0:\

    :sh:

Tradicionalmente la cola de impresión por defecto se llama lp, quiere decir, si ejecutamos el comando ``lpr archivo'', sin especificar la cola de impresión se imprimirá en la impresora con nombre lp. No hay necesidad de ponerle varios nombres a la cola de impresión, pero es recomendable darle un nombre corto ``unix'' de máximamente tres letras, y otro nombre que describe el modelo de la impresora. De esta manera se puede cambiar por ejemplo la impresora ``lp'' por un modelo diferente, darse cuenta como administrador del sistema, pero mantener el interfáz de usuario (el primer nombre) igual para los usuarios, y por otro lado, como usuario se puede seleccionar la impresora por el nombre del modelo, que es más palpable, teniendo el objeto físico (la impresora) en frente, que un nombre abstracto de la cola.

El símbolo ``\'' tiene que ser el último símbolo antes del símbolo de nueva línea (\n). Entonces el contenido de la siguiente línea será concatenado a la actual, omitiendo le espacio blanco al comienzo de la línea, por lo que se permite hacer la sangría para estructurar mejor la apariencia. Lectores atentas/os se darán cuenta, que todas las entradas entonces se presentan así: ``lp|...::lp=/dev/lp0::sd=...'', con dos doble puntos. Esto no consiste un problema dado que campos vacíos (el ``no''-espacio entre dos colones) son ignorados en /etc/printcap.

lp=
designa el dispositivo físico - el puerto paralelo 1 de la computadora en este caso, donde está conectada la impresora (lineprinter - port).
sd=
designa el directorio donde se almacenan los trabajos: la cola de impresión o ``spool directory''.
mx#
es el tamaño máximo de un archivo que se imprime en una impresora, utilizando el valor cero significa no imponer una restricción al tamaño.
sh
es un parámetro sin valor y significa, que se crea una copia del archivo en el directorio de impresión, que va siendo eliminando al terminar el trabajo. Tradicionalmente pueden haber otros enfoques:

rlp|Remote printer entry|impresora_remota|LaserWriter:\

    :lp=:\

    :rm=venta.cigarros.com:\

    :rp=lp:\

    :sd=/var/spool/lpd/rlp:\

    :mx#0:\

    :sh:

Esta entrada tiene definido, que el puerto de impresión es vacío, para designar que la impresión es remota. Se requiere saber el nombre de la cola en la computadora remota, y por supuesto el nombre de la computadora, que es definido en las entradas ``rm'' - remote host, o computadora remota, y ``rp'' - remote printer, o impresora remota. En nuestro caso, ``rlp'' refiere la impresión a la cola de impresión por defecto en la computadora venta.cigarros.com, y suponemos, que este sera una impresora del modelo ``LaserWriter''.

Consta, que siempre requerimos un directorio de cola, ya que el trabajo se guarda localmente, mientras es transmitido a través de la red. Si la computadora remota no es accesible, la transmisión se reintenta cada vez en cuando.

De particular interés son entradas no mostradas aquí, que permiten ``filtrar'' el archivo de impresión. Hay filtros de entrada (if=), salida (of=) y para la contabilidad (af=), además existen filtros para diferentes formatos de archivo, que hoy día ya no tienen mucha importancia. Los filtros designan la vía de acceso a un programa, que es llamado en un determinado momento del procesamiento del trabajo de impresión, recibe alguna información del sistema de impresión mismo a través de variables de entorno y a través de parámetros de línea de comando, y que tiene que leer en su stdin el archivo de impresión, y escribir en su stdout la transformación de esta información.

El archivo de entrada es usado, por los sistemas de impresión genérica, para dedectar el formato de archivo, y crear la fórma óptima de impresión para la impresora específica. Se puede decir, que en los sistemas ``modernos'', el input-filter es el driver de la impresora, pero combinado con un convertidor ``intelligente'' de formatos.

El accounting-filter (af) es usado para llevar la contabilidad de hojas impresas en esta cola. La información que recibe en cada trabajo le permite crear una estadística por computadora, cuenta y período de tiempo, y/o crear una facturación de costos de impresión por cuenta, que puede ser de interés en una institución o empresa.

LprNg e impresión remota

LprNg es una re-implementación del sistema BSD de impresión, con una grán cantidad de mejoras y sofisticaciones, especialmente para trabajo en redes y con múltiples usuari@s e impresoras.

En su instalación básica sustituye sin más complicaciónes al sistema Lpr de la distribución BSD, y puede configurarse a través del archivo printcap como descrito anteriormente. LprNg utiliza un segundo archivo de configuración (opcional), donde se describe los derechos de acceso a las colas de impresión. Se puede asignar derechos de enviar trabajos, revisar la cola, reordenarla, borrar un trabajo de la cola en dependencia de usuario, nombre de computadora y número IP de una manera muy flexible.

LprNg en sus versiones recientes también provee herramientas gráficas para su configuración, que en su apariencia es parecido al Printtol de la distribución RedHat.

LprNg es una implementación muy madura, que satisface igual las necesidades de una instalación individual en una computadora personal, como una aplicación profesional con necesidad de soporte para el manejo de redes grandes y complejos y con posibilidad y soporte directo para la contabilidad de impresión.

Cupsys

Es una implementación completamente renovada, surgiendo de las opciones avanzadas que se presentan por la inovación tecnológica en las impresoras.

Mientras lpd mira a la impresora como un equipo de solo escritura, en la actualidad hay computadoras que soportan una comunicación bidireccional, sea para la configuració óptima del uso de tinta o toner, para notificar datos de estadística de las impresiones y para comunicar a la computadora modelo, versión y capacidades.

Cups además está diseñado para poder integrar impresión en red desde múltiples plataformas y protocolos de red e implementa en una impresora colas de impresión para redes Microsoft, Novell, Unix System V y BSD.

La configuración de CUPS se realiza a través de un navegador Web, dirigiendose comúnmente al puerto TCP/IP número 631. Por ejemplo para configurar la(s) impresora(s) local(es) de una computadora se dirige cualquier navegador al URL http://localhost:631/.

Ghostscript

El lenguaje Postscript fue desarrollado por la empresa Adobe, como formato de representación gráfica. La idea consiste en que una imágen, compuesta por figuras geométricas y por texto en tipos de letras y tamaños arbitrario puede ser representado de forma descriptiva. La formaliciación de esta descripción forma un lenguaje de programación. Supongamonos un cuadro que consiste de un circulo negro con fondo azul-celeste en la parte izqierda superior, con un rectangulo amarillo de marco negro interseccionando en la parte inferior derecha del circulo, y el texto ``La Femmé'' en letra Roman, al tamaño de dos pulgadas de altura en el centro de la parte inferior del cuadro.

Entonces a esta descripción le faltan solo poco detalles, como las medidas del líenzo, y la posición exacta de los objetos, para reproducirlo exáctamente. Es óbvio, que podemos dar las instrucciones en diferente orden y obtener el mismo resultado.

Postscript trabaja con un lienzo imaginario ``canvas'', en el cual se supone una cuadricula en points (1/72 pulgadas) con referencia (x,y)=(0,0) en el punto inferior izquierda, en el cual se ``dibujan'' figuras geométricas, y letras, u objetos como archivos gráficos de mapas de bits, u objetos más complejos definidos en el mismo lenguaje Postscript, que pueden ser posicionados, virados, cizallados, etc.

De otro punto de vista se puede decir, que Postscript es una bibliotéca de funciones gráficas, aglomerado con un lenguaje completo de programación. El lenguaje de programación es derivado del lenguaje Forth, con notación polaca inversa. Una propiedad muy específica de este formato es, que solamente utiliza caracteres ASCII y por lo tanto es portable entre cualquier sistema de comunicación o procesamiento de datos.

Total, el conocimiento de estas maravillas tenemos, porque la empresa Adobe abrió al público en general la definición completa de Postscript, que existe en dos niveles: Postscript Level 1 y Postscript Level 2. Hace poco tiempo, después de un largo tiempo de uso y divulgación del lenguaje Postscript, Adobe amplió el lenguaje con habilidades de hyperenlaces, y con operadores que permiten la compresión/decompresión interna de archivos[*], ahora denominado Portable Document Format - PDF.

En el área de las impresoras profesionales es muy común, que un equipo tenga incorporado el lenguaje Postscript, lo que significa, que en vez de utilizar un gestor específico para la impresora, se le manda directamente comandos Postscript que describen el diseño de la página, y la impresora la convierte en su correspondiente imagen. Esto se encuentra muy frecuentemente en impresoras Laser.

A Peter Deutsch le debemos un interpretador de este lenguaje que es distribuido mediante la Licencia Pública, llamandose Ghostscript. Un interpretador del lenguaje Postscript es un programa (o filtro en términología Unix), que lee un archivo Postscript y lo convierte en ... otro formato. Ghostscript puede generar los formatos y comandos de virtualmente todas las impresoras del planeta, que son capazes de crear no solo texto sino también imágenes, y además puede convertir el formato Postscript en otros formatos gráficos. Podemos diferenciar varios tipos de ``lenguajes gráficos'' y ``lenguajes de impresoras''. Formatos de imágenes pueden ser en mápas de bits, que es una representación simple y requiere mucho volumen, o descriptivo, o también con métodos de compresión, donde se omiten detalles, que para el ojo humano no tienen mucha relevancia. En las impresoras hay diferentes formatos, que corresponden a la técnica de impresión. Impresoras matriziales de impacto trazan varias líneas de una descomposición matrizial en un barrido; impresoras laser imprimen justo una sola línea, pero pueden cargar a veces una páginas entera en su memoria, impresoras a color tienen una intercalación compleja de válvulas diminutas con diferentes colores cuya composición realiza el color de la imágen.

Ya que la distribución del programa incluye el código fuente con todos los gestores, pueden compilarse interpretadores Ghostscript diversos, que incluyen los gestores que sean, e inclusive es realtivamente fácil crear e integrar nuevos gestores. Aunque sería posible, crear para cada impresora diferente un propio ejecutable de Ghostscript es común, compilar un conjunto de gestores para dispositivos desde la tarjeta gráfica en modo VGA, para X-Windows, para diferentes formátos gráficos y hasta un rango ámplio de impresoras comunes en un solo binario en las distribuciones de Linux. De esta manera se puede utilizar un solo programa para convertir de Postscript y PDF en todos los formatos probablemente necesarios. Incluso, Ghostscript puede crear como salida de nuevo un archivo Postscript o PDF.

Esto último es muy útil en la versión Ghostscript para Windows, porque puede usarse para crear archivos en formato PDF.

Una línea de comando común para convertir un archivo Postscript (con nombre ``printfile.ps'') en un formato de impresora puede ser la siguiente:

gs -sOutputFile=printfile.epson -sDEVICE=epson -dNOPAUSE -q printfile.ps
gs
es el nombre del programa Ghostscript
-sOutputFile
define, que el resultado de la conversión debe escribirse en el archivo printfile.epson
-sDEVICE
define el dispositivo para el cual debe realizarse la conversión, o en corto: el formato de salida. En este caso se convierte el archivo de entrado en un archivo que puede imprimirse directamente por una impresora matricial de la empresa Epson de 24 pines.
-dNOPAUSE
instruye a Ghostscript, que no pide confirmación después de convertir una página, lo que es el comportamiento normal cuando se utiliza Ghostscript como visualizador, p.ej. en X-Windows.
-q
(quiet=silencioso) reduce la cantidad de información de progreso impresa en la salida stdout
Para verificar, cuáles formatos de salida son soportados por una versió específica de Ghostscript se puede invocar el comando ``gs'' con el parámetro ``-help'' o ``-h'' solamente. En este caso Ghostscript solo imprime toda su configuración en la salida estándar y termina.

Aunque con el comando ``gs archivo.ps'' se puede visualizar comúnmente un archivo Postscript, sea en X-windows o sea en modo gráfico de la consola, es más práctico utilizar un visualizador, dedicado. Ghostview fue un programa diseñado como ``manejador'' (frontend) para Ghostscript, y fue a continuación sustituido por ``gv'', ambos programas del ambiente X-windows, que proveen un ambiente fácil de usar por el/la usuario para visualización e impresión selectiva de un archivo Postscript.

Regresando al tema de la impresión: se puede establecer un filtro de impresión en /etc/printcap, que converte cualquier impresora en una impresora Postscript de la siguiente manera:

    if=gs -sOutputFile=- -sDEVICE=epson -dNOPAUSE -q - -
donde por supuesto ``epson'' se sustituye por el modelo de la impresora en cuestión. el guíon ``-`` al final de la línea significa leer el archivo de entrada desde stdin, y el guíon en ``-sOutputFile='' significa escribir la salida de Ghostscript en stdout. El doble guíon es necesario, para que Ghostscript interprete el guíon final no como opción de línea de comando.

Postscript, a pesar de preservar el formáto gráfico a través de diferentes plataformas, también cuenta con una grán cantidad de utilidades, que se sirven de que se trata de un lenguaje de programación. Se pueden hacer varios tipos de transformaciones a un archivo existente, al ``procesarlos'' con ``programas Postscript'' pre-cargados al interpretador, algunos ejemplos que todos son programas del paquete ``psutils'' de Angus Duggan:

psnup
convierte un archivo Postscript que consiste de páginas consecutivas en uno, donde ``n'' (n=1,2,...) páginas están reproducidas en cada hoja consecutiva de forma reducida y reorientada.
psbook
convierte un archivo Postscript de tál manera, que al imprimirlo puede ser doblado y engrapado como un libro o folleto
psmerge
junta varios archivos diferentes Postscript en un solo
psselect
permite extraer determinadas páginas de un archivo Postscript.
Por fín falta mencionar, que a través de convenciones de programación en Postscript se distingue entre diferentes ``formatos''. Para la reproducción de archivos Postscript en papel, donde el énfasis es la separación en páginas existen los ``Adobe Document Structuring Conventions'' -DSC, comentarios insertados en el archivo, que describen los limites de páginas, su númeración etc. Programas pueden extraer estos ``comentarios'' y utilizarlos para el manejo del documento. Por ejemplo, el visualizador muestra el número de páginas y permite buscar una página específica a través de ellos.

Encapsulated Postscript o EPS, es un formato Postscript para dibujar una imagen, que puede ser redimensionado, insertado en otro archivo como objeto gráfico, etc. EPSI o Encapsulated Postscript Interchange Format incrusta una imágen reducida un ``thumbnail'' dentro del archivo mismo, que puede ser usado por visualizadores para una vista rápida del contenido. A la hora de impresión se utiliza el archivo original y se oprima el ``thumbnail''.

Magicfilter

La solución propuesta por el capítulo anterior al problema de la impresión de archivos gráficos con el sistema lpd es, que todos los programas que quieren imprimir tienen que convertir su salida al formato Postscript por un lado, y por otro lado que todas las impresoras sean impresoras Postscript, o sean ``convertido'' en tal mediante Ghostscript como filtro de entrada. Nótese, que esto significa, que hasta un simple texto ASCII tiene que convertirse en Postscript antes de imprimirse. Existen un sinnúmero de utilidades para la transformación de archivos cualquieras en este formato, unos pocos jemplos son:

a2ps
``All to Postscript'' - todo a Postscript
enscript
convierte archivos ASCII en Postscript y le agrega formato, como línea título con la fecha de impresión, el nómbre de archivo, etc., númera las páginas, y puede imprimir también varias páginas en un sola hoja. Además, enscript provee un mecanismo para resaltar el síntaxis de muchos diferentes lenguajes de programación (language markup), lo que facilita la lectura de programas de computación significantemente.
pnm2ps
convierte archivos pnm (imágenes de mapas de bits) arbitrarios en formato Postscript, y eventualmente los hace calzar dentro de los márgenes de una página.
Esta propuesta transfiere el problema ``Cómo imprimir un archivo X en la impresora Y'' solamente de un nivel a otro: ``Cómo convierto el archivo X en formato Postscript''. No debe ser un problema concernante para el/la operadora de la computadora, sino para la computadora mismo, y eso es, para que se invento los filtros mágicos.

El concepto de estos es, que se le agrega ``inteligencia'' al filtro, para que detecte el tipo de archivo autónomamente, e invoce la conversión correspondiente a la impresora. Para eso no es necesario, que el archivo siempre se convierte en Postscript, por ejemplo si se trata de un archivo ASCII.

El programa ``magicfilter'' es una implementación bastante madurada de este concepto. Magicfilter utiliza un archivo de ``configuración'' para cada tipo de impresora, donde una línea describe una conversión. Una línea comienza con el ``magic'' el identificador del tipo de archivo, después indica que forma de transformación se pretende hacer: pasarlo directo, pasar lo por un filtro, pasar lo por un programa, o pasarlo por un filtro/programa y después volver a evaluarlo. Esta última opción introduce recursión en el procesamiento y le da su poder a magifilter. La última parte de la línea indica la línea de comando a invocar.

Lo interesante de Magicfilter es, que el/la usuario/a no tiene que escribir estos archivos de ``configuración'', ya que Magicfilter incluye un programa de configuración, que analiza, cuales convertidores existen en la computadora y compone el archivo correspondiente. Como gestor de impresora, o sea el filtro finál para archivos gráficos se utiliza Ghostscript. La utilidad de configuración crear el archivo /etc/printap y se rehusa a ejecutar si este ya existe, por ejemplo cuando printcap fue creado por LprNg u otra utilidad. En el caso, que la configuración de printcap tiene que conservarse se procede moviendo el archivo original a un lugar ``seguro'', creando un archivo printcap con ``magicfilterconfig'', donde se selecciona el tipo de impresora, y después se incorpora las líneas relevantes de este archivo en el original. Finalmente se vuelve a copiar el archivo printcap original (modificado) a su lugar.

Magicfilter puede instalarse directamente de su código fuente sin mucho problema. La distribución Debian Gnu/Linux provee un paquete preconfigurado de Magicfilter, con gestores para una grán variedad de impresoras comúnes.

Redhat-Printtool

La distribución RedHat, y a mi parecer también la distribución de Suse utilizan otra técnica, que también tiene tradición en Unix. Dentro del directorio de cola de lpd se instalan los scripts y filtros correspondientes para la impresora. Ellos utilizan un sistema de filtraje mágico, que se basa únicamente en el interpretador de comandos bourne shell.

La configuración y adaptación de los filtros para una nueva impresora, así como la instalación de los scripts (porque son necesarios varios) en su lugar correcto es una tarea no trivial. Sin embargo existe una aplicación gráfica, llamada ``printtool'', que está muy bién diseñada, y permite al/a la usuario/a una configuración y administración extremadamente sencilla. Printtool también puede tratar con impresoras en red, y no solo de colas lpd de Unix, sino también para colas de impresión Novell y Redes Microsoft.

De nuevo, igual como en la configuración de X-Window, se saca provecho de una base de datos de configuración, en este caso de impresoras, bien diseñada y madurada.

Printtool se basa en el sistema lpr de BSD y obviamente no existe un control de acceso como lo provee LprNg o CUPS. En redes grandes, donde la seguridad o privacidad es un tema que hay que tomar en cuenta tiene que valorarse esta limitación.


next up previous contents
Next: Redes Heterogeneas Up: Configuración Previous: Red TCP/IP   Contents
Georg Lehner 2003-10-28