COMOSEHACEN Filtros de Impresión

Paco Andrés
Maquetador Linuxdoc-SGML: Antonio Ismael Olea González,
olea@poboxes.com 2:345/108.9@fidonet.org

V1.0, 14 de agosto 1997 (por esta edición)


OJO .- Esto es una versión Alfa (No os la creais mucho ;-) Nota: este documento tiene su origen en la red FidoNet de la cual lo extrajo el maquetador. Por desgracia no puede informar de su fecha original ni de alguna versión más reciente ni siquiera de alguna forma para contactar con el autor vía la Red.

1. El sistema de impresión de Linux

Nota: En este fichero se nombra muchas veces el fichero printcap, es el fichero /etc/printcap. Su contenido está muy bien explicado en el Configuracion-Impresion-Como.

El sistema de impresión de Linux, y en general de todos los Un*x basados en BSD, funciona (a grandes rasgos) de la siguiente manera.

El comando lpr copia el fichero a imprimir en el directorio de spool indicado en el fichero printcap (sd=directorio-spool) y crea en dicho directorio un fichero de control en el que indica: el fichero (del directorio de spool) a imprimir, el usuario que solicitó ese servicio de impresión, los parámetros que se le pasaron en la línea de comandos, etc. y ahí termina su función.

A continuación entra en juego un daemon (una especie de tsr para los que venimos del MS-2) llamado lpd. Este programa se activa periódicamente y comprueba si hay ficheros de control en el directorio de spool, y en caso de que los haya realiza las siguientes acciones para cada uno de dichos ficheros :

  1. imprime la página de banner, si ésta no se encuentra suprimida (orden sh del fichero printcap) , pasándola a través del filtro de salida si hay alguno definido (orden of del fichero printcap) ;
  2. si (según el fichero de control) se indicó al comando lpr que tenía que emplear algún filtro de impresión en concreto (ej.: lpr -t) se ejecuta el filtro indicado en la correspondiente entrada del fichero printcap; si no se indicó ningún filtro al comando lpr, se ejecuta el indicado por el parámetro 'if' del fichero printcap.
  3. Cuando se ejecuta el filtro, se redirecciona su entrada estándar al fichero a imprimir (el creado por lpr en el directorio de spool) , y su salida estándar a :

2. Los filtros de impresión

Según la descripción anterior un filtro de impresión no es más que un programa (generalmente un script) que teniendo en su entrada estándard un fichero en un formato determinado (ej.: troff) , escribe en su salida estándar los códigos necesarios para que la impresora imprima dicho fichero.

¡Fácil, eh! ;-)

3. ¿Cómo se hacen?

A no ser que dispongáis de una impresora PostScript es muy raro que tengáis programas que puedan imprimir directamente ficheros en muchos de los formatos más habituales (troff, dvi, etc...) . Por eso, lo que se suele hacer es:

4. Ejemplos

A continuación os pongo dos ejemplos de juegos de filtros de impresión. El primero emplea el PostScript como formato intermedio, por lo que podéis adaptarlo fácilmente a cualquiera de las muchas impresoras soportadas por el ghostscript, y el segundo ejemplo emplea el formato DVI como formato intermedio.

Ambos ejemplos están preparados para una impresora HP-Deskjet 5?? monocroma, aunque no debe resultaros muy difícil adaptarlos a vuestra impresora en concreto.

5. Peticiones

En primer lugar, este texto tiene muchos errores, cosas mal explicadas, etc. Enviadme por Net todas las sugerencias y correcciones al texto que creáis interesantes.

Si adaptáis estos filtros para otras impresoras, hacéis otros nuevos, los mejoráis, etc, mandadme el nuevo juego de filtros (o las diferencias si son pocas) de forma que podamos ir creando una base de datos de filtros de impresión y ponerla a disposición de todos, no teniendo los usuarios nuevos que reinventar la rueda cada vez (aunque en este caso no sea muy difícil de reinventar ;-) ).

6. Los ejemplos

Fichero /etc/printcap

#
# Copyright (c) 1983 Regents of the University of California.
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted
# provided that this notice is preserved and that due credit is given
# to the University of California at Berkeley. The name of the University
# may not be used to endorse or promote products derived from this
# software without specific prior written permission. This software
# is provided ``as is'' without express or implied warranty.
#
#    @(#) etc.printcap  5.2 (Berkeley) 5/5/88
#

#   Modificado  5-1-95 por Paco Andres para incluir los filtros
#   para la impresora HP-Deskjet. Y quitar lo que sobra.
#

#
# HP Deskjet
# Se han agnadido los siguientes filtros :
#    lpr #, donde # puede ser :
#    -d  -->  Ficheros DVI
#    -n  -->  Ficheros generados por gtroff
#    -t  -->  Ficheros a procesar por groff (este ya llama gtroff si es
          necesario) 
#    -f  -->  Ficheros PostSript
lp|hpdj:\
    :lp=/dev/lp0:\
:sh:\
    :sd=/usr/spool/lp0:\
    :mx#0:\
    :if=/usr/spool/lp0/hpdjlp:\
:df=/usr/spool/lp0/filtro.dvi:\
:nf=/usr/spool/lp0/filtro.gro:\
:tf=/usr/spool/lp0/filtro.troff:\
:rf=/usr/spool/lp0/filtro.postscript:\
    :lf=/usr/spool/lp0/hp-log:

Tened en cuenta que la línea :lp=/dev/lp0: le indica al sistema que la impresora está conectada a lp0, si la tenéis en otro puerto (lp1, lo más habitual) tendréis que cambiar esa línea a lp1 en la inmensa mayoría de los casos.

  1. Con PostScript Nota: el parámetro -n es para que el comando echo no mande un avance de línea después de los códigos. Fichero /usr/spool/lp0/hpdjlp
    En caso de ser una distribución RedHat, /var/spool/lpd/lp0/hpdjlp. Suele ser útil hacer un symlink: ln -s /var/spool /usr/spool
    Programa la impresora para que use el juego de caracteres ISO-8859-1, papel A4, 66 líneas por página (más o menos el estándar Unix) , y que acepte los avances de línea com CR+LF.
    #!/bin/bash
    echo -ne "\033E\033(0N\033&l26A\033&l66P\033&k2G"
    cat
    echo -ne "\033E"
    
    Fichero /usr/spool/lp0/filtro.dvi Permite imprimir los ficheros dvi en la impresora HP-Deskjet. Los pasa primero a PostScript, y luego lo imprime mediante el ghostcript. Cambiando el parámetro -sDEVICE (y probablemente la resolución) se puede indicar otro tipo de impresora.
    #!/bin/bash
    cat > /tmp/fich.dvi.$$
    /usr/TeX/bin/dvips -q '-f*' < /tmp/fich.dvi.$$ | gs -q -sDEVICE=deskjet -r300 -dNOPAUSE \
    -sPAPERSIZE=a4 -sOutputFile=- -
    rm /tmp/fich.dvi.$$
    
    Fichero /usr/spool/lp0/filtro.gro
    #!/bin/bash
    #           Filtro de impresora para procesar la salida de Troff
    grops -g | gs -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPAPERSIZE=a4 -sOutputFile=- -
    
    Fichero /usr/spool/lp0/filtro.troff
    #!/bin/bash
    #           Filtro de impresora para procesar ficheros Troff
    /usr/bin/groff -i -mdoc -mm -man | gs -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPAPERSIZE=a4 \
    -sOutputFile=- -
    
    Fichero /usr/spool/lp0/filtro.postscript
    #!/bin/bash
    #           Filtro de impresora para procesar ficheros PostScript
    gs -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPAPERSIZE=a4 -sOutputFile=- -
    
  2. Con DVI El fichero /etc/printcap es el mismo que en el caso anterior Fichero /usr/spool/lp0/hpdjlp Programa la impresora para que use el juego de carácteres ISO-8859-1, papel A4, 66 líneas por página (más o menos el estándar Unix) , y que acepte los avances de línea com CR+LF.
    #!/bin/bash
    #
    #   Filtro de impresora de caracter general.
    #
    #
    
    PATH=/usr/spool/lp0:$PATH:/usr/bin:/bin:/usr/local/bin:/usr/TeX/bin
    DIR_FILTROS=/usr/spool/lp0     # Directorio en el que se encuentran
                                   # los filtros de esta impresora
    
    echo -ne "\033E\033(0N\033&l26A\033&l66P\033&k2G"
    cat
    echo -ne "\033E"
    
    Fichero /usr/spool/lp0/filtro.dvi Permite imprimir los ficheros dvi en la impresora HP-Deskjet, emplea el programa dvidj500
    #!/bin/bash
    #
    #   Filtro de impresora   para los ficheros dvi.
    PATH=/usr/spool/lp0:$PATH:/usr/bin:/bin:/usr/local/bin:/usr/TeX/bin
    DIR_FILTROS=/usr/spool/lp0     # Directorio en el que se encuentran
                                   # los filtros de esta impresora
    
    TEXFONTS=/var/texfonts/pk/HPDeskJet/
    export TEXFONTS
    
    fichero=/tmp/filtro.dvi.$$
    cat > $fichero ;
    
    #echo -ne "\033E"          # Reseteo la impresora por si acaso
    
    # anulo la salida de errores para que lpd no guarde todo el rollo del
    # MakeTeXPK
    /usr/local/bin/dvidj500   <  $fichero  2> /dev/null
    
    rm $fichero
    
    Fichero /usr/spool/lp0/filtro.gro
    #!/bin/bash
    #           Filtro de impresora para procesar la salida de Troff
    grodvi  | /usr/spool/lp0/filtro.dvi
    
    Fichero /usr/spool/lp0/filtro.troff
    #!/bin/bash
    #           Filtro de impresora para procesar ficheros Troff
    PATH=/usr/spool/lp0:$PATH:/usr/bin:/bin:/usr/local/bin:/usr/TeX/bin
    DIR_FILTROS=/usr/spool/lp0     # Directorio en el que se encuentran
                                   # los filtros de esta impresora
    
    TEXFONTS=/var/texfonts/pk/HPDeskJet/
    export TEXFONTS
    
    /usr/bin/groff -i -Tdvi -mdoc -mcn -mgm -mgmse -man | $DIR_FILTROS/filtro.dvi
    
    Fichero /usr/spool/lp0/filtro.postscript
    #!/bin/bash
    #           Filtro de impresora para procesar ficheros PostScript
    gs -q -sDEVICE=deskjet -r300 -dNOPAUSE -sPAPERSIZE=a4 -sOutputFile=- -
    

Espero que os sea útil todo este rollo.