Como criar recursivamente PDF thumnbails na linha de comando do Linux

2

Eu posso usar o ImageMagick para criar uma miniatura da primeira página de um PDF usando:

convert -thumbnail x80 95.pdf[0] thumb_95.png

Isso funciona bem e gera um arquivo thumb_95.png .

Eu tentei várias permutações de "find" usando xargs, mas não consigo criar um combo que crie as miniaturas nas pastas junto com os PDFs de origem.

Os PDFs estão em pastas nomeadas com UUIDs, por exemplo:

/511017a7-67fc-4897-80c1-0d42ac100b68/415.pdf
/511015bc-e0a8-4ab7-ba29-0ce9ac100b68/122.pdf

Meu resultado exigido seria:

/511017a7-67fc-4897-80c1-0d42ac100b68/415.pdf
/511017a7-67fc-4897-80c1-0d42ac100b68/thumb_415.png
/511015bc-e0a8-4ab7-ba29-0ce9ac100b68/122.pdf
/511015bc-e0a8-4ab7-ba29-0ce9ac100b68/thumb_122.png

Qualquer ajuda sobre as melhores maneiras de fazer com que essa conversão aconteça para todos * .pdf de forma recursiva seria muito apreciada!

    
por fibble 05.02.2013 / 14:22

3 respostas

0

Tente isto:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {})' \;

Eu tive que modificá-lo levemente para:

find /source/directory -name "*.pdf" -exec \ sh -c 'convert -thumbnail x80 {} $(dirname {})/thumb_$(basename {} .pdf)'.png \;

Para ter o nome da base, limpe a extensão de arquivo e, em seguida, anexe .png.

Obrigado a todas as respostas. Este trabalhou bem para mim!

    
por 05.02.2013 / 14:57
1

A parte complicada é não ter um nome de arquivo no formato testfile.pdf.png como a saída. Anos atrás tive o mesmo problema e resolvi com este script auxiliar (adaptado um pouco):

#!/bin/bash 
SRCFRM=pdf
TGTFRM=png
FILE=$1

NEWFILE=$(echo $FILE | sed "s:$SRCFRM\$:$TGTFRM:")
convert -thumbnail x80 $FILE[0] $NEWFILE

Armazene em algum lugar, por exemplo no seu diretório inicial, use-o assim:

find /path -name '*.pdf' -exec /path/to/converthelper.sh {} \;
    
por 05.02.2013 / 15:10
1

Você quer

  • Recorra a todos os PDFs:

    1. Ativar globstar, com shopt -s globstar .
    2. Use-o para gerar uma lista de todos os arquivos *.pdf no diretório atual: **/*.pdf
    3. Crie um loop que repita os arquivos:

      for filename in **/*.pdf
      do
          something
      done
      
  • Agora, você quer fazer algo nos arquivos: algo é convert -thumbnail x80 95.pdf[0] thumb_95.png . Existem várias maneiras: eu geralmente uso basename , nesse caso você precisaria de $(dirname $filename)/$(basename $filename .pdf).png , mas outra abordagem interessante (e mais simples) é usar ferramentas de manipulação de strings do bash :

    1. Remova .pdf do final do nome do arquivo: ${filename%.pdf}
    2. Adicione .png : ${filename%.pdf}.png

Finalmente, podemos colar tudo junto (não esqueça que isso requer globstar, shopt -s globstar ):

for filename in **/*.pdf
do
    convert -thumbnail x80 $filename[0] ${filename%.pdf}.png
done
    
por 05.02.2013 / 15:40