2010-05-17 13 views
6

Diciamo che ho una collezione di file PDF con i seguenti percorsi:scorrendo una directory 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 

Quello che mi piacerebbe fare è generare miniature per ogni PDF che rispettano la struttura percorso relativo, e uscita in un'altra posizione, ovvero:

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

Mi piacerebbe che fosse fatto in Ant. Presumo che ho intenzione di usare Ghostscript sulla riga di comando e ho già lavorato fuori la chiamata a 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> 

Quindi quello che devi fare è capire i valori corretti per ${thumbnail.image.path} e ${input.pdf.path} durante l'attraversamento del Directory di input PDF.

Ho accesso a ant-contrib (appena installato il "più recente", che è 1.0b3) e sto usando Ant 1.8.0. Penso di riuscire a far funzionare qualcosa usando l'attività <for>, <fileset> s e <mapper> s, ma ho difficoltà a mettere tutto insieme.

ho provato qualcosa di simile:

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

Ma purtroppo la proprietà @{file} è un percorso assoluto, e non riesco a trovare un modo semplice di decomposizione nei relativi componenti.

Se posso farlo solo utilizzando un'attività personalizzata, credo di poterne scrivere uno, ma spero di poter collegare solo i componenti esistenti.

risposta

6

Nell'attività sequenziale potrebbe essere possibile utilizzare l'attività ant-contrib propertyregex per associare i percorsi di input all'output. Per esempio:

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

Quali mappe, ad esempio /some/path/pdfs/birds/duck.pdf-/another/path/birds/duck.png.

+0

Sembra molto interessante. Puoi espandere il tuo codice solo un po 'per mostrare come lo userò? Io lo uso in congiunzione con l'attività e, in caso affermativo, va nello ? –

2

Per motivi di completezza, ecco cosa mi è venuto in mente per un obiettivo basato sulla risposta di Martin Clayton. Funziona solo su Windows per ora, ma è perché non ho ancora installato Ghostscript in modo non proxy su Mac OS X. Si noti che per essere una soluzione multipiattaforma ho dovuto "scrub" i separatori di file per essere coerentemente solo in avanti.

<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

potresti spiegare cosa fa l'ultimo 2 'propertyregex', non ottieni davvero la sostituzione? Forse alcuni esempi di input e output previsti aiuteranno – jm2

+0

La tua regex di proprietà mi ha salvato la vita qui ... anche se vorrei sottolineare che la proprietà "override" accetta "true" o "false". Saluti – Aakash