Pregunta

Vamos a decir que tiene una colección de archivos PDF con las siguientes rutas:

/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 la salida a otro lugar, 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 hormiga. 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 los valores correctos para ${thumbnail.image.path} y ${input.pdf.path} al atravesar el 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 utilizando los <for> de tareas, <fileset>s y <mapper>s, pero estoy teniendo problemas para poner todo junto.

He intentado algo 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 sólo puedo hacer esto utilizando una tarea personalizada, supongo que podría escribir uno, pero estoy esperando que sólo puede conectar juntos los componentes existentes.

¿Fue útil?

Solución

En la tarea secuencial que podía puede ser capaz de utilizar el propertyregex ant-contrib tarea de asignar las rutas de entrada a salida. Por ejemplo:

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

¿Qué mapas, por ejemplo /some/path/pdfs/birds/duck.pdf a /another/path/birds/duck.png.

Otros consejos

En aras de la exhaustividad, esto es lo que se me ocurrió para un destino en función de la respuesta de Martin Clayton. Sólo funciona en Windows por ahora, pero eso es porque no he tenido tiempo de instalar Ghostscript de una manera no-proxy todavía en Mac OS X. Nota que para ser una solución multiplataforma que tenía que "depurar" los separadores de archivos para ser consistentemente barra diagonal 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top