Filtros de impresión con Ghostscript <author>A. Gustavo González <tt><htmlurl url="mailto:agonzale@cica.es" name="agonzale@cica.es"></tt> <date>26 de Septiembre 1999 <abstract>En este artículo se introducen los fundamentos para componer filtros de impresión mediante el programa Ghostscript. <toc> <sect>¿Por qué este documento? <p> Hace tiempo leí un mini-Cómo sobre filtros de impresión maquetado por nuestro admirado compañero Ismael Olea <tt><htmlurl url="mailto:olea@iname.com" name="olea@iname.com"></tt>, extraído de la red Fidonet, y me dejó con la miel en los labios, pues era muy corto. En este documento, cuyo carácter es fundamentalmente didáctico -- pensado para usuarios noveles de linux que ya conocen el funcionamiento de la impresión por <em>spooling</em> -- intento presentar de modo breve y resumido qué es Ghostcript y cómo usarlo para elaborar filtros de impresión. <sect>Lo primero es lo primero: ¿Por qué necesito Ghostscript para imprimir en linux? <p> Pues porque el formato estándar de los ficheros imprimibles en UNIX es PostScript (PS), pero no todo el mundo tiene una impresora PS. <em>Ghostscript</em>, escrito por Peter Deutsch, fundador de <em>Aladdin Enterprises</em>, es el intérprete por excelencia de documentos en formato PS (y también PDF). Ghostscript permite presentar datos PS y PDF en la pantalla y además traducirlos de manera que puedan ser impresos en una impresora con capacidad gráfica mediante el uso del controlador de dicha impresora. Como afortunadamente, además, disponemos de herramientas para convertir otros formatos, tanto de documentos (como TEX, HTML, etc.) como de figuras (como GIF, TIFF, etc.) en PS, basta con diseñar <bf>filtros de impresión</bf> combinando el conversor de formato con el programa Ghostscript mediante tuberías («pipes», |). Aladdin Enterprises mantiene las nuevas versiones de Ghostscript hasta que alcanzan una cierta «edad», y luego las libera a la Fundación de Software libre (FSF, Free Software Foundation) para que se distribuya como <em>GNU Ghostscript</em>. Estas versiones son las que se distribuyen «libres de cargo» en las distribuciones de Linux. La versión Ghostscript 5.1 es de las últimas liberadas y funciona de perlas para la creación de filtros de impresión. <sect>La orden gs y sus opciones <p> El programa Ghostcript se ejecuta a través de la orden <em>gs</em> con diferentes opciones <sect1>Entradas a gs <p> Además de las opciones a considerar, <em/gs/ actúa sobre un fichero de entrada en formato PS: <tscreen><verb> gs [opciones] fichero.ps </verb></tscreen> Donde <tt>fichero.ps</tt> es el fichero de entrada, pero uno también puede conectar una entrada por tubería (en el sentido de «to pipe») en Ghostscript utilizando el nombre de fichero especial «<tt/-/», como por ejemplo <tscreen><verb> {programa convertidor a formato PS} | gs [opciones] - </verb></tscreen> La presencia del argumento «<tt/-/» al final de la línea de órdenes indica a Ghostscript que lea la entrada estándar (<em/STDIN/) desde un fichero o tubería en lugar de desde el teclado. Es la opción de recibo cuando se diseña un filtro de entrada para imprimir en PS. El fichero «<tt/-/» presenta las siguientes características: <itemize> <item>Cuando Ghostscript termina de leer la tubería, deja de estar en modo interactivo. Por ello, «<tt/-/» es útil únicamente como último argumento de la línea de órdenes. <item>«<tt/-/» no puede usarse para conectar con una entrada PDF en tubería. </itemize> <sect1>Dispositivo de salida <p> Ghostscript dispone de una serie de dispositivos controladores para diversos tipos de impresora. Si invocamos <tt>gs -h</tt>, nos aparecerá gran cantidad de información sobre nuestra versión instalada de Ghostscript, entre la que encontraremos los dispositivos controladores. He aquí el listado correspondiente a dicha orden: <tscreen><verb> GNU Ghostscript 5.10 (1998-12-17) Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. Usage: gs [switches] [file1.ps file2.ps ...] Most frequently used switches: (you can use # in place of =) -dNOPAUSE no pause after page | -q `quiet', fewer messages -g<width>x<height> page size in pixels | -r<res> pixels/inch resolution -sDEVICE=<devname> select device | -dBATCH exit after last file -sOutputFile=<file> select output file: - for stdout, |command for pipe, embed %d or %ld for page # Input formats: PostScript PostScriptLevel1 PostScriptLevel2 PDF Available devices: x11 x11alpha x11cmyk x11gray2 x11mono lvga256 vgalib t4693d2 t4693d4 t4693d8 tek4696 appledmp ccr lp2563 lbp8 lips3 m8510 necp6 cp50 oce9050 oki182 okiibm r4081 sj48 xes ln03 la50 la70 la75 la75plus sxlcrt deskjet djet500 laserjet ljetplus ljet2p ljet3 ljet4 declj250 paintjet pjetxl cdeskjet cdjcolor cdjmono cdj550 cdj500 djet500c dnj650c pj pjxl pjxl300 hpdj uniprint epson eps9mid eps9high epsonc lq850 lp8000 st800 stcolor ap3250 ibmpro bj10e bj200 bjc600 bjc800 ljet3d lj4dith lj5mono lj5gray lj250 faxg3 faxg32d faxg4 dfaxhigh dfaxlow pcxmono pcxgray pcx16 pcx256 pcx24b pcxcmyk pbm pbmraw pgm pgmraw pgnm pgnmraw pnm pnmraw ppm ppmraw pkm pkmraw tiffcrle tiffg3 tiffg32d tiffg4 tifflzw tiffpack cif bmpmono bmp16 bmp256 bmp16m tiff12nc tiff24nc psmono psgray bit bitrgb bitcmyk sgirgb pngmono pnggray png16 png256 png16m cgmmono cgm8 cgm24 jpeg jpeggray miff24 mgrmono mgrgray2 mgrgray4 mgrgray8 mgr4 mgr8 pdfwrite pswrite epswrite pxlmono pxlcolor nullpage Search path: . : /usr/lib/ghostscript/common : /usr/lib/ghostscript/5.10 : /usr/lib/ghostscript/fonts For more information, see /usr/doc/gs/use.txt. Report bugs to ghost@aladdin.com; use the form in bug-form.txt. </verb></tscreen> Así, si disponemos de una impresora HP Deskjet 550C y vamos a imprimir el <tt>fichero.ps</tt>, haremos: <tscreen><verb> gs -sDEVICE=cdj550 fichero.ps </verb></tscreen> <sect1>Resolución de la impresión <p> Algunas impresoras pueden imprimir a diferentes resoluciones (siendo la menor la que se toma por defecto). Para seleccionar la resolución horizontal (<tt/num1/) y vertical (<tt/num2/) en pixels por pulgada, se utiliza la opción <tscreen><verb> -rnum1xnum2 -rnum es equivalente a -rnumxnum (cuando num1=num2=num) </verb></tscreen> <sect1>Salida a un fichero <p> Si seleccionamos una impresora como dispositivo de salida, Ghostscript también permite controlar a dónde envía el dispositivo su salida. En el sistema DOS, la salida se dirige normalmente a a la impresora (PRN); en UNIX, generalmente se envía a un fichero temporal para su impresión en cola. Para dirigir la salida a un fichero (<tt>fichero.out</tt>), se utiliza la opción <tscreen><verb> -sOutputFile=fichero.out </verb></tscreen> Pero en UNIX, también podemos usar esta opción para enviar la salida a una conexión por tubería, por ejemplo al servidor de impresión, mediante la orden <em/lpr/ <tscreen><verb> -sOutputFile=\|lpr </verb></tscreen> o enviarlo a la salida estándar (<tt>sOutputFile=-</tt>) para que, por ejemplo, el demonio <em>lpd</em> tome esos datos de la salida estándar y los entregue a la impresora. Esta es una de las opciones usadas en la construcción de filtros de impresión. <tscreen><verb> gs [opciones] -sOutputFile=- -q |... </verb></tscreen> En este caso es necesario emplear la opción <tt/-q/ (quiet) que evita que el programa Ghostscript escriba mensajes en la salida estándar y se mezclen con la corriente de salida del dispositivo de impresión. <sect1>Escogiendo el tamaño de papel <p> Ghostscript se distribuye configurado para usar papel «US letter», que es el tamaño de página por defecto, pero existen otros tamaños que se configuran empleando la instrucción <tt>-sPAPERSIZE=<em>opción</em></tt>, como por ejemplo <tscreen><verb> -sPAPERSIZE=a4 -sPAPERSIZE=legal </verb></tscreen> <sect1>Otras opciones a considerar <p> En el caso de construcción de filtros de entrada, hay otras opciones interesantes: <itemize> <item><tt>-dSAFER</tt>: Evita que actúen los operadores de borrado o renombrado de ficheros, así como la posibilidad de abrir ficheros en cualquier otro modo que no sea de sólo lectura. Esto es fundamental para el mecanismo de <em/spooling/ del demonio de impresión. <item><tt>-dNOPAUSE</tt>: Deshabilita el <em/prompt/ y la pausa al final de cada página. Se utiliza para producir salidas de impresión o para controlar <em/gs/ desde otro programa. <item><tt>@<em>fichero</em></tt>: Hace que <em/gs/ lea el fichero y trate su contenido como si fueran líneas de órdenes. Las instrucciones dentro del fichero pueden estar separadas por al menos un espacio en blanco. </itemize> <sect>¿Qué es un filtro de impresión y cómo se construye? <p> Antes que nada es necesario recordar el mecanismo de <em/spooling/ típico de los servidores de impresión en linux. En primer lugar el servidor <em>lpr/lprng</em> copia el fichero a imprimir en el directorio de «<em/spool/» (<tt/sd/) indicado en el fichero <tt>/etc/printcap</tt>, 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 (<em/lpd/) comprueba periódicamente si hay ficheros de control en el directorio <em/spool/, y si es así, realiza las siguientes tareas: <itemize> <item>Imprime la página de «<em/banner/» si no se ha suprimido (con la instrucción <tt/sh/ en el fichero <tt>/etc/printcap</tt>) y la pasa a través del filtro de salida si lo hay (instrucción <tt/of/ del fichero <tt>/etc/printcap</tt>) <item>Si no se indicó al servidor de impresión que empleara algún filtro de impresión en concreto, entonces se utilizará el filtro de entrada, cuya ruta indica el parámetro <tt/if/ del fichero <tt>/etc/printcap</tt>. <item>Al ejecutarse el filtro de entrada, se redirecciona su entrada estándar al fichero de control y su salida estándar a: <itemize> <item>la entrada estándar del filtro de salida (<tt/of/) cuando lo haya, y la salida de dicho filtro al dispositivo de impresión asociado a la impresora (entrada <tt/lp/ del fichero <tt>/etc/printcap</tt>) <item>al dispositivo de impresión indicado en <tt>/etc/printcap</tt> </itemize> </itemize> 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 (<em/STDIN/) un fichero en un formato determinado , p. ej., ps (postscript), escribe en su salida estándar (<em/STDOUT/) los códigos necesarios para que la impresora imprima dicho fichero. Consideremos que disponemos de una impresora <bf>HP Laserjet Plus</bf> y vamos a escribir algunos filtros. La resolución será de <bf/300x300/; el formato de papel, <bf/A4/; y el controlador de dispositivo es <bf/ljetplus/. Vamos a escribir el filtro <!-- <footnote>N. del R.: En los guiones, veremos que algunas líneas se parten a la mitad con un símbolo «<bf/\/». Esto es así porque en ciertos formatos impresos, la línea no aparece completa, y hay que pasar parte del contenido a la siguiente. Esto es perfectamente válido, ya que en un <em/shell script/, «<bf/\/» al final de línea significa que la siguiente es continuación</footnote> --> para ficheros PS como un <em/shell script/: <tscreen><verb> #!/bin/bash/ #Filtro de ficheros postscript /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4 -sOutputFile=- - </verb></tscreen> Como podemos ver, <em/gs/ lee la <em/STDIN/ desde el fichero de control que ha creado el servidor de impresión <em/lpr/; se ejecuta el filtro y la opción <tt>-sOutputFile=-</tt> envía la salida a <em/STDOUT/. El demonio <em/lpd/ tomará los datos que se encuentren en <em/STDOUT/ y los enviará a la cola de impresión. Para procesar un fichero PDF aprovechando la utilidad <em/pdf2ps/ (<em/shell script/ que convierte un fichero PDF a PS), escribiremos el filtro: <tscreen><verb> #!/bin/bash/ #Filtro de ficheros pdf /usr/bin/pdf2ps | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\ -sOutputFile=- - </verb></tscreen> Para un texto en formato troff, emplearíamos este otro <tscreen><verb> #!/bin/bash/ #Filtro de ficheros troff /usr/bin/grops -g | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\ -sOutputFile=- - </verb></tscreen> (la opción <tt/-g/ para la orden <em/grops/ permite generar documentos en formato <tt/letter/ o <tt/a4/) Como puede verse el concepto de filtro sería un <em/shell script/ con los siguientes campos: <tscreen><verb> #!/bin/bash #Comentario 'filtro para ficheros XYZ' /usr/bin/XYZps | /usr/bin/gs -q -dSAFER -dNOPAUSE -sDEVICE=ljetplus -r300 -sPAPERSIZE=a4\ -sOutputFile=- - </verb></tscreen> Donde <em/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 <em/tiff2ps/, mientras que los GIF y JPEG se pasan a formato PNM mediante los programas <em/giftopnm/ y <em/djpeg/, respectivamente. Una vez en este formato, se traduce a PS con la utilidad <em/pnmtops/. <sect>Filtros mágicos <p> Un filtro puede ser tan sencillo como los que hemos visto, o complicarse substancialmente, llegando a ser capaz de reconocer el tipo de fichero que queremos imprimir y realizar las operaciones necesarias para que obtengamos una salida correcta. Un «filtro mágico» analiza la entrada que recibe y, de acuerdo con los datos que le llegan, manda el trabajo a otro filtro secundario. Así, cuando le llega un fichero en formato PS, lo envía a <em/ghostcript/, cuando es JPEG, lo manda a otro filtro adecuado para la impresión correcta, etc. Los filtros mágicos más conocidos son <bf>magicfilter</bf>, <bf>apsfilter</bf> y los <bf>filtros de impresión de RedHat</bf>. <sect1>Magicfilter <p> Magicfilter es un programa escrito por H. Peter Anvin <tt><htmlurl url="mailto:Peter.Anvin@linux.org" name="Peter.Anvin@linux.org"></tt> que puede encontrarse en cualquier espejo de sunsite, en el directorio <tscreen><verb> /mirror/linux/sunsite/system/printing/magicfilter-1.2.tar.gz </verb></tscreen> y también existe como paquete <tt>.deb</tt> y <tt>.rpm</tt>. Es el filtro mágico recomendado en la distribución Debian. Para configurar una impresora en este sistema, primero han de instalarse los paquetes <em/magicfilter/ y <em/recode/. El programa <em/magicfilterconfig/ se crea al instalar el paquete <bf/magicfilter/ y permite una cómoda configuración de la impresora, escribiendo el fichero <tt>/etc/printcap</tt> a partir de las respuestas a una serie de preguntas que nos hace interactivamente. Nos pregunta por el puerto del dispositivo (<tt>/dev/lp1</tt> o <tt>/dev/lp0</tt>), así como los nombres que daremos a nuestra impresora: uno largo y descriptivo y otro más corto que se usará como nombre para el directorio <em/spool/ y luego muestra una serie de filtros disponibles para elegir. Lo mejor es mirar, antes de ejecutar <em/magicfilterconfig/, en el directorio <tt>/etc/magicfilter</tt> para ver cuál es el filtro que mejor viene a nuestra impresora. Los filtros son archivos de texto en cuyo cabecera se indica la impresora que lo puede utilizar. <em/magicfilterconfig/ genera el fichero <tt>/etc/printcap</tt> con toda la información que le hemos dado. Para el caso de mi Epson Stylus Color 600, el fichero <tt>/etc/printcap</tt> generado por <em/magicfilterconfig/ es (En Debian 2.1 kernel 2.0.36): <tscreen><verb># # 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 # # This file was generated by /usr/sbin/magicfilterconfig. # lp|eps|ESC600:\ :lp=/dev/lp1:sd=/var/spool/lpd/eps:\ :sh:pw#80:pl#72:px#1440:mx#0:\ :if=/etc/magicfilter/stylus_color_360dpi-filter:\ :af=/var/log/lp-acct:lf=/var/log/lp-errs: </verb></tscreen> Una vez instalado, <em/magicfilter/ permite que el sistema reconozca e imprima gráficos (GIF, JPEG, TIFF, BMP...), ficheros PS, PDF, DVI, páginas de manual, ficheros ASCII con acentos y ñ, e incluso cualquier tipo de fichero comprimido con gzip. <sect1>Apsfilter <p> <em/apsfilter/ es otro programa que permite configurar la impresora y escribir un fichero <tt>/etc/printcap</tt> con los filtros adecuados para muchos formatos de fichero (ASCII, DVI, PS, PDF, GIF, TIFF, BMP, BITMAP...) y diversos tipos de compresión (compress, gzip, freeze). <em/apsfilter/ ha sido desarrollado por Andreas Klemm <tt><htmlurl url="mailto:andreas@knobel.gun.de" name="andreas@knobel.gun.de"></tt> y es el paquete incluido en el <em/YaST/ de SuSE para la configuración de la impresora, así como el que recomienda Pat Volkerding en su mensaje de bienvenida a Slackware. Puede obtenerse de <tscreen><verb> http://www.freebsd.org/˜andreas/ </verb></tscreen> El programa <em/apsfilter/ ofrece las siguientes colas de impresión para una computadora local: <itemize> <item><bf/lp/: Cola estándar para todos los formatos de fichero. <item><bf/lp-mono/: Se genera para las impresoras de color cuando ha de imprimirse en blanco y negro. Procesa cualquier formato de fichero. <item><bf/ascii/: Para imprimir ficheros de texto ASCII. <item><bf/raw/: Para imprimir ficheros que ya tienen el formato específico de la impresora y por lo tanto no hay ningún tipo de conversión. </itemize> El fichero <tt>/etc/printcap</tt> correspondiente a mi Epson Stylus Color 600, obtenido con <bf/apsfilter/, es el siguiente (En SuSE 6.2 kernel 2.2.10): <tscreen><verb> ### BEGIN apsfilter: ### stcany.upp a4 color 360 ### # Warning: Configured for apsfilter, do not edit the labels! # apsfilter setup Thu Oct 14 01:30:42 CEST 1999 # ascii|lp1|stcany.upp-a4-ascii-mono-360|stcany.upp a4 ascii mono 360:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/stcany.upp-a4-ascii-mono-360:\ :lf=/var/spool/lpd/stcany.upp-a4-ascii-mono-360/log:\ :af=/var/spool/lpd/stcany.upp-a4-ascii-mono-360/acct:\ :if=/var/lib/apsfilter/bin/stcany.upp-a4-ascii-mono-360:\ :la@:mx#0:\ :tr=:cl:sh: # lp|lp2|stcany.upp-a4-auto-color-360|stcany.upp a4 auto color 360:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/stcany.upp-a4-auto-color-360:\ :lf=/var/spool/lpd/stcany.upp-a4-auto-color-360/log:\ :af=/var/spool/lpd/stcany.upp-a4-auto-color-360/acct:\ :if=/var/lib/apsfilter/bin/stcany.upp-a4-auto-color-360:\ :la@:mx#0:\ :tr=:cl:sh: # lp-mono|lp3|stcany.upp-a4-auto-mono-360|stcany.upp a4 auto mono 360:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/stcany.upp-a4-auto-mono-360:\ :lf=/var/spool/lpd/stcany.upp-a4-auto-mono-360/log:\ :af=/var/spool/lpd/stcany.upp-a4-auto-mono-360/acct:\ :if=/var/lib/apsfilter/bin/stcany.upp-a4-auto-mono-360:\ :la@:mx#0:\ :tr=:cl:sh: # raw|lp4|stcany.upp-a4-raw|stcany.upp a4 raw:\ :lp=/dev/lp0:\ :sd=/var/spool/lpd/stcany.upp-a4-raw:\ :lf=/var/spool/lpd/stcany.upp-a4-raw/log:\ :af=/var/spool/lpd/stcany.upp-a4-raw/acct:\ :if=/var/lib/apsfilter/bin/stcany.upp-a4-raw:\ :la@:mx#0:\ :tr=:cl:sh: # ### END apsfilter: ### stcany.upp a4 color 360 ### </verb></tscreen> Después de instalar el paquete <bf/apsfilter/, la configuración de la impresora se lleva a cabo fácilmente ejecutando el script <em/SETUP/ que encontraremos en el directorio <tt>/var/lib/apsfilter</tt> o <tt>/usr/lib/apsfilter</tt>. <em/SETUP/ nos irá mostrando menús de opciones que seleccionaremos convenientemente, y al final nos escribirá el fichero <tt>/etc/printcap</tt> como arriba aparece. Existe un fichero de configuración de <bf/apsfilter/ llamado <tt>/etc/apsfilterrc</tt> que permite un mayor control del trabajo de los <em/scripts/ de <bf/apsfilter/ en el <em/shell/. Por ejemplo, <bf/apsfilter/ imprime los ficheros ASCII del siguiente modo: <enum> <item>Convierte el fichero ASCII a PS mediante <em/a2ps/ <item>El comportamiento de <em/a2ps/ por defecto es imprimir el contenido de 2 páginas ASCII en una página apaisada </enum> Esto no gusta a muchos usuarios que prefieren una salida «normal». Para cambiar esto editaremos el fichero <tt>/etc/apsfilterrc</tt> y observaremos que la variable <tt/FEATURE/ toma por defecto el valor <tt/2n/ («<em>To print two pages on one sheet without a header</em>»). Debemos comentar (o borrar) esa línea y añadir esta otra: <tscreen><verb> FEATURE=1n </verb></tscreen> como se observa en este fragmento de mi fichero <tscreen><verb> ... ############################################################################## # Description # ----------- # FEATURE=1 tell a2ps to print 1 page on one sheet with header # FEATURE=2 tell a2ps to print 2 pages on one sheet with header # FEATURE=1n tell a2ps to print 1 page on one sheet without header # FEATURE=2n tell a2ps to print 2 pages on one sheet without header # FEATURE=1l tell a2ps to print 1 pages in landscape with header # FEATURE=1ln tell a2ps to print 1 pages in landscape without header # # This is the default I use now(the original default option was FEATURE=2n) FEATURE=1n ... </verb></tscreen> Para suprimir por completo la conversión de ASCII a PS, e imprimir directamente en el modo ASCII de la impresora, se debe quitar el símbolo de comentario (#) al comienzo de la orden <tt>USE_RECODE_NOT_AP2S=yes</tt>, y por supuesto haber instalado el programa <em/recode/. <sect1>Filtros de impresión Red Hat <p> Red Hat cuenta con su propio sistema de configuración de impresora (<bf/printtool/) y su propio sistema de filtros de impresión (<tt>/usr/lib/rhs/rhs-printfilters</tt>), que incluye una herramienta de configuración visual y un administrador gráfico de trabajos de impresión. La configuración de una impresora mediante <em/printtool/ es muy sencilla y puede hacerse sin muchos conocimientos sobre el sistema. El fichero <tt>/etc/printcap</tt> para mi Epson Stylus Color 600 obtenido con <em/printtool/ es (En RedHat 6.0 kernel 2.2.7): <tscreen><verb> # # Please don't edit this file directly unless you know what you are doing! # Be warned that the control-panel printtool requires a very strict format! # Look at the printcap(5) man page for more info. # # This file can be edited with the printtool in the control-panel. ##PRINTTOOL3## LOCAL uniprint NAxNA a4 {} U_EpsonStylusColor stcany 0 lp:\ :sd=/var/spool/lpd/lp:\ :mx#0:\ :sh:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/lp/filter: </verb></tscreen> El filtro de RedHat se parece más al de <bf/magicfilter/ que al de <bf/apsfilter/ porque genera sólo una cola de impresión para una impresora única <tt/lp/. <sect>El controlador uniprint <p> A partir de la versión 5.0 de Ghostscript, ha aparecido un nuevo controlador paramétrico -- the <bf/uniprint/ driver-- desarrollado por Gunther Hess <tt><htmlurl url="mailto:ghess@elmos.de" name="ghess@elmos.de"></tt>, que se adapta a impresoras Canon BJC 610, HP Deskjet 550c, Prinwriter 2X y todas las Epson Stylus Color mediante un fichero de parámetros especificos. Por ejemplo, para la Epson Stylus Color 600 hay tres ficheros: <itemize> <item>stc600ih.upp: Para 1440x720dpi, inkjet paper <item>stc600p.upp: Para 720x720dpi, plain paper <item>stc600pl.upp: Para 360x360dpi, plain paper </itemize> Si no deseamos más que 360x360 dpi de resolución, puede usarse el fichero <tt>stcany.upp</tt> que sirve para cualquier impresora Stylus Color. Este fichero contiene las siguientes líneas: <tscreen><verb> -supModel="Any Epson Stylus Color, 360x360DpI" -sDEVICE=uniprint -dNOPAUSE -dSAFER -dupColorModel=/DeviceCMYKgenerate -dupRendering=/ErrorDiffusion -dupOutputFormat=/EscP2 -r360x360 -dupMargins="{ 9.0 39.96 9.0 9.0}" -dupComponentBits="{1 1 1 1}" -dupBeginPageCommand="< 1b40 1b40 1b2847 0100 01 1b2869 0100 01 1b2855 0100 0A 1b5500 1b2843 0200 0000 1b2863 0400 0000 0000 >" -dupAdjustPageLengthCommand -dupAdjustTopMarginCommand -dupAdjustBottomMarginCommand -dupEndPageCommand="(\033@\014)" -dupAbortCommand="(\033@\15\12\12\12\12 Printout-Aborted\15\014)" </verb></tscreen> y por lo tanto, para realizar impresión de un fichero PS usando la orden <em/gs/, escribiríamos (para la Epson Stylus Color) en un filtro para ficheros PS la línea <tscreen><verb> /usr/bin/gs @stcany.upp -sOutputFile=-- </verb></tscreen> en lugar de <tscreen><verb> /usr/bin/gs -sDEVICE=stcolor -r360 -q -dSAFER - dNOPAUSE -sOutputFile=- - </verb></tscreen> obteniendo el mismo resultado. <sect>Impresión remota <p> En la impresión remota, los filtros se emplean de manera diferente según se trate de imprimir en una máquina remota <bf/unix/ o <bf/windows/. En el primer caso, el administrador de la máquina remota debe incluir la nuestra en su <tt>/etc/hosts.equiv</tt> o, mejor, en <tt>/etc/hosts.lpd</tt>, o permitirle la impresión solamente a ciertos usuarios empleando el atributo <tt/rs/ (ver la página <bf/man/ de <em/lpd/). Para imprimir en la máquina remota, añadiremos una nueva entrada a nuestro <tt>/etc/printcap</tt>. Supongamos que la impresora de la máquina remota (<tt>hercules.us.es</tt>) es una Epson EPL 5700 y la cola de impresión por defecto (<tt/lp/) es la que queremos usar. La entrada sería: <tscreen><verb>#Remote unix printer epl5700|Remote unix printer :sd=/var/spool/lpd/epl5700:\ :rm=hercules.us.es:\ #nombre de la máquina remota (rm: remote machine) :rp=lp:\ #nombre de la cola de impresión en la máquina remota (rp: remote printer) :mx#0:\ :lp=/dev/null:\ :sh:\ </verb></tscreen> Es necesario tener un directorio <tt/spool/ en la máquina local, porque si la remota está ocupada o desconectada, el trabajo a imprimir esperará en dicho directorio hasta que sea enviado. Cuando se trata de imprimir en una máquina remota Windows, debemos usar el paquete <bf/SaMBa/. Es posible establecer una cola de impresión mediante el programa <em/smbclient/ (parte de samba) por el protocolo <tt>TCP/IP</tt> mediante el servicio de impresión <tt/SMB/. Samba incluye un guión para realizar esto, llamado <em/smbprint/. En pocas palabras, se añade una entrada nueva al <tt>/etc/printcap</tt> de la máquina local para la impresora remota incluyendo en la entrada <tt/if/ el script <em/smbprint/. Si la impresora remota es, por ejemplo, una HP Laserjet, podríamos poner: <tscreen><verb> #Remote samba printer HPlaserjet|Remote samba printer :sd=/var/spool/lpd/HPlaserjet:\ :mx#0:\ :lp=/dev/null:\ :if=/usr/local/sbin/smbprint #Ruta del guión smbprint :sh:\ </verb></tscreen> Para mayor información acerca de la impresión remota, consultar el <em>Cómo</em> correspondiente a la configuración de impresión. <sect>Créditos <p> David Espada García <tt><htmlurl url="mailto:bombadil@santandersupernet.com" name="bombadil@santandersupernet.com"></tt> escribió un interesante artículo «<bf/Configuración de la impresora/» en el nº4 de la revista Sólo Programadores LINUX. También me han sido muy útiles el «<bf/Ghostscript User Manual/» de Thomas Merz <tt><htmlurl url="mailto:tm@muc.de" name="tm@muc.de"></tt>, el «<bf/Linux Printing Howto/» de Grant Taylor <tt><htmlurl url="mailto:gtaylor+pht@picante.com" name="gtaylor+pht@picante.com"></tt> y el Manual de SuSE Linux 6.2, capítulo 12. <sect>Anexo: El INSFLUG <label id="Insflug"> <p> El <it/INSFLUG/ forma parte del grupo internacional <it>Linux Documentation Project</it>, encargándose de las traducciones al castellano de los Howtos, así como de la producción de documentos originales en aquellos casos en los que no existe análogo en inglés, centrándose, preferentemente, en documentos breves, como los <em/COMOs/ y <em/PUFs/ (<bf/P/reguntas de <bf/U/so <bf/F/recuente, las <it/FAQs/. <tt/:)/ ), etc. Diríjase a la sede del Insflug para más información al respecto. En ella encontrará siempre las <bf/últimas/ versiones de las traducciones «oficiales»: <tt><htmlurl url="http://www.insflug.org" name="www.insflug.org"></tt>. Asegúrese de comprobar cuál es la última versión disponible en el Insflug antes de bajar un documento de un servidor réplica. Además, cuenta con un sistema interactivo de gestión de fe de erratas y sugerencias en línea, motor de búsqueda específico, y más servicios en los que estamos trabajando incesantemente. Se proporciona también una lista de los servidores réplica (<it/mirror/) del Insflug más cercanos a Vd., e información relativa a otros recursos en castellano. En <tt><htmlurl url="http://www.insflug.org/insflug/creditos.php3" name="http://www.insflug.org/insflug/creditos.php3"></tt> cuenta con una detallada relación de las personas que hacen posible tanto esto como las traducciones. ¡Diríjase a <tt><htmlurl url="http://www.insflug.org/colaboracion/index.php3" name="http://www.insflug.org/colaboracion/index.php3"></tt> si desea unirse a nosotros!. «Cartel» Insflug, <tt><htmlurl url="mailto:cartel@insflug.org" name="cartel@insflug.org"></tt>. </article>