Scorrendo una directory con Ant
Domanda
dire Let Ho una collezione di file PDF con i seguenti percorsi:
/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 le miniature per ogni PDF che rispettano la struttura percorso relativo, e l'uscita in un'altra posizione, cioè:.
/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 questo sia 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 dobbiamo fare è lavoro fuori i valori corretti per ${thumbnail.image.path}
e ${input.pdf.path}
mentre attraversa la directory di input PDF.
Ho accesso a ant-contrib (appena installato il "ultimo", che è 1.0b3) e sto usando Ant 1.8.0. Penso di poter fare qualcosa di lavoro utilizzando i <for>
compito, <fileset>
s e <mapper>
s, ma sto avendo 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 alcun modo semplice di decomposizione nei relativi componenti.
Se posso farlo solo con un'attività personalizzata, Credo che avrei potuto scrivere uno, ma spero che posso basta collegare insieme i componenti esistenti.
Soluzione
Nel compito sequenziale si potrebbe essere in grado di utilizzare la ant-contrib propertyregex compito per mappare i percorsi all'uscita. Ad 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
a /another/path/birds/duck.png
.
Altri suggerimenti
Per ragioni di completezza, ecco cosa mi è venuta per un target in base alla risposta del martin Clayton. Funziona solo su Windows, per ora, ma questo è perché non ho ancora trovato il tempo per l'installazione di Ghostscript in modo non-proxy su Mac OS X. Si noti che per essere una soluzione cross-platform che dovevo "scrub" i separatori di file da essere costantemente in avanti-slash solo.
<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>