Question

Le mot Let j'ai une collection de fichiers PDF avec les chemins suivants:

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

Ce que je voudrais faire est de générer des vignettes pour chaque PDF qui respectent la structure de chemin relatif, et la sortie vers un autre emplacement, i.e.:.

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

Je voudrais que cela soit fait dans Ant. Supposons que je vais utiliser Ghostscript sur la ligne de commande et je l'ai déjà travaillé sur l'appel à 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>

Alors, ce que je dois faire est de travailler sur les valeurs correctes pour ${thumbnail.image.path} et ${input.pdf.path} en traversant le répertoire d'entrée PDF.

J'ai accès à ant-contrib (juste installé le « dernier », ce qui est 1.0b3) et j'utilise Ant 1.8.0. Je pense que je peux faire fonctionner quelque chose en utilisant la tâche <for>, <fileset>s et <mapper>s, mais je ne parviens pas à mettre tous ensemble.

J'ai essayé quelque chose comme:

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

Mais, malheureusement, la propriété @{file} est un chemin absolu, et je ne trouve aucun moyen simple de se décomposer dans les composants relatifs.

Si je ne peux le faire en utilisant une tâche personnalisée, je suppose que je pourrais écrire un, mais j'espère que je peux brancher ensemble les composants existants.

Était-ce utile?

La solution

Dans la tâche séquentielle vous pourriez peut-être en mesure d'utiliser le ant-contrib propertyregex tâche pour cartographier les voies d'entrée vers la sortie. Par exemple:

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

Quelles cartes, par exemple /some/path/pdfs/birds/duck.pdf à /another/path/birds/duck.png.

Autres conseils

Par souci d'exhaustivité, voici ce que je suis venu avec une cible basée sur la réponse de martin clayton. Il ne fonctionne que sur Windows pour l'instant, mais c'est parce que je ne l'ai pas eu l'occasion d'installer Ghostscript d'une manière non-proxy encore sous Mac OS X. Notez que pour une solution multi-plateforme que je devais « scrub » les séparateurs de fichiers être toujours en avant-slash uniquement.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top