Pergunta

Digamos que eu tenho uma coleção de arquivos PDF com os seguintes caminhos:

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

O que eu gostaria de fazer é gerar miniaturas para cada PDF que respeite a estrutura do caminho relativo e a saída para outro local, ou seja::

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

Eu gostaria que fosse feito em Ant. Suponha que vou usar o GhostScript na linha de comando e já trabalhei a chamada para 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>

Então, o que eu preciso fazer é resolver os valores corretos para ${thumbnail.image.path} e ${input.pdf.path} Ao atravessar o diretório de entrada em PDF.

Tenho acesso ao Contrrib de formiga (acabei de instalar o "mais recente", que é 1,0b3) e estou usando a ANT 1.8.0. Eu acho que posso fazer algo funcionar usando o <for> tarefa, <fileset>areia <mapper>S, mas estou tendo problemas para reunir tudo.

Eu tentei algo como:

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

Mas infelizmente o @{file} A propriedade é um caminho absoluto, e não consigo encontrar nenhuma maneira simples de decompor -a nos componentes relativos.

Se eu puder fazer isso apenas usando uma tarefa personalizada, acho que poderia escrever uma, mas espero poder conectar os componentes existentes.

Foi útil?

Solução

Na tarefa seqüencial, você poderá usar o Propriedade do contributo de formiga tarefa para mapear os caminhos de entrada para a saída. Por exemplo:

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

Quais mapas, por exemplo /some/path/pdfs/birds/duck.pdf para /another/path/birds/duck.png.

Outras dicas

Por uma questão de completude, eis o que eu criei para um alvo baseado na resposta de Martin Clayton. Ele só funciona no Windows por enquanto, mas é porque eu ainda não consegui instalar o GhostScript de uma maneira não proxi. Seja consistentemente slash para a frente apenas.

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top