Antes que nada es necesario recordar el mecanismo de spooling
típico de los servidores de impresión en linux. En primer lugar el
servidor lpr/lprng copia el fichero a imprimir en el directorio
de «spool» (sd
) indicado en el fichero /etc/printcap
,
creando en dicho directorio un fichero de control indicando el trabajo a
imprimir, el usuario que solicita el servicio de impresión, parámetros
pasados en línea de órdenes, etc. Luego, el demonio de impresión
(lpd) comprueba periódicamente si hay ficheros de control en el
directorio spool, y si es así, realiza las siguientes tareas:
sh
en el fichero /etc/printcap
) y la pasa a
través del filtro de salida si lo hay (instrucción of
del fichero
/etc/printcap
)if
del fichero /etc/printcap
.of
) cuando lo haya, y
la salida de dicho filtro al dispositivo de impresión asociado a la
impresora (entrada lp
del fichero /etc/printcap
)/etc/printcap
Por lo tanto un filtro de entrada de impresión no es más que un programa (generalmente un guión) que teniendo en su entrada estándar (STDIN) un fichero en un formato determinado , p. ej., ps (postscript), escribe en su salida estándar (STDOUT) los códigos necesarios para que la impresora imprima dicho fichero.
Consideremos que disponemos de una impresora HP Laserjet Plus y vamos a escribir algunos filtros. La resolución será de 300x300; el formato de papel, A4; y el controlador de dispositivo es ljetplus.
Vamos a escribir el filtro para ficheros PS como un shell script:
#!/bin/bash/
#Filtro de ficheros postscript
/usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4 -sOutputFile=- -
Como podemos ver, gs lee la STDIN desde el fichero de control
que ha creado el servidor de impresión lpr; se ejecuta el filtro y
la opción -sOutputFile=-
envía la salida a STDOUT. El
demonio lpd tomará los datos que se encuentren en STDOUT y los
enviará a la cola de impresión.
Para procesar un fichero PDF aprovechando la utilidad pdf2ps (shell script que convierte un fichero PDF a PS), escribiremos el filtro:
#!/bin/bash/
#Filtro de ficheros pdf
/usr/bin/pdf2ps | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\
-sOutputFile=- -
Para un texto en formato troff, emplearíamos este otro
#!/bin/bash/
#Filtro de ficheros troff
/usr/bin/grops -g | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\
-sOutputFile=- -
(la opción -g
para la orden grops permite generar documentos en
formato letter
o a4
)
Como puede verse el concepto de filtro sería un shell script con los siguientes campos:
#!/bin/bash
#Comentario 'filtro para ficheros XYZ'
/usr/bin/XYZps | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\
-sOutputFile=- -
Donde XYZps es un programa (con opciones) que convierte el formato XYZ a PS. Hay una gran cantidad de ellos que servirían para hacer filtros con posibilidad de imprimir gráficos; así el formato TIFF se pasa directamente con la utilidad tiff2ps, mientras que los GIF y JPEG se pasan a formato PNM mediante los programas giftopnm y djpeg, respectivamente. Una vez en este formato, se traduce a PS con la utilidad pnmtops.