2010-05-17 26 views
6

Digamos que tengo una colección de archivos PDF con las siguientes rutas:iteración a través de un directorio con Ant

/some/path/pdfs/birds/duck.pdf 
/some/path/pdfs/birds/goose.pdf 
/some/path/pdfs/insects/fly.pdf 
/some/path/pdfs/insects/mosquito.pdf 

Lo que me gustaría hacer es generar imágenes en miniatura para cada PDF que respeta la estructura ruta relativa, y salida a otra ubicación, es decir:

/another/path/thumbnails/birds/duck.png 
/another/path/thumbnails/birds/goose.png 
/another/path/thumbnails/insects/fly.png 
/another/path/thumbnails/insects/mosquito.png 

Me gustaría que esto se haga en Ant. Supongo que voy a utilizar Ghostscript en la línea de comandos y ya he trabajado a cabo la llamada a la GS:

<exec executable="${ghostscript.executable.name}"> 
     <arg value="-q"/> 
     <arg value="-r72"/> 
     <arg value="-sDEVICE=png16m"/> 
     <arg value="-sOutputFile=${thumbnail.image.path}"/> 
     <arg value="${input.pdf.path}"/> 
    </exec> 

Así que lo que tengo que hacer es trabajar en los valores correctos para ${thumbnail.image.path} y ${input.pdf.path} al atravesar la Directorio de entrada PDF

Tengo acceso a ant-contrib (acaba de instalar el "último", que es 1.0b3) y estoy usando Ant 1.8.0. Creo que puedo hacer que algo funcione usando la tarea <for>, <fileset> sy <mapper> s, pero estoy teniendo problemas para poner todo junto.

he intentado algo así como:

<for param="file"> 
     <path> 
      <fileset dir="${some.dir.path}/pdfs"> 
       <include name="**/*.pdf"/> 
      </fileset> 
     </path> 
     <sequential> 
      <echo message="@{file}"/> 
     </sequential> 
    </for> 

Pero, por desgracia la propiedad @{file} es una ruta absoluta, y no puedo encontrar ninguna manera sencilla de descomponer en los componentes relativos.

Si solo puedo hacer esto usando una tarea personalizada, supongo que podría escribir una, pero espero poder simplemente conectar los componentes existentes.

Respuesta

6

En la tarea secuencial, es posible que pueda utilizar la tarea ant-contrib propertyregex para asignar las rutas de entrada a la salida. Por ejemplo:

<propertyregex override="yes" property="outfile" input="@{file}" 
       regexp="/some/path/pdfs/(.*).pdf" 
       replace="/another/path/\1.png" /> 

que los mapas, por ejemplo /some/path/pdfs/birds/duck.pdf-/another/path/birds/duck.png.

+0

Eso se ve muy interesante. ¿Puedes expandir tu código solo un poco para mostrar cómo usaría eso? es decir, ¿lo uso junto con la tarea y, de ser así, aparece en el ? –

2

Para completar, esto es lo que se me ocurrió para un objetivo basado en la respuesta de Martin Clayton. Solo funciona en Windows por ahora, pero eso se debe a que todavía no he conseguido instalar Ghostscript de forma no proxy en Mac OS X. Tenga en cuenta que, para ser una solución multiplataforma, tuve que "restregar" los separadores de archivos para ser constantemente hacia adelante-barra inclinada solamente.

<target name="make-thumbnails" depends=""> 
    <taskdef resource="net/sf/antcontrib/antlib.xml"> 
     <classpath> 
      <pathelement location="/path/to/ant-contrib-1.0b3.jar"/> 
     </classpath> 
    </taskdef> 

    <condition property="ghostscript.executable.name" value="/path/to/gswin32c.exe"> 
     <os family="windows"/> 
    </condition> 
    <condition property="ghostscript.executable.name" value=""> 
     <os family="mac"/> 
    </condition> 

    <for param="file"> 
     <path> 
      <fileset dir="/path/to/pdfs"> 
       <include name="**/*.pdf"/> 
      </fileset> 
     </path> 
     <sequential> 
      <propertyregex override="yes" property="file-scrubbed" input="@{file}" 
           regexp="\\" 
           replace="/" /> 
      <propertyregex override="yes" property="output-path-directory-fragment" input="${file-scrubbed}" 
           regexp=".*/pdfs/(.*)/.+\.pdf" 
           replace="\1" /> 
      <propertyregex override="yes" property="output-path-file-fragment" input="${file-scrubbed}" 
           regexp=".*/pdfs.*/(.+)\.pdf" 
           replace="\1.png" /> 
      <mkdir dir="${thumbnails.base.dir}/${output-path-directory-fragment}"/> 
      <exec executable="${ghostscript.executable.name}"> 
       <arg value="-q"/> 
       <arg value="-dLastPage=1"/> 
       <arg value="-dNOPAUSE"/> 
       <arg value="-dBATCH"/> 
       <arg value="-dSAFER"/> 
       <arg value="-r72"/> 
       <arg value="-sDEVICE=png16m"/> 
       <arg value="-sOutputFile=${thumbnails.base.dir}/${output-path-directory-fragment}/${output-path-file-fragment}"/> 
       <arg value="${file-scrubbed}"/> 
      </exec> 
     </sequential> 
    </for> 
</target> 
+0

podría explicar qué hace el último 2 'propertyregex', realmente no obtener el reemplazo? Tal vez algún ejemplo de entrada y salida esperada ayude – jm2

+0

Su propiedad regex me salvó la vida aquí ... aunque me gustaría señalar que la propiedad "anular" acepta "verdadero" o "falso". Aclamaciones – Aakash

Cuestiones relacionadas