11.4. Configuración Avanzada de una Impresora

Esta sección describe el uso de filtros para formatos especiales, encabezados de página, impresión en red, y restricción de uso de la impresora por cuenta.

11.4.1. Filtros

Aun cuando LPD maneja con protocolos de red, controles de acceso, requisiciones y otros aspectos de la impresión, la mayor parte del trabajo real se lleva a cabo por los filtros. Los Filtros son programas que se comunican con la impresora y controlan las dependendcias de su dispositivo y requerimientos especiales. En el ejemplo de la impresora simple, instalamos un muy sencillo filtro de texto plano--un ejemplo extremadamente sencillo que debiese trabajar con la mayoría de las impresoras (en la sección Instalando un Filtro de Texto).

De cualquier manera, para tomar ventaja de la conversión de formatos, cuentas de impresión, trucos específicos de las impresoras y demás, es importante saber como trabajan los filtros. En virtud de que todos estos aspectos son la responsabilidad de estos filtros. Y la mala noticia es, que la mayor parte del tiempo usted debe proveerse de estos filtros. La buena noticia es normalmente estos ya existen disponibles; y cuando no, son sencillos de escribir.

FreeBSD tambié cuenta con un /usr/libexec/lpr/lpf, que trabaja con muchas impresoras que pueden imprimir texto plano. (Maneja caracteres de regreso y tabulador en el fichero, así como conteo, pero se puede decir que eso es todo). Existen también una gran cantidad de filtros y componentes de estos, disponibles en la Colección de Ports de FreeBSD.

He aqui lo que encontrará en esta sección:

11.4.1.1. Como Trabajan los Filtros

Como se menciono anteriormente, un filtro es un programa ejecutable que se inicia por LPD, para manejar el dispositivo dependiente, responsable de la comunicación con la impresora.

Cuando LPD desea imprimir un trabajo, inicia un programa filtro. Establece como entrada estandar del filtro al fichero, y a la impresora como salida estandar, y como error estandard al fichero log (indicado con la cracterística lf, en el fichero /etc/printcap o por default como /dev/console).

Cual filtro debe ser iniciado por LPD y con que argumentos, depende en lo especificado en el fichero /etc/printcap y los argumentos que hayan sido utilizados por el usuario al momento de usar en la línea de comandos: lpr(1). Por ejemplo, si el usuario teclea lpr -t, LPD iniciará el filtro para ficheros troff, listado en las características tf para la impresora destino. Si el usuario desea imprimir texto plano iniciará el filtro if (esto casi es así, para mayor información, vea la sección Filtros de Salida).

Existen tres tipos de filtros que puede declarar en el fichero /etc/printcap:

  • El filtro de texto, erroneamente llamado filtro de entrada en la documentación de LPD, este se encarga de manejar la impresión de texto simple. Piense en este como en el filtro por default. LPD espera que todas las impresoras puedan imprimir texto plano y es el filtro de texto, el que se encarga de manejar los caracteres de retroceso y tabulador, de tal forma que la impresora no se confunda. Si en su sistema se debe llevar un conteo de impresiones, el filtro de texto también debe llevar un conteo de páginas impresas, normalmente al llevar la cuenta de las líneas impresas y comparandolas con el numero de líneas soportadas por página. El filtro de texto se comienza con los siguientes argumentos:

    nombre-del-filtro [-c] -wanchura -llongitud -isangrado -n login -h host fichero-act

    donde
    -c

    aparece si el trabajo se envio utilizando lpr -l

    anchura

    es el valor de la característica pw (ancho de página), indicado en /etc/printcap, por default se usa un valor de 132

    longitud

    es el valor de la característica pl (longitud de página), por default su valor es 66

    sangrado

    se refiere a los espacios que se considerarán para lpr -i, por default es 0.

    login

    es el nombre de la cuenta del usuario que imprime el trabajo

    host

    es el nombre del host, del cual se ha enviado el trabajo de impresión

    fichero-act

    es el nombre del fichero contador, de la característica af.



  • Un filtro de conversión convierte un formato específico, a uno que la impresora puede plasmar en un papel. Por ejemplo, datos de tipo ditroff no pueden imprimirse directamente, pero puede instalar un filtro de conversión para ficheros ditroff, de tal forma que los datos ditroff se conviertan a un formato que entiende la impresora. La sección Filtros de Conversión explica todo lo que usted necesita saber sobre ellos. Los filtros de conversión también requieren de llevar un conteo, si usted requiere de este control. Los filtros de conversión se inicializan con estos argumentos:

    nombre-del-filtro -xancho-pixel -yalto-pixel -n login -h host fichero-act

    donde ancho-pixel es el valor de la característica px (default 0) y alto-pixel es el valor de la característica py (default 0).

  • El filtro de salida es usado solamente si no existe un filtro de texto, o bien si las páginas de encabezado están habilitadas. En mi experiencia, los filtros de salida raramente se utilizan. La sección Filtros de Salida describe el uso de estos. Sólo existen dos argumentos:

    nombre-filtro -wancho -llargo

    los cuales son idénticos a los argumentos -w y -l de los filtros de texto.

La salida de los filtros debe ser con el siguiente resultado:

exit 0

Esto es si el resultado de la impresión es satisfactorio.

exit 1

Si el filtro falló en la impresión, pero desea que LPD intente de nuevo el trabajo de impresión. LPD reiniciará el filtro si sale con esta clave.

exit 2

Si el filtro falla imprimiendo el fichero y no desea que LPD lo intente de nuevo. LPD desechará el fichero.

El filtro de texto /usr/libexec/lpr/lpf que viene con FreeBSD, toma ventaja de los argumentos de ancho y largo, para determinar cuando alimentar la impresora y como llevar el conteo de uso de la impresora. Utiliza el host y login, así como el fichero de conteo, para llevar el control de este registro.

Si usted esta buscando adquirir filtros, verifique que ellos son compatibles con LPD. Si lo son, deberan soportar los argumentos descritos anteriormente. Si usted planea escribir filtros para uso general, entonces creelos pensando en soportar estos argumentos y códigos de salida.

11.4.1.2. Acomodando Trabajos de Texto Plano en Impresoras PostScript

Si usted es el único usuario de su computadora e impresora PostScript (u otro lenguaje de impresoras), y promete nunca enviar texto plano a su impresora o bien hacer uso de algunos programas que probablemente envien texto plano a su impresora, entonces usted no debe preocuparse por leer esta sección.

Pero, si usted desea enviar tanto texto plano, como PostScript a su impresora, entonces es altamente recomendable que prepare la configuración de su impresora. Para efecto de hacer esto, contamos con el filtro de texto, para detectar si los trabajos que se han mandado son de texto plano o PostScript. Todos los trabajos de tipo PostScript, deben comenzar con %! (para otros lenguajes de impresión, vea la documentación de su impresora). Si esos son los dos primeros caracteres de su trabajo, entonces se considera PostScript y puede pasar el resto del trabajo de forma directa. Si esos no son los primeros dos caracteres, entonces el filtro hará la conversión del texto a PostScript e imprimirá el resultado.

¿Cómo se hace esto?

Si usted cuenta con una impresora serial, una buena forma de hacer esto es instalando lprps. lprps es un filtro de impresión PostScript que lleva a cabo una comunicación de dos vías con la impresora. Actualiza el fichero de estatus de la impresora, por medio de información actualizada, de tal forma que los usuarios y administradores pueden ver exactamente el estado que guarda la impresora (tal como “toner bajo” o “papel atorado”). Pero más importante es el programa que incluye llamado psif, el cual detecta si el trabajo que se ha enviado es texto plano, con lo cual llama a textps (otro programa que viene con lprps), para convertir el texto plano a PostScript. Posteriormente utiliza lprps para enviar el trabajo a la impresora.

El programa lprps es parte de la Colección de Ports de FreeBSD (vea la sección La Colección de Ports). Claro esta, que usted puede descargar, compilar e instalarlo. Una vez que instale lprps, simplemente especifique la ruta al programa psif que a su vez es parte de lprps. Si ha instalado lprps de la Colección de Ports, añada lo siguiente, en la parte correspondiente a su impresora Serial-PostScript, en el fichero /etc/printcap:

:if=/usr/local/libexec/psif:

También deberá especificar la característica rw; que le indica a LPD abrir la impresora en modo de lectura-escritura.

Si usted cuenta con una impresora PostScript, conectada a un puerto paralelo (y por lo tanto no cuenta con la comunicación de dos vías con la impresora, que lprps requiere), puede utilizar el siguiente script de shell como filtro de texto:

#!/bin/sh
#
#  psif - Imprime PostScript o texto plano en impresoras PostScript
#  Script version; NO la version que viene con lprps
#  Instalado en /usr/local/libexec/psif
#

read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  Trabajo PostScript, imprimirlo.
    #
    echo "$first_line" && cat && printf "\004" && exit 0
    exit 2
else
    #
    #  Texto Plano, convertirlo e imprimirlo.
    #
    ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
    exit 2
fi

En este script, textps es un programa que hemos instalado por separado, para convertir texto plano a PostScript. Usted puede utilizar cualquier cualquier programa de conversión de texto plano a PostScript que desee. La Colección de Ports de FreeBSD incluye un programa muy completo llamado a2ps que quizás desee investigar.

11.4.1.3. Simulando PostScript en Impresoras No-PostScript

PostScript es el estandar por excelencia en impresiones de alta calidad. Aunque en realidad PostScript resulta ser un estandar algo caro. Afortunadamente la Empresa Alladin, cuenta con un emulador PostScript, llamado Ghostscript que corre bajo FreeBSD. Ghostscript puede leer la mayoría de los ficheros PostScript y volcarlos en una gran variedad de dispositivos, incluyendose gran variedad de impresoras no-PostScript. Al instalar Ghostscript y usando un filtro de texto especial para su impresora, puede hacer que su impresora no-PostScript actue como una impresora PostScript real.

Ghostscript se encuentra en la Colección de Ports de FreeBSD por lo que puede realizar la instalación desde este medio. También puede descargarlo, compilarlo e instalarlo de una manera fácil.

Para efecto de simular PostScript, contamos con el filtro de texto que detecta si se esta imprimiendo un fichero PostScript. Si no es así, el filtro pasará el trabajo directamente a la impresora, de otra forma utilizará Ghostscript para convertir primero el fichero a un formato que la impresora entienda.

Aqui tenemos un ejemplo: el siguiente script es un filtro de texto para impresoras Hewlett Packard DeskJet 500. Para otras impresoras, substituya el argumento -sDEVICE del comando gs (Ghostscript). Teclee gs -h para obtener una lista de todos los dispositivos soportados por Ghostscript en su sistema).

#!/bin/sh
#
#  ifhp - Impresion simulada-Ghostscript PostScript en una DeskJet 500
#  Instalada en /usr/local/libexec/hpif

#
#  Trate a LF como CR+LF:
#
printf "\033&k2G" || exit 2

#
#  Read first two characters of the file
#
read first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  Se trata de PostScript; use Ghostscript para convertir e imprimir.
    #
    #  Note que los ficheros PostScript son , de hecho, programas interpretados,
    #  y esos programas se permiten escribir en la salida estandar, lo que puede
    #  confundir la salida impresa.  De tal forma que redireccionaremos la salida
    #  estandar a error estandar, y crearemos una clave de salida 3, para la 
    #  salida estandar, y haremos que Ghostscript escriba su salida a esta.
    #  Un ejercicio para el lector astuto:  capture la salida del error estandar
    #  de Ghostscript y envielo por correo de regreso al usuario original, que
    #  genero el trabajo de impresion.
    #
    exec 3>&1 1>&2
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
        -sOutputFile=/dev/fd/3 - && exit 0

    #
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
        && exit 0
else
    #
    #  Texto plano o PCL de HP, asi que solo vamos a imprimirlo directamente;
    #  permita la alimentacion de forma al final, para expulsar la ultima
    #  pagina.
    #
    echo $first_line && cat && printf "\033&l0H" && 
exit 0
fi

exit 2

Finalmente, necesita notificar a LPD de la característica if, que corresponde al filtro a utilizar:

:if=/usr/local/libexec/ifhp:

Y eso es todo. Puede teclear lpr texto.plano y lpr cualquier.ps y ambos deben imprimirse exitosamente.

11.4.1.4. Filtros de Conversión

Una vez que se ha completado la configuración descrita en la sección Configuración Simple de una Impresora, probablemente lo primero que deba hacer es instalar filtros de conversión para su formato de fichero favorito (aparte de text plano ASCII).

11.4.1.4.1. ¿Por qué Instalar Filtros de Conversión?

Los filtros de conversión sirven para instalar de una manera sencilla varios tipos de formatos especiales. Como ejemplo, suponga que requiere imprimir un buen numero de ficheros desarrollados con el sistema de escritura TeX, y contamos con una impresora PostScript. Cada vez que generemos un fichero DVI desde TeX, no podremos imprimirlo directamente hasta que hagamos una conversión de este a PostScript. La secuencia de comandos a seguir es algo así:

% dvips fichero-prueba.dvi
% lpr fichero-prueba.ps

Al instalar un filtro de conversión, podemos omitir llevar a cabo la conversión manual, y permitir que LPD se haga cargo por nosotros. Ahora, cada vez que generemos un fichero DVI, sólo estaremos a un paso de su impresión:

% lpr -d fichero-prueba.dvi

Con esto le hemos indicado a LPD que haga la conversión del fichero DVI. Esto se lleva a cabo por medio de la opción -d. La sección Opciones de Formato y Conversión enumera las opciones de conversión.

Por cada una de las opciones que desea que una impresora reconozca, instale un filtro de conversión y señale su ruta en el fichero /etc/printcap. Un filtro de conversión es como el filtro de texto usado en la configuración de una impresora simple (vea la sección Instalando un Filtro de Texto para una referencia) excepto de que en lugar de imprimir texto plano, el filtro convierte el fichero a un formato que la impresora puede entender.

11.4.1.4.2. ¿Qué Filtros de Conversión Debo Instalar?

Usted debe instalar los filtros de conversión que vaya a necesitar. Si imprime gran cantidad de documentos DVI, es recomendable que instal un filtro de conversión para DVI. Si cuenta con bastantes ficheros troff por imprimir, entonces un filtro troff sería una buena idea.

En la siguiente tabla encontrará un resúmen de los filtros con que trabaja LPD, un ejemplo de su entrada en /etc/printcap y como hacer uso de estos con el comando lpr :

Tipo de Fichero Característica /etc/printcap Opción lpr
cifplot cf -c
DVI df -d
plot gf -g
ditroff nf -n
FORTRAN texto rf -f
troff rf -f
raster vf -v
texto plano if ninguna, -p, o -l

En nuestro ejemplo, el uso de lpr -d indica que la impresora requiere de la característica df, en su entrada del fichero /etc/printcap.

A pesar de lo que otros puedan opinar, formatos como texto de FORTRAN o plot, son probablemnte obsoletos. A su gusto, usted puede encontrar nuevos usos de estos formatos, así como a cualquier otro con el simple hecho de instalar los filtros adecuados. Por ejemplo, supongamos que desea imprimir ficheros de tipo Printerleaf (que son ficheros generados por el programa de promoción de escritorio Interleaf) de forma directa, pero que nunca imprime ficheros plot. Podría instalar un filtro de conversión de Printerleaf bajo la característica gf y posteriormente educar a sus usuarios a que utilicen el comando lpr -g para llevar a cabo “impresiones de ficheros Printleaf”.

11.4.1.4.3. Instalando Filtros de Conversión

Considerando que los filtros de conversión son programas que usted instala independientemente de la instalación base de FreeBSD, probablemente el mejor lugar para colocarlos sería bajo el directorio /usr/local. El directorio /usr/local/libexec es un lugar común, en virtud de que estos son programas especiales que sólo serán ejecutados por LPD; los usuarios comunes no necesitarán ejecutarlos nunca.

Para habilitar un filtro de conversión, deberá especificar su ruta bajo la característica adecuada, en la entrada de la impresora correspondiente en el fichero /etc/printcap.

En nuestro ejemplo, añadiremos el filtro de conversión DVI, para la impresora llamada bamboo. He aqui un ejemplo del fichero /etc/printcap que hemos estado utilizando, con la nueva característica df, para la impresora bamboo.

#
#  Fichero /etc/printcap para host rose - añadiendo df a bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

El filtro DVI es un script de shell llamado /usr/local/libexec/psdf. Aqui presentamos el script:

#!/bin/sh
#
#  psdf - Filtro de impresion DVI a PostScript
#  Instalado en /usr/local/libexec/psdf
#
#  Llamado por lpd cuando el usuario ejecuta lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"

Este script ejecuta dvips en modo de filtro (la opción -f) con la entrada estandar, que es el trabajo a imprimir. Posteriormente inicia el filtro de impresión PostScript lprps (vea la sección Acomodando Trabajos de Texto Plano en Impresoras PostScript), con las opciones que LPD haya pasado al script. El comando lprps hará uso de esas opciones para llevar la cuenta de las páginas impresas.

11.4.1.4.4. Más Ejemplos de Filtros de Conversión

Considerando que no existe una serie de pasos establecida, para instalar filtros de conversión, me permito mostrar algunos ejemplos más. Puede usarlos tal como aparecen, si es que se ajustan a sus necesidades.

Este ejemplo es de un filtro de conversión raster (bueno, de hecho se trata de un fichero GIF), para una impresora Hewlett Packard LaserJet III-Si:

#!/bin/sh
#
#  hpvf - Convierte ficheros GIF a HP/PCL, posteriormente los imprime
#  Instalado en /usr/local/libexec/hpvf
                  
PATH=/usr/X11R6/bin:$PATH; export PATH
giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
    && exit 0 \
    || exit 2

Esto trabaja convirtiendo el fichero GIF a cualquier tipo de fichero mapa portable, y conviritendo eso a un mapa en escala de grises, y ese mapa de regreso a un fichero portable de mapa de bits, y finalmente eso a datos compatibles con HP/PCL, entendible por la impresora LaserJet.

Aqui esta un ejemplo del fichero /etc/printcap usando el filtro anterior, con la impresora mencionada.

#
#  Fichero /etc/printcap para el host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:

El siguiente script es un filtro de conversión de datos de tipo troff desde un sistema groff, para la impresora PostScript denominada bamboo:

#!/bin/sh
#
#  pstf - Convierte datos de troff tipo groff a PS, y los imprime.
#  Instalado en /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"

El script de arriba, nuevamente hace uso del comando lprps, para manejar la comunicación con la impresora. Si la impresora se encontrase en un puerto paralelo, usariamos el siguiente script:

#!/bin/sh
#
#  pstf - Convierte datos groff a PS, y los imprime.
#  Instalado en /usr/local/libexec/pstf
#
exec grops

Eso es todo. Aqui presentamos la entrada necesaria en /etc/printcap para habilitar el filtro:

:tf=/usr/local/libexec/pstf:

Aqui presentamos un ejemplo que puede hacer que los viejos usuarios de FORTRAN se ruboricen. Es un filtro de texto para FORTRAN, usando impresoras que pueden imprimir directamente texto plano. Lo instalaremos para la impresora teak:

#!/bin/sh
#
# hprf - Filtro de Texto FORTRAN para LaserJet 3si:
# Instalado en /usr/local/libexec/hprf
#

printf "\033&k2G" && fpr && printf "\033&l0H" &&
 exit 0
exit 2

Y añadiremos esta línea al fichero /etc/printcap para la impresora teak, para efecto de habilitar el filtro:

:rf=/usr/local/libexec/hprf:

Aqui presentamos el último ejemplo que puede resultar algo complicado. Vamos a añadir un filtro DVI para la impresora LaseJet teak comentada anteriormente. Primero, la parte sencilla: actualizaremos /etc/printcap con la ubicación del filtro DVI:

:df=/usr/local/libexec/hpdf:

Ahora la parte complicada: crar el filtro. Para eso, vamos a necesitar un programa de conversión de DVI-a-LaserJet/PCL. La Colección de Ports de FreeBSD (vea La Colección de Ports) cuenta con uno, el nombre del paquete es: dvi2xx. Al instalar este programa, nos brinda la funcionalidad que buscamos, dvilj2p, el cual convierte ficheros DVI a ficheros compatibles con LaserJet IIp, LaserJet III y LaserJet 2000 y códigos compatibles.

El programa dvilj2p hace que el filtro hpdf sea más complejo, en virtud de que dvilj2p no puede leer desde la entrada estandar. Este desea trabajar desde un nombre de fichero. Y lo que es peor, es que el nombre del fichero debe contar con la terminación .dvi, de tal forma que usar /dev/fd/0 como entrada estandar representa un problema. Esto lo podremos solucionar, creando un enlace (simbólico) de un fichero temporal (uno que su tenga como extensión .dvi) a /dev/fd/0, y por tanto forzando a dvilj2p a leer la entrada estandar.

El único punto negativo que nos queda por resolver, es que no podemos utilizar /tmp para el enlace temporal. Los enlaces simbólicos son propiedad del grupo y usuario bin. El filtro de ejecuta como usuario daemon. Y el directorio /tmp cuenta con el bit “pegajoso” activado. El filtro puede crear el enlace, pero no podrá limpiarlo una vez que termine y eliminarlo, ya que pertenece a un usuario diferente.

En lugar de esto, el filtro creará el enlace simbólico en el directorio de trabajo actual, el cual será el directorio de la cola de impresión (especificado en /etc/printcap por la característica sd). Este lugar es perfecto para que los filtros hagan su trabajo, especialmente que aqui existe más espacio (algunas veces) en disco duro, que bajo el directorio /tmp.

Finalmente, aqui presentamos el filtro:

#!/bin/sh
#
#  hpdf - Impresion de datos DVI en una impresora HP/PCL
#  Instalado en /usr/local/libexec/hpdf

PATH=/usr/local/bin:$PATH; export PATH

#
#  Definir una funcion para limpiar nuestros ficheros temporales.  Estos existen
#  en el directorio de trabajo actual, el cual servira para la cola de impresion de
#  la impresora.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Definir funcion para el manejo de errores fatales: imprimir un mensaje dado y salir
#  con codigo de salida 2.  Al salir con 2, le indica a LPD que no intente la impresion 
#  de nuevo.
#
fatal() {
    echo "$@" 1>&2
    cleanup
    exit 2
}

#
#  Si el usuario elimina el trabajo, LPD enviara un SIGINT, para que SIGINT
#  (y algunas otros avisos) limpien despues de nosotros.
#
trap cleanup 1 2 15 

#
#  Asegurarse de que no estamos creando un conflicto con ficheros existentes.
#
cleanup

#
#  Crear el enlace de la entrada DVI a la entrada estandar (el fichero a imprimir).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Hacer  LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"

# 
#  Convertir e imprimir.  Regresar valor de dvilj2p no parece my confiable, 
#  asi que es ignorado.
#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Limpiar y salir
#
cleanup
exit 0

11.4.1.4.5. Conversión Automática: Una Alternativa A Los Filtros De Conversión

Todos estos filtros de conversión realizan una gran labor en pro de sus labores de impresión, pero con el inconveniente de que cada usuario debe especificar cual filtro es el que se debe utilizar (cuando se invoca el comando lpr(1)). Si sus usarios no son lo que podemos llamar aficionados a la computación, el especificar que filtro utilizar puede volverse algo molesto. Y lo que es peor, el uso de un filtro inadecuado puede causar que su impresora termine imprimiendo cientos de hojas de papel de manera incorrecta.

En lugar de instalar filtros de conversión, quizás le interese intentar que su filtro de texto (dado que es el filtro por default) determine que tipo de fichero se esta enviando a imprimir y automáticamente ejecute el filtro adecuado. En este caso, herramientas como file pueden ser de mucha utilidad. Claro esta, puede que algunos tipos de ficheros puede ser difícil determinar de que tipo son, pero siempre puede contar con filtros especiales para ellos.

La Colección de Ports de FreeBSD cuenta con un filtro de texto que ejecuta de forma automática la conversión, llamado apsfilter. Este puede detectar texto plano, PostScript y ficheros DVI, ejecutar la conversión adecuada e imprimir.

11.4.1.5. Filtros de Salida

El sistema de cola de impresión de LPD soporta otro tipo de filtros, que aun no hemos explicado aqui: un filtro de salida. Un filtro de salida esta diseñado para imprimir texto plano únicamente, como el filtro de texto, pero de una forma más simplificada. Si usted esta usando un filtro de salida pero no filtro de texto, entonces:

  • LPD inicia el filtro de salida para el trabajo completo, en lugar de hacerlo para cada fichero del trabajo.

  • Para el filtro de salida, LPD no realiza un trabajo extra para identificar el comienzo o el fin del trabajo.

  • En el filtro de salida, LPD no utiliza como argumento el nombre de usuario o host, por lo tanto no esta diseñado para llevar un conteo por usuario. De hecho, este sólo maneja dos argumentos:

    nombre-filtro -wancho -llargo

    Donde ancho es tomado de la característica pw y largo es tomado de la característica pl, para la impresora en cuestión.

Es importante que no se deje seducir por la simplicidad del filtro de salida. Si usted desea que cada fichero de un trabajo sea impreso en una página diferente, el filtro de salida no hará este trabajo. Utilice un filtro de texto (también conocido como filtro de entrada); vea la sección Instalando un Filtro de Texto . Mas allá, el filtro de salida es de hecho más complicado en ese aspecto dado que examina la cadena de bytes que se ha enviado, para buscar alguna marca especial y enviarse señas él mismo, a nombre de LPD.

De cualquier forma, un filtro de salida es necesario si usted desea páginas de encabezado y requiere de enviar un secuencia de escape u otras cadenas de inicialización para habilitar la impresión de encabezados. (Aunque también es trivial si desea cobrar de acuerdo a las páginas encabezado de cada usuario, dado que LPD no otorga información del usuario o host, al filtro de salida.)

En una sola impresora, LPD permite el uso tanto del filtro de salida como el filtro de texto. En cuyo caso, LPD iniciará el filtro de salida para imprimir las páginas de encabezado (vea la sección Páginas de Encabezado) únicamente. Posteriormente LPD espera que el filtro de salida se detenga por sí mismo al enviarle dos bytes al filtro: ASCII 031 seguido de ASCII 001. Cuando un filtro de salida recibe estos dos bytes (031, 001), deberá pararse, enviandose a sí mismo una señal SIGSTOP. Una vez que LPD ha terminado de ejecutar otros filtros, reiniciará el filtro de salida, el enviarle una señal SIGCONT.

Si existe un filtro de salida, pero no existe un filtro de texto y LPD esta trabajando con un trabajo en texto plano, LPD utilizará el filtro de salida para hacer el trabajo. Como se comento anteriormente, el filtro de salida imprimirá cada fichero del trabajo en secuencia, sin intervención de alimentación u otras ventajas con lo que al papel se refiere, y seguramente que esto no es lo que usted desea. En casi todos los casos usted necesitará un filtro de texto.

El programa lpf, que comentamos anteriormente como un filtro de texto, también es capaz de ejecutar un filtro de salida. Si desea un trabajo rápido-y-sucio del filtro de salida, pero no desea que se escriban bytes de detección, ni envien códigos, puede usar lpf. También puede incluir lpf en un script de shell, para que controle cualquier código de inicialización que la impresora requiera.

11.4.1.6. lpf: Un Filtro de Texto

El programa /usr/libexec/lpr/lpf que viene con los binarios de FreeBSD, como un filtro de texto (filtro de entrada) que puede darle sangía a los trabajos (usando la opción lpr -i), que permite el envío literal de caracteres (con el comando lpr -l), ajusta la posición de impresión para caracteres de retroceso y tabulador, y contabiliza las páginas impresas. También puede funcionar como un filtro de salida.

lpf se ajusta a la configuración de gran cantidad de impresoras. Y aunque no tiene la habilidad de enviar secuencias de inicialización a la impresora, es muy sencillo escribir un script de shell para llevar a cabo la inicialización y posteriormente ejecutar lpf.

Para efecto de que lpf lleve un conteo correcto, requiere que se tengan los valores adecuados de las características pw y pl, en el fichero /etc/printcap. En base a estos, determina cuanto texto puede existir en una página y cuantas páginas existen en el trabajo de un usuario. Para mayor información al respecto, vea la sección Contabilidad del Uso de la Impresora.

11.4.2. Páginas de Encabezado

Si usted cuenta con gran cantidad de usuarios, y todos imprimiendo en varias impresoras, entonces sería conveniente considerar las páginas de encabezado como un mal necesario.

Las páginas de encabezados, también conocidas como titulares o páginas de aviso identifican a quien pertenece el trabajo enviado a imprimir, una vez que han sido impresos. Normalmente estas son impresas en letras grandes y de color negro remarcado (negritas), y quizás con bordes decorativos, de tal forma que puedan distinguirse entre el resto de las páginas enviadas a imprimir. Estas permiten a los usuarios localizar rápidamente sus impresiones. El obvio lado negativo de estas páginas es que se debe imprimir una hoja adicional, por cada trabajo enviado a la impresora, su utilidad efímera, no dura más que unos minutos, terminando en una bandeja de reciclaje. (Note que las páginas de encabezado se imprimen con cada trabajo enviado a la impresora, no con cada página impresa, de tal manera que el deperdicio de papel no es tan grave.)

El sistema LPD puede proveerle de las páginas de encabezado de forma automática para sus impresiones, si su impresora soporta de la impresión de texto plano directamente. Si usted cuenta con una impresora PostScript, necesitará un programa externo para generar estas páginas; vea la sección Páginas de Encabezado en Impresoras PostScript.

11.4.2.1. Habilitando las Páginas de Encabezado

En la sección Configuración Simple de una Impresora, deshabilitamos la impresión de estas páginas al especificar sh (que son siglas en inglés para “supress header”, algo así como “eliminar encabezados”) en el fichero /etc/printcap. Para efecto de habilitar la impresión de páginas de encabezado, simplemente elimine la característica sh del fichero.

¿Suena demasiado fácil, verdad?

Efectivamente. Es probable que deba proveer de un filtro de salida, para efecto de que se mande la cadena de inicialización a la impresora. Aqui tenemos un ejemplo de un filtro de salida para impresoras compatibles con PCL de Hewlett Packard:

#!/bin/sh
#
#  hpof - Filtro de salida para impresoras compatibles con Hewlett Packard PCL
#  Instalado en /usr/local/libexec/hpof

printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf

Especifique la ruta del filtro de salida, en la característica of. Vea la sección Filtros de Salida para más información al respecto.

Aqui podrá ver un ejemplo de un fichero /etc/printcap para la impresora teak que trabajamos anteriormente; hemos añadido las páginas de encabezado, así como el filtro de salida mencionado anteriormente:

#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:

Ahora, cuando los usuarios impriman sus trabajos a la impresora teak, ellos obtendrán una página de encabezado por cada trabajo que manden a imprimir. Si los usuarios desean pasar un tiempo buscando sus impresiones, pueden deshabilitar la impresión de esta página con el comando lpr -h; para más información sobre las opciones de lpr(1), vea la sección Opciones de Páginas de Encabezado.

Nota: El sistema LPD envia a la impresora un caracter de alimentación de página. Si su impresora utiliza un caracter diferente de alimentación de página, especifíquelo en el fichero /etc/printcap, bajo la característica ff.

11.4.2.2. Controlando las Páginas de Encabezado

Al habilitar las páginas de encabezado, LPD produce un encabezado largo, una página completa con letras largas que identifican el usuario, la maquina host, y el trabajo. Aqui tenemos un ejemplo (kelly ha impreso un trabajo llamado outline, desde el host rose):

      k                   ll       ll
      k                    l        l
      k                    l        l
      k   k     eeee       l        l     y    y
      k  k     e    e      l        l     y    y
      k k      eeeeee      l        l     y    y
      kk k     e           l        l     y    y
      k   k    e    e      l        l     y   yy
      k    k    eeee      lll      lll     yyy y
                                               y
                                          y    y
                                           yyyy


                                   ll
                          t         l        i
                          t         l
       oooo    u    u   ttttt       l       ii     n nnn     eeee
      o    o   u    u     t         l        i     nn   n   e    e
      o    o   u    u     t         l        i     n    n   eeeeee
      o    o   u    u     t         l        i     n    n   e
      o    o   u   uu     t  t      l        i     n    n   e    e
       oooo     uuu u      tt      lll      iii    n    n    eeee









      r rrr     oooo     ssss     eeee
      rr   r   o    o   s    s   e    e
      r        o    o    ss      eeeeee
      r        o    o      ss    e
      r        o    o   s    s   e    e
      r         oooo     ssss     eeee







                                              Job:  outline
                                              Date: Sun Sep 17 11:04:58 1995

Después de esta página, LPD manda un caracter de alimentación de página, para que el trabajo sea impreso en una hoja blanca nueva (a menos que cuente con sf (por sus siglas en inglés “supress form feed”, que es “eliminación de alimentación de página”) en el fichero /etc/printcap).

Si lo prefiere, LPD puede generar un encabezado pequeño; puede hacer esto, al especificar sb en el fichero /etc/printcap. La página de encabezado que será impresa se vera así:

rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995

Por default, LPD imprime la página de encabezado en primer término y posteriormente el trabajo. Para cambiar este comportamiento, es necesario incluir la característica hl (encabezado a lo último por sus siglas en inglés), en el fichero /etc/printcap.

11.4.2.3. Conteo de P´ginas de Encabezado

Cuando se utiliza la utilidad integrada de conteo de LPD, refuerza el paradigma de que; cuando se refiere al conteo de impresiones: las páginas de encabezados deben ser sin coto alguno.

¿Por qué?

Por que el filtro de salida es el único programa externo que puede llevar un conteo de las páginas impresas, cuando tiene el control, y este no es provisto con información de un usuario o host o algun fichero contador, de tal forma que no tiene idea de a quien cargar estas impresiones. Tampoco es conveniente, simplemente “cargar una impresión” al total de las impresiones del filtro de texto o filtro de conversión (esos que cuentan con información del usuario y host), esto en virtud de que los usuarios pueden suprimir el uso de estas páginas con lpr -h. Esto implica que se le podrían cobrar hojas que ellos no imprimieron. Básicamente el comando lpr -h sería la opción preferida de los usuarios concientes del sistema, pero usted no puede ofrecer incentivo alguno para que se utilice.

Tampoco es una buena alternativa que cada filtro genere sus páginas de encabezado (y por lo tanto poder cobrar por ellas). Si los usuarios desean suprimirlas usando la opción lpr -h, aún obtendrán estas páginas y les serán cobradas, en virtud de que LPD no tiene transfiere la opción -h a los filtros.

Así que, ¿Qué opciones tenemos?

Usted puede:

  • Aceptar el paradigma de LPD y no cobrar por las páginas de encabezado.

  • Instalar una alternativa a LPD, tal como LPRng. La sección Alternativas al Sistema de Impresión Estándar le informa sobre otros programas que puede utilizar, que sustituyan a LPD.

  • Escribir un filtro de salida inteligente. Normalmente, un filtro de salida no esta diseñado para hacer otra cosa, que no sea inicializar la impresora o bien hacer alguna conversión sencilla de caracteres. Esta diseñado para páginas de encabezado y trabajos en texto plano (cuando no existe algun filtro de texto (entrada)). Pero cuando si existe un filtro de texto, para los trabajos en texto plano, entonces LPD sólo hará uso del filtro de salida para las páginas de encabezado. Y el filtro de salida puede pasar el texto de la página encabezado generado por LPD, para determinar el usuario y el host al cual se le cobrará dicha impresión. El único problema con este metodo es que el filtro de salida aún no sabe que fichero usar para llevar la cuenta de las impresiones (la característica af no pasa el nombre del fichero), pero si usted cuenta con un fichero establecido para llevar esta cuenta, puede incluirlo en el código del filtro de salida. Para efecto de facilitar este paso, utilice la característica sh (encabezado corto) del fichero /etc/printcap. Nuevamente, todo esto podría resultar muy complicado, y los usuarios estaran muy agradecidos con el generoso administrador del sistema que genera las páginas de encabezado gratis.

11.4.2.4. Páginas de Encabezado en Impresoras PostScript

Como se ha descrito anteriormente, LPD puede generar páginas encabezado en texto plano para gran cantidad de impresoras. Claro esta, que PostScript no puede imprimir texto plano directamente, de tal forma que la habilidad de imprimir estas páginas de LPD, es inservible--o casi.

Una forma obvia de crear las páginas de encabezado, es hacer que cada filtro de conversión y de texto, creen sus páginas de encabezado. Los filtros deberán utilizar el nombre de usuario y host, para generar esta página personalizada. Lo malo de este metodo es que los usuarios siempre obtendrán una página de encabezado, aun cuando usen en sus impresiones lpr -h.

Exploremos este metodo. El siguiente script considera tres argumentos (nombre del login del usuario, nombre del host, y nombre del trabajo) y genera una página simple de encabezado PostScript:

#!/bin/sh
#
#  make-ps-header - crea una pagina de encabezado PostScript a stdout
#  Instalado en /usr/local/libexec/make-ps-header
#

#
#  Estas son unidades PostScript (72 a la pulgada).  Modifiquelo para A4 o 
#  cualquier tamano de papel que este utilizando.
#
page_width=612
page_height=792
border=72

#
#  Verificar argumentos
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` <user> <host> <job>" 1>&2
    exit 1
fi

#
#  Salvar estos, principalmente para lectura de PostScript, mas abajo.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Enviar el codigo PostScript a la salida estandar.
#
exec cat <<EOF
%!PS

%
%  Segurese de no interferir con el trabajo del usuario c continuacion
%
save

%
%  Crear un grueso y poco placentero borde alrededor del borde de la pagina.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Desplegar nombre de login del usuario, bonito largo y prominente
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Ahora mostrar los aburridos detalle generales
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def }
forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
        270 y moveto show /y y 18 sub def
} forall

%
% Eso es todo
%
restore
showpage
EOF

Ahora, cada uno de los filtros de conversión y de texto, pueden invocar este script, para en primer lugar generar esta página y después imprimir el trabajo del usuario. Aqui tenemos el filtro de conversión DVI que revisamos anteriormente en este documento, modificado para generar páginas de encabezado:

#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#
                
orig_args="$@"

fail() {
    echo "$@" 1>&2
    exit 2
}

while getopts "x:y:n:h:" option; do
    case $option in
        x|y)  ;; # Ignore
        n)    login=$OPTARG ;;
        h)    host=$OPTARG ;;
        *)    echo "LPD started `basename $0` wrong." 1>&2
              exit 2
              ;;
    esac
done

[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args

Note como el filtro debe pasar los argumentos en orden, para efecto de determinar el nombre de usuario y host. El procedimiento para los otros filtros de conversión es identico. El filtro de texto tiene una pequeña variación (vea la sección Como Trabajan los Filtros).

Como hemos mencionado anteriormente, este esquema simplemente nos sirve para deshabilitar la opción “eliminar encabezados” (la opción -h) de lpr. Si los usuarios desean salvar algunos arboles (o algunos centavos si usted cobra por estas páginas), no podrán deshabilitar esta opción, ya que cada filtro imprimirá una página de encabezado con cada trabajo impreso.

Para permitir que los usuarios desactiven las páginas de encabezado en cada trabajo, será necesario que utilice el truco del que hablamos en la sección Conteo de Páginas de Encabezado: escribir un filtro de salida que pase la página generada por LPD y produzca una versión PostScript de la misma. Si el usuario utiliza lpr -h, entonces LPD no generará una página encabezado, y tampoco su filtro de salida. De otra forma, su filtro de salida tomará los datos de LPD y enviará el código PostScript apropiado para la impresión de la página de encabezado.

Si usted cuenta con una impresora PostScript conectada a un puerto serial, puede usar lprps, que cuenta con un filtro de salida, psof, que hace lo mencionado. Note que psof no cobra por las páginas de encabezado.

11.4.3. Impresión en Red

FreeBSD cuenta con soporte para impresión en red: envío de trabajos a impresoras remotas. La impresión en red, normalmente se cuenta con dos escenarios:

11.4.3.1. Impresoras Instaladas en Hosts Remotos

El sistema de cola de impresión de LPD cuenta con soporte integrado para enviar trabajos de impresión a un host remoto que cuente con LPD (o alguna sistema compatible con LPD). Esta habilidad le permite instalar una impresora en un host, y hacerla accesible desde otros hosts. También es útil con impresoras que cuentan con interfaces de red que comprenden el protocolo de LPD.

Para habilitar la funcionalidad de impresión remota, primero instale la impresora en un host, que será el host de impresión. Esto lo podemos hacer utilizando los pasos descritos en la sección Configuración Simple de una impresora. Realice cualquier configuración adicional adicional que se requiera, de acuerdo a lo descrito en la sección Configuración Avanzada de una Impresora. Asegurese de probar la impresora y de que esta funcionando correctamente, así como las funciones de LPD que haya habilitado. También asegurese de que el host local cuenta con autorización para usar el servicio de LPD en el host remoto (vea la sección Restricción de Trabajos de Impresoras Remotas).

Si usted esta utilizando una impresora que cuenta con un dispositivo de red, compatible con LPD, entonces el host de impresión mencionado más adelante, será la misma impresora, y el nombre de la impresora será el nombre que usted le haya asignado a la impresora. Vea la documentación que incluye su impresora y/o el dispositivo de impresión en red para detalles al respecto.

Sugerencia: Si usted esta utilizando una impresora LaserJet Hewlett Packard entonces la impresora nombre automáticamente hará la conversión de LF a CRLF, de tal forma que no será necesario el uso del script hpif.

Y de esta manera, para los hosts que desee que tengan acceso a la impresora, deberá crear una entrada en su fichero /etc/printcap, que contenga lo siguiente:

  1. Nombre la entrada como desee. Para simplificar, quizás desee darle el mismo nombre y alias usado en el host de impresión.

  2. La característica lp dejela en blanco, de manera explícita (:lp=:).

  3. Cree un directorio para la cola de impresión y especifique su ruta en la característica sd. LPD utilizará este directorio para almacenar los trabajos antes de que sean enviados al host de impresión.

  4. Añada el nombre del host de impresión a la característica rm.

  5. Añada el nombre de la impresora en el host de impresión en la característica rp.

Eso es todo. No es necesario listar los filtros de conversión, dimensiones de la página, o algo adicional en el fichero /etc/printcap.

Aqui tenemos un ejemplo. El host rose cuenta con dos impresoras, bamboo y rattan. Vamos a habilitar a usuarios en el host orchid para que puedan imprimir en esas impresoras. Aqui tenemos el fichero /etc/printcap para el host orchid (usado en la sección Habilitando las Páginas de Encabezado). Ya cuenta con la entrada para la impresora teak; y hemos añadido las entradas para las impresoras del host rose:

#
#  Fichero /etc/printcap para el host orchid - anadiendo impresoras 
#  (remotas) del host rose
#

#
#  teak es impresora local; esta conectada directamente a orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan esta conectada a rose; envio de trabajos para rattan en rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo tambien esta conectada a rose:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

Posteriormente, sólo necesitamos crear los directorios para la cola de impresión en el host orchid:

# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo

Ahora los usuarios de orchid pueden imprimir en rattan y bamboo. Si, por ejemplo, un usuario en orchid teclea

% lpr -P bamboo -d sushi-review.dvi
el sistema de cola de LPD en el host orchid, copiará el trabajo al directorio de cola /var/spool/lpd/bamboo y notará que se trata de un trabajo DVI. Tan pronto como el host rose tenga espacio en el directorio de cola de impresión de bamboo, los dos LPDs transferirán el fichero a rose. El fichero quedará en espera en la cola de rose hasta que sea impreso. Este será convertido de DVI a PostScript (dado que bamboo es una impresora PostScript), en rose.

11.4.3.2. Impresoras con Interfaces de Red para Secuencia de Datos

Comunmente, cuando usted adquiere una tarjeta de red para impresoras, puede obtener dos versiones: una que emula la cola de impresión (que son las de mayor valor), o bien, otra que simplemente le permite recibir datos tal como lo hace un puerto serial o paralelo (la versió económica). Esta sección le explica como utilizar la versión económica. Para el uso de la versión de mayor valor, vea la sección Impresoras Instaladas en Hosts Remotos.

El formato del fichero /etc/printcap le permite especificar que puerto serial o paralelo utilizar, y (en caso de que utilice un puerto serial) la velocidad de baudio, si utiliza control de flujo, retraso en tabulador, conversión de nuevas líneas y más. Pero no hay manera de indicar la conexión de una impresora que escucha en un puerto TCP/IP u otro puerto de red.

Para efecto de enviar datos a una impresora en red, usted necesita crear un programa de comunicación que pueda ser llamado desde un filtro de texto o de conversión. Aqui tenemos un ejemplo de dicho programa: el script netprint, que toma todos los datos de la entrada estandar y los envia a un impresora conectada a la red. Hemos especificado el nombre de host de la impresora como primer argumento y el puerto al que esta conectado como segundo argumento, en netprint. Note que este tipo de soporte sólo trabaja en una vía (de FreeBSD a la impresora); gran cantidad de impresoras cuentan con soporte de ambas vías, y quizás desee tomar ventaja de esto (para obtener estatus de impresión, contabilidad, desempeño, etc.).

#!/usr/bin/perl
#
#  netprint - Filtro de texto para impresoras en red
#  Instalado en /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;

Una vez hecho este script, podemos utilizarlo en varios filtros. Supongamos que contamos con la impresora de línea Diablo 750-N conectada a la red. La impresora acepta datos para impresión en el puerto 5100. El nombre de host que tiene la impresora es scrivener. El filtro de texto a usar quedaría de la siguiente manera:

#!/bin/sh
#
#  diablo-if-net - Filtro de texto para la impresora Diable en `scrivener' usando
#  el puerto 5100.   Instalado en /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

11.4.4. Restricción del Uso de la Impresora

Esta sección le da información sobre la restricción en el uso de la impresora. El sistema de LPD le permite controlar quien puede acceder a la impresora de ambas formas, local y remota, si los usuarios pueden imprimir múltiples copias, que tan grandes pueden ser los trabajos de impresión, y limitar el tamaño de la cola de impresión.

11.4.4.1. Restricción de Copias Multiples

El sistema de LPD le facilita a los usuarios el imprimir múltiples copias de un mismo fichero. Los usuarios pueden usar (por ejemplo) lpr -#5 para imprimir 5 copias de cada fichero enviado. El hecho de que esto sea bueno o no es algo que depende de usted.

Si usted siente que las copias múltiples causan trabajo inecesario a su impresora, puede deshabilitar la opción -# de lpr(1), al incluir la característica sc en su fichero /etc/printcap. Cuando los usuarios utilicen la opción -# al momento de imprimir, verán el siguiente aviso:

lpr: multiple copies are not allowed

Recuerde que si usted a configurado una impresora para su acceso de forma remota (vea la sección Impresoras Instaladas en Hosts Remotos), será necesario que también cuente con la característica sc en el fichero /etc/printcap del host remoto, o bien, los usuarios aun podrán hacer uso de la opción -#, al usar un host diferente.

Aqui presentamos un ejemplo. Este es un ejemplo del fichero /etc/printcap, del host rose. La impresora rattan es “de batalla” por lo que permitiremos las copias múltiples, pero la impresora laser bamboo es más delicada por lo que vamos a deshabilitar las copias múltiples, al añadir la característica sc:

#
#  Fichero /etc/printcap del host rose - restringe copias multiples en bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:\
        :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Ahora, tambié debemos añadir la característica sc en el fichero /etc/printcap del host orchid (y ya que estamos en eso, deshabiltemos las copias múltiples para la impresora teak):

#
#  Fichero /etc/printcap del host orchid - sin copias multiples para la
#  impresora local teak o impresora remota bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:

Al incluir la característica sc, hemos prevenido el uso de lpr -#, pero eso no previene el uso de lpr(1) gran cantidad de veces, o el envío del mismo trabajo varias veces, tal como:

% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign

Existen gran cantidad de formas para prevenir este abuso (incluyendo el ignorarlo), que usted queda en libertad de explorar.

11.4.4.2. Restricción de Acceso a Impresoras

Usted puede controlar quien puede imprimir y en que impresoras, haciendo uso del mecanismo de grupos de Unix y de la característica rg en el fichero /etc/printcap. Simplemente añada en un grupo determinado, a los usuarios que desea puedan imprimir en cierta impresora, y después añada el nombre del grupo a la característica rg.

Todos los usuarios que no pertenezcan a este grupo (incluyendo al superusuario (root)), y que deseen imprimir en la impresora controlada, les aparecerá este mensaje: “lpr: Not a member of the restricted group

De la misma forma que hicimos con sc (la eliminación de copias múltiples), con rg deber´ indicarla en los hosts remotos que tengan acceso a sus impresoras si lo cree conveniente (vea la sección Impresoras Instaladas en Hosts Remotos).

Por ejemplo, vamos a permitir que cualquiera imprima en rattan, pero solo aquellos que forman parte del grupo artistas podrán usar la impresora bamboo. Nuevamente tenemos el fichero /etc/printcap para el host rose:

#
#  Fichero /etc/printcap del host rose - grupo restringido para bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artistas:\
        :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Vamos a dejar de lado el otro fichero /etc/printcap de ejemplo (el del host orchid). Claro esta, que cualquier usuario desde orchid puede imprimir en bamboo. En este caso podriamos aceptar sólo ciertos accesos desde orchid, y esto les daría acceso a la impresora. O no.

Nota: Sólo puede haber un grupo restringido por impresora.

11.4.4.3. Controlando el Tamaño de los Trabajos Enviados

Si usted cuenta con gran cantidad de usuarios accesando sus impresoras, probablemente necesite establecer un límite máximo en el tamaño que deban tener los trabajos enviados a imprimir. Después de todo, sólo existe tanto espacio libre en el sistema de ficheros como el que se tiene en los directorios de cola, y también usted debe asegurarse de que exista el espacio suficiente para otros usuarios.

El sistema de LPD, le permite especificar un monto maximo de tamaño en bytes para un trabajo, con la característica mx. Las unidades están indicadas en blques BUFSIZ, que son de 1024 bytes. Si usted le agrega un cero a esta característica, no habrá límite en el tamaño de los trabajos que se puedan enviar a imprimir; por otro lado, si no se especifica la característica mx, el límite por default será de 1000 bloques.

Nota: El límite es válido para los ficheros del trabajo, y no para el tamaño total del trabajo.

El sistema de LPD no rehusará imprimir los trabajos que exceden el límite, en su lugar procederá con la impresión hasta el límite indicado. El resto del trabajo quedará descartado. El hecho de que este comportamiento sea correcto o no, aun es tema de debate.

Ahora permitamonos incluir límites a nuestras impresoras de ejemplo rattan y bamboo. En virtud de que esos “artistas” tienden a imprimir grandes trabajos en PostScript, los vamos a limitar a cinco megabytes. En la impresora de línea no vamos a especificar límite:

#
#  Fichero /etc/printcap del host rose
#

#
#  Sin limite de tamano en el trabajo:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Con limite de cinco megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

Nuevamente, los límites aplican sólo para los usuarios locales. Si se han configurado las impresoras para su acceso de forma remota, los usuarios que accesen remotamente no tendrán esta limitante. Para efecto de que esto sea válido en los usuarios remotos, deberá agregar la característica mx en el fichero /etc/printcap de los hosts remotos. Vea la sección Impresoras Instaladas en Hosts Remotos para mayor información sobre la instalación de impresoras en red.

Existe otra forma especializada para limitar el tamaño de los trabajos, desde impresoras remotas, vea la sección Restricción de Trabajos de Impresoras Remotas.

11.4.4.4. Restricción de Trabajos de Impresoras Remotas

El sistema de cola de LPD cuenta con varios metodos para restringir la impresión de trabajos enviados por hosts remotos:

Restricciones del Host

Haciendo uso de los ficheros /etc/hosts.equiv y /etc/hosts.lpd, usted puede controlar el LPD local, para determinar de que hosts remotos se acepten conexiones. En este caso, LPD verifica, en caso de una petición, que el host remoto se encuentre listado en agluno de estos dos ficheros. Si no es así, LPD rechazará la petición.

El formato de estos ficheros es simple: el nombre de un host por línea. Note que el fichero /etc/hosts.equiv también es usado por el protocolo ruserok(3), y afecta programas como rsh(1) y rcp(1), así que tenga cuidado al editarlo.

Por ejemplo, este es el fichero /etc/hosts.lpd del host rose:

orchid
violet
madrigal.fishbaum.de

Esto significa que rose aceptará peticiones de los hosts orchid, violet y madrigal.fishbaum.de. Si cualquier otro host intenta accesar el LPD de rose, el acceso será denegado.

Restricciones de Tamaño

Usted puede controlar cuanto espacio libre se requiere, en el sistema de fichero donde se localiza el directorio del sistema de impresión. Cree un fichero llamado minfree, en el directorio local de la cola de impresión. En ese fichero añada un numero que representa el numero de bloques libres que deben haber en el disco (512 bytes), para efecto de aceptar un trabajo de forma remota.

Esto permite asegurarle que los usuarios remotos no llenaran su disco duro. Esto también puede usarse para dar cierta prioridad a los usuarios locales: ya que podrá colocar sus trabajos en espera en la cola de impresión, hasta que la cantidad de espacio libre sea inferior a la indicada en el fichero minfree.

Por ejemplo, incluyamos a minfree en la impresora bamboo. Para esto, primero examinamos el fichero /etc/printcap, para encontrar los datos de la impresora; aqui tenemos la entrada de bamboo:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:

El directorio de la cola de impresión es indicado por la característica sd. Vamos a dejar tres megabytes (que son 6144 bloques de disco) como espacio libre que debe existir en el sistema de ficheros, para que LPD acepte trabajos remotos:

# echo 6144 > /var/spool/lpd/bamboo/minfree
             
Restricciones por Usuario

Usted puede controlar que usuarios remotos pueden imprimir en impresoras locales, al incluir la característica rs en /etc/printcap. Cuando rs aparece en la entrada de una impresora que esta conectada localmente, LPD aceptará trabajos de usuarios remotos, siempre y cuando el usuario que ha enviado el trabajo, tenga alguna cuenta, con el mismo nombre de usuario en el host local. De otra forma LPD no hará el trabajo.

Esta característica es particularmente útil en medios donde (por ejemplo) existen varias areas que comparten una red, y algunos usuarios traspasan las fronteras departamentales. Al otorgarles una cuenta en su sistema, pueden hacer uso de sus impresoras, desde su propio departamento de sistemas. Si solo desea permitirles hacer uso de sus impresoras y no de los recursos de su sistema, puede asignarles cuentas “tontas” (token accounts), que no cuentan con un directorio home y con un un shell inservible como /usr/bin/false.

11.4.5. Contabilidad del Uso de la Impresora

Así que usted requiere de cobrar por las impresiones. ¿Y por qué no?, el papel y la tinta cuestan dinero. Y también están los costos de mantenimiento--las impresoras estan llenas de partes móviles que tienden a descomponerse. Usted ha analizado sus impresoras, los patrones de uso, y costos de mantenimiento y ha llegado a un costo por-página (o por-pie, por-metro, o por-loquesea). Ahora bien, ¿Cómo empezar a llevar una contabilidad de las impresiones?.

Bueno, la mala noticia es que LPD no provee de mucha ayuda en esta area. El conteo depende en gran parte en el tipo de impresora con que usted cuenta, el formato en que se imprime y de sus requerimientos para cobrar por el uso de la impresora.

Para implementar un contador, deberá modificar el filtro de texto (para cobrar por impresiones en texto plano) y los filtros de conversión (para cobrar por impresiones en otro formato), para efecto de llevar un conteo de páginas o peticiones a la impresora para imprimir. Esto no podrá llevarse a cabo con un simple filtro de salida, dado que no puede llevar un conteo. Vea la sección Filtros.

En términos generales existen dos formas de hacer esto:

El sistema de cola de LPD cuenta con soporte para ambos metodos: en virtud de que usted debe proveer los filtros (bueno, casi todo el tiempo), también debe proveer del código para el contador. Pero hay un lado positivo: usted cuenta con una enorme flexibilidad en cuanto a metodos de contabilidad se refiere. Por ejemplo, puede utilizar un contador periodico o por tiempo. Usted selecciona que información debe quedar registrada: nombre de usuario, nombre del host, tipo de trabajo, páginas impresas, medidas del papel usado, tiempo que duro en imprimir el trabajo, y así sucesivamente. Y para hacer esto, sólo debe modificar sus filtros.

11.4.5.1. Contabilidad de Impresiones Rápida y Sucia

FreeBSD cuenta con dos programas que pueden auxiliarlo para instalar un simple contador periodico. Ellos son; el filtro de texto lpf, descrito en la sección lpf: un Filtro de Texto, y pac(8), un programa para reunir y totalizar la información de los ficheros de contador de impresiones.

Como se menciono en la sección de filtros (Como Trabajan los Filtros), LPD inicia los filtros de texto y conversión con el nombre del fichero contador a usar en la línea de comando del filtro. Los filtros pueden usar este argumento para saber en donde registrar la información. El nombre de este fichero se indica en la característica af del fichero /etc/printcap, y si no se indica su ruta completa, se hará referencia al directorio de la cola de impresión.

LPD inicia lpf con los argumentos de alto y ancho del papel (tomados de pw y pl). lpf usa estos argumentos para determinar cuanto papel será necesario. Una vez enviado el fichero a impresión, se escribe en el fichero contador un registro. Este registro es así:

2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang

Deberá usar un fichero contador para cada impresora, dado que lpf no cuenta con una lógica de bloqueo de ficheros incluida, y dos lpf escribiendo al mismo tiempo en un fichero podrian corromperlo. Una forma segura para garantizar el uso de ficheros distintos por impresora, es usar af=acct en el fichero /etc/printcap. De esta forma contaremos con el fichero contador de cada impresora por separado, en el directorio de la cola de impresión, en un fichero llamado acct.

Cuando sea el momento de cobrar a los usuraios, ejecute el programa pac(8). Sólo dirijase al directorio de cola, del cual desea recabar la información y teclee pac. Usted obtendrá un resumen similar al siguiente:

  Login               pages/feet   runs    price
orchid:kelly                5.00    1   $  0.10
orchid:mary                31.00    3   $  0.62
orchid:zhang                9.00    1   $  0.18
rose:andy                   2.00    1   $  0.04
rose:kelly                177.00  104   $  3.54
rose:mary                  87.00   32   $  1.74
rose:root                  26.00   12   $  0.52

total                     337.00  154   $  6.74

Estos son los argumentos que puede pasar a pac(8):

-Pimpresora

De que impresora hacer el resumen. Esta opción funciona, solo si existe una ruta absoluta, en la característcia af del fichero /etc/printcap.

-c

Ordenar la salida por costo en lugar de por usuario alfabeticamente.

-m

Ignorar el nombre de host. Con esta opción, el usuario smith del host alpha, es el mismo usuario smith del host gamma. Sin esta opción, se consideran usuarios diferentes.

-pprecio

Computar cargos con tal precio en dólares por página o por pie, en lugar del precio tomado de la característica pc del fichero /etc/printcap, o dos centavos (precio por default). Puede indicar el precio como un numero de punto flotante.

-r

Invertir el orden de acomodo.

-s

Crear un fichero de resumen y reiniciar el fichero contador.

nombre ...

Imprimir la información del usuario nombre unicamente.

En el resumen que genera pac(8) por default, podrá observar el numero de páginas impresas por cada usuario desde diferentes hosts. Si en su sitio, el host no es importante (por que los usuarios pueden usar cualquier host), ejecute pac -m, para producir el siguiente resumen:

  Login               pages/feet   runs    price
andy                        2.00    1   $  0.04
kelly                     182.00  105   $  3.64
mary                      118.00   35   $  2.36
root                       26.00   12   $  0.52
zhang                       9.00    1   $  0.18

total                     337.00  154   $  6.74

Para calcular el monto adeudado, pac(8) utiliza la característica pc del fichero /etc/printcap (que por default utiliza 200, o 2 centavos por página). Especifique en cientos de centavos el precio a cobrar por página o por pie, que desea cobrar, en esta característica. Puede reemplazar este valor cuando ejecuta pac(8) con la opción -p. Las unidades de esta opción estan expresadas en dólares, y no en cientos de centavos. Por ejemplo,

# pac -p1.50
hace que cada página tenga un costo de un dolar con cincuenta centavos. Realmente se puede exceder en las utilidades usando esta opción.

Finalmente, ejecutando pac -s puede guardar la el resumen, en un fichero, que es nombrado al igual que el fichero contador de la impresora, pero con _sum al inicio del fichero. Posteriormente reinicia el fichero contador. Cuando ejecuta pac(8) nuevamente, lee el fichero resumen, para obtener los totales y posteriormente añade la información del fichero contador normal.

11.4.5.2. ¿Cómo Contabilizar las Páginas Impresas?

Para efecto de que pueda obtener un conteo más cercano a la realidad, necesita poder determinar cuanto papel utiliza cada trabajo. Este es el problema esencial del conteo de impresiones.

Para impresiones en texto, este problema no es tan difícil de resolver: puede contabilizar el numero de líneas que tiene un trabajo y dividirlas entre el numero de líneas totales por página que maneja la impresora. No olvide contabilizar los retrocesos del fichero que sobreimprimen líneas, o de las largas líneas lógicas que se justifican en en una o más líneas físicas.

El filtro de texto lpf (introducido en lpf: un Filtro de Texto) toma en cuenta todas estas cosas cuando hace el conteo. Si usted esta escribiendo un filtro de texto que requiere contabilizar, quizás desee examinar el código fuente del lpf.

Pero, ¿Cómo manejar otros formatos?

Bueno, para conversiones DVI-a-LaserJet o DVI-a-PostScript, puede hacer que su filtro pase la información de salida a dvilj o dvips y ver cuantas páginas fueron convertidas. Puede hacer cosas similares con otros formatos y filtros de conversión.

Pero estos metodos sufren del hecho de que la impresora puede no imprimir estas páginas. Po ejemplo, se pueden atorar, acabarse la tinta, o explotar--y el usuario de todas formas se le cobrará.

Entonces, ¿qué puede hacer?

Sólo existe una forma segura de llevar un conteo confiable. Adquiera una impresora que pueda indicarle cuanto papel utiliza, y conectela por medio de un puerto serial o en red. Casi todas las impresoras PostScript cuentan con soporte para esto. Existen otras marcas u modelos que también cuentan con el soporte (por ejemplo, las impresoras en red Imagen laser). Modifique los filtros de estas impresoras para que lleven un conteo de las oáginas impresas y que almacenen los registros basados en el valor only. No se requiere de un conteo de líneas o de examinar el fichero de errores.

Claro esta que usted puede ser muy generoso y no cobrar por las impresiones.

Éste y otros documentos pueden obtenerse en ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para preguntas acerca de FreeBSD, leer la documentación antes de contactar con la lista <questions@FreeBSD.org>.
Para preguntas acerca de esta documentación, e-mail a <doc@FreeBSD.org>.