|| Computación || VOLVER=^
 
==============================================================================================
Manipulación de archivos EPS y PDF bajo Linux
(algunos tips) [Jul 2013]
==============================================================================================

* Introducción

A estas alturas no me sorprende encontrar bajo Linux software para las más diversas tareas que funciona de un modo maravilloso y además de ello es libre y gratuito. Incluso más, no tengo tiempo disponible para probar una gran cantidad de programas, utilidades y entornos que están a solamente a un enter de yum de distancia. Aquí solamente describiré algunos tips asociados al trabajo con archivos PostScript y PDF bajo Linux.

En estos momentos de mi vida he tenido una gran necesidad de religión; entonces salgo y genero gráficos vectoriales. Los gráficos tienen que guardarse en algún tipo de archivo para su posterior uso en otro documento, envío por correo, etc. Uno de los estandards en esta categoría es el lenguaje PostScript que devino con los años en el lenguaje y formato Portable Document Format, más conocido como PDF. Tomaría una gran cantidad de espacio y de tiempo hacer un buen resumen de la historia de estos lenguajes/formatos, y me hallo escaso sobre todo del segundo. Hace ya década y media larga conocí los archivos EPS (Encapsulated PostScript) y PS (PostScript) razón por la cual experimenté Ghostscript y un visualizador para entornos gráficos llamado Aladdin Ghostview (que ya no se consigue libremente).

Ghostscript, técnicamente hablando, es un intérprete del lenguaje PostScript y la interfaz con el usuario es mediante órdenes en línea de comandos. Los archivos en formato PostScript (como los mencionados EPS y PS) almacenan la ilustración o texto que contienen a través de instrucciones en dicho lenguaje; el intérprete entonces interpreta esas instrucciones y genera la ilustración o texto a partir de esas directivas. La ilustración se guarda en forma vectorial de manera que es independiente de la resolución del dispositivo utilizado para visualizarla.

En su momento para mi una línea de comandos era desafiante, porque estaba más acostumbrado al eye candy de clickear aquí y allá en ventanas, que a la férrea disciplina de tipear en un prompt. Ya no. No es justo del todo comparar entonces Adobe Acrobat con Ghostscript, porque abordan la manipulación de archivos PDF y PS, respectivamente, de diferente modo. Si bien el fuerte de Acrobat es PDF tenía en su época capacidades para convertir PS a PDF a través del componente Distiller. Desconozco en qué estado se encuentra ese soporte hoy en día en las últimas versiones de Adobe pero tampoco me muero de ganas por averiguarlo. Ghostscript tiene capacidades también de trabajar con PDF. Acrobat tiene soluciones muy rápidas para ciertas tareas comunes, como por ejemplo cropear archivos PDF, que en Ghostscript requiere ciertos conocimientos de formatos y varias horas de vuelo en la página man de gs.

Pero hay una diferencia fundamental que inclina la balanza, a mi modo de ver, en favor de Ghostscript y es el hecho de que es programable, porque es un intérprete del lenguaje. Eso le confiere el poder para realizar tareas que nunca serán posibles en una interfaz gráfica como la de Acrobat a menos de que el programador (el equipo programador, digamos mejor) las implemente de manera específica.

En lo que sigue de este artículo presentaré un breve tutorial de Ghostscript y algunos tipos referidos a soluciones puntuales que me han surgido en el curso de mi trabajo habitual. Estas soluciones refieren a necesidades que tienen que ver con incorporar gráficos vectoriales en documentos LaTeX, resolviendo temas como el de la bounding box.

No busca esta página ser una exposición exacta de estos temas sino más bien un recordatorio de sintaxis útil.

______________________________________________________________________________________________
* Breve tutorial de Ghostscript


Como primeras líneas transcribamos un poco lo que dice el sitio oficial. Ghostscript es un intérprete, multiplataforma, de archivos PostScript y Portable Document Format, siendo ambos lenguajes de programación utilizados para descripción de página. Existen varias distribuciones de Ghostscript (por ejemplo GPL (antes GNU), AFPL (antes Aladdin), Artifex). Ghostscript puede ver e imprimir los formatos PostScript y PDF y convertirlos en imágenes rasterizadas, entre otras tareas. Asociado al intérprete se halla un visor gráfico, cuya versión original se llamaba Ghostview, y hay variantes: GV, MGv, GSview.

---------------------------------------------------------------------------------------------------------------------------------------------

ghostscript logo  GSview logo

^ Figura 1 . Logos de Ghostscript y GSview (visualizador gráfico).

---------------------------------------------------------------------------------------------------------------------------------------------

En lo que sigue a continuación supondremos hallarnos bajo entorno Linux. Allí el nombre del ejecutable que activa el intérprete es gs, en la versión
de Windows es gswin32. Si tipeamos directamente gs en la terminal debería aparecernos un anuncio como el siguiente y dejarnos un prompt más una ventana gráfica en blanco.

# gs
GPL Ghostscript 9.06 (2012-08-08)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>

Hemos entrado en el modo interactivo y Ghostscript se encuentra esperando que le demos órdenes. Si introducimos help en el prompt obtendremos información mínima para visualizar un archivo, que aparecerá en esa ventana gráfica, y salir del intérprete (con 'quit').

En general estaremos interesados en operar directamente sobre archivos y esto es más fácil invocando gs con opciones, una de las cuales tendrá por efecto desactivar el modo interactivo. Para visualizar un archivo de nombre 'archivo.pdf ' (o ps) invocaremos:

# gs -dSAFER -dBATCH archivo.pdf

siendo las opciones necesarias para deshabilitar el modo interactivo y permitir el procesado por página en documentos multi-página (la tecla enter pasa a la siguiente). Para visualizar sin pausa un documento:

# gs -dSAFER -dBATCH -dNOPAUSE archivo.ps

Veremos que la opción de NOPAUSE es útil cuando hagamos un proceso desatendido sobre un documento. La desactivación del modo interactivo implica que gs correrá como un programa; se ejecuta, hace alguna cosa (como por ejemplo salvar o modificar un archivo) y se cierra liberando la terminal asociada. Esto lo convierte en una utilidad susceptible de operar dentro de un script de bash o similar, lo cual abre toda la gama de posibilidades que nos da la programación del shell en Linux.

Para convertir un archivo de formato se requiere establecer el archivo destino, lo que se hace con -sOutputFile y el dispositivo de salida, que se asigna con -sDEVICE. Para ver los dispositivos de salida disponibles en el sistema podemos ejecutar gs -h. orden que también informa de algunos parámetros usuales de invocación. Para convertir un archivo "entrada.ps" en "salida.pdf" seleccionamos el dispositivo apropiado (conversor a PDF)

# gs -dSAFER -dBATCH -dNOPAUSE -sOutputFile=salida.pdf -sDEVICE=pdfwrite entrada.ps

Podríamos, quizás, querer convertir un archivo PDF de varias páginas en imágenes tipo PNG, por ejemplo. Lo haremos con el dispositivo adecuado

# gs -dSAFER -dBATCH -dNOPAUSE -sOutputFile=salida-%d.png -sDEVICE=png16m -r300 entrada.pdf

Aquí debemos notar la introducción del párametro -r300 que asigna una resolución de 300 dpi, y el caracter %d dentro del nombre de archivo. Con ello gs reemplazara %d por un número consecutivo a medida que avanza una página. La sintaxis de las conversiones numéricas es similar a la del lenguaje C. Vemos ya que la cantidad de parámetros incluídos hacen que pueda ser más de una línea una dada invocación. La opción -o abrevia tres opciones:

-o archivo.xyz

es equivalente a:

-sOutputFile=archivo.xyz -dBATCH -dNOPAUSE

Así, la última conversión sería:

# gs -dSAFER -o salida-%d.png -sDEVICE=png16m -r300 entrada.pdf

Paralelamente a la necesidad de separar puede darse la de unir. Se pueden consolidar varios archivos de entrada en una sola salida del siguiente modo, por ejemplo para entrada y salida en formato PDF.

# gs -sDEVICE=pdfwrite -o salida.pdf entrada1.pdf entrada2.pdf entrada3.pdf

Notemos en este caso que el switch -o afecta solamente a 'salida.pdf ' y que todo lo que aparezca detrás serán archivos de entrada. Exclusivamente para formato PDF tenemos también los parámetros

-dFirstPage=pagenumber
-dLastPage=pagenumber

que permiten establecer desde qué página comienza la interpretación. Los siguientes

-dUseTrimBox
-dUseCropBox

permiten configurar el tamaño de página al tamaño de dichas boxes, respectivamente, en lugar de utilizar el MediaBox del pdf.

La conversión a PDF en general es bastante compleja e incluye multitud de opciones. Una alternativa simplificatoria y de compatibilidad mimificante con los estandards de Adobe, es la de:

-dPDFSETTINGS=configuracion

donde debemos reemplazar 'configuracion' con una de estas opciones que proveen salidas de calidad creciente (salvo la última).

/screen
/ebook
/printer
/prepress
/default

'/screen' es una salida de baja resolución similar al seteo de "Screen Optimized" de Acrobat Distiller, '/ebook' es una calidad intermedia, mientras que '/printer' y '/prepress' proveen calidades superiores. La opción '/default' da un balance entre tamaño de archivo, calidad y versatilidad de usos.

Dado lo común de ciertas tareas (conversiones sobre todo) han sido desarrollados utilitarios que no son otra cosa que invocaciones de Ghostscript con parámetros fijos orientados a una tarea, o grupo de tareas, particular. Entre ellos mencionaremos:

ps2pdf
ps2epsi

Finalmente digamos que también podemos tomar desde la entrada estandard para interpretar en ghostscript a través del switch '-', como se muestra en la línea siguiente:

# cat archivo.ps | gs -dSAFER -dBATCH -

la cual hará que se interprete 'archivo.ps'.

Mayores detalles pueden encontrarse en la extensa documentación que viene con ghostscript en formato html o en la página de manual, accesible con

# man gs


______________________________________________________________________________________________
* Redefinición de bounding box y corte de archivos EPS con Ghostscript


Cuando producimos gráficos vectoriales para insertar en archivos LaTeX, como por ejemplo diagramas o ilustraciones, se da el caso de que no suelen tener bordes rectos como sucede en fotografías que son, comúnmente, rectangulares. Los archivos EPS generados tienen una propiedad que se denomina bounding box y que define las coordenadas de la "caja" dentro de la cual aparecerá la figura.

Dependiendo de las opciones disponibles en el software que estemos utilizando para generar el gráfico, en el mejor de los casos la bounding box tendrá el tamaño mínimo necesario para abarcar toda la ilustración (la caja de área mínima tal que queda inscripto el dibujo con la orientación original --no se rota--). Pero puede pasar que no dispongamos de opciones para ajustar la bounding box o que se haga mal (dejando espacio blanco inútil).

En la Figura 2, izquierda, vemos un gráfico producido en LibreOffice Draw 3 y exportado a EPS con opciones por defecto. Si bien este programa no cuenta con configuración específica para controlar la bounding box esto podría hacerse configurando el papel de modo personalizado y escalando nuestro dibujo al mismo, lo cual es medianamente un incordio. El software GSview tiene un comando para visualizar la bb de un archivo EPS.
---------------------------------------------------------------------------------------------------------------------------------------------

    

^ Figura 2 . Gráfico vectorial visualizado en GSview. La bounding box es justamente el borde de imagen que se ve con línea de puntos. A la izquierda vemos el gráfico original: la bounding box tiene el tamaño de la página por defecto que es A4. A la derecha se ve el procesamiento de ps2eps con el bounding box correcto.

---------------------------------------------------------------------------------------------------------------------------------------------

Cuando insertamos en LaTeX dicho archivo se procesará el gráfico como si su tamaño útil fuese el de la bounding box y no el del gráfico (¡por supuesto! LaTeX no tiene modo de saber que hay espacio innecesario dentro). LaTeX cuenta con comandos para cortar la zona sin gráfico, pero parece más sano contar con archivos EPS o PDF cuyo tamaño de bounding box esté calculado de manera óptima.

Entonces debieramos calcular la bounding box nuevamente. Esto lo podemos hacer utilizando una de las macros de Ghostscript, ps2eps, que puede recrear la bounding box con la sintaxis:

# ps2eps -B -f entrada.eps

donde la -B hace que ignore la bounding box que ya trae el archivo y la -f  fuerza a sobreescribir entrada.eps con una nueva bounding box que (con un poco de suerte) es la correcta. Sin el switch -f intentará generar entrada.eps.eps, es decir que le suma la extensión "eps" al nombre de entrada si es que no existe ya. En la Figura 2, derecha, vemos el eps ya corregido.

No obstante, dado lo común que es hoy en día utilizar PdfLaTeX, puede ser necesario querer tener esta figura en formato vectorial y en PDF con este tamaño. Para ello podemos utilizar otra de las macros de Ghostscript, ps2pdf para convertir a pdf respetando la bounding box. La sintaxis será:

# ps2pdf -dEPSCrop entrada.eps salida.pdf

que exportará como 'salida.pdf 'el archivo 'entrada.eps' cortando por la bounding box.

Esta pequeña y pueril receta no agota las posibilidades ni los posibles problemas que podríamos llegar a tener con el formato EPS. La página de man de ps2eps tiene bastante información al respecto, y también habría que investigar sobre las diversas opciones del lenguaje PostScript y la compatibilidad de la generación que realiza el programa que utilicemos para hacer los gráficos. Eso solo ya representa un pequeño universo.

==============================================================================================