Converta todos os pdf no diretório atual para png

16

Eu quero escrever um bashscript para converter todos os .pdfarquivos no diretório atual em um .pngarquivo. Por exemplo:

$ls .
a.pdf b.pdf
$./pdf2png.sh
Converting pdfs to pngs
a.pdf -> a.png
b.pdf -> b.png

Esta é minha melhor tentativa:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Eu gosto de codificar
fonte

Respostas:

17

Se você tiver nomes realmente estranhos, que contenham novas linhas ou barras invertidas e similares, você pode fazer algo assim:

find . -type f -name '*.pdf' -print0 |
  while IFS= read -r -d '' file
    do convert -verbose -density 500 -resize 800 "${file}" "${file%.*}.png"
  done

Isso deve ser capaz de lidar com praticamente qualquer coisa que você jogue.

Truques usados:

  • find ... -print0: faz findcom que os resultados sejam impressos separados pelo caractere nulo, vamos lidar com novas linhas.
  • IFS= : isso desativará a divisão de palavras, necessária para lidar com o espaço em branco.
  • read -r: desativa a interpretação de caracteres de escape de barra invertida, para lidar com arquivos que contêm barras invertidas.
  • read -d '': define o delimitador de registro para o caractere nulo, para lidar com a saída da localização e tratar corretamente os nomes de arquivo com caracteres de nova linha.
  • ${file%.*}.png: usa as habilidades de manipulação de string incorporadas do shell para remover a extensão.
terdon
fonte
Ambas as respostas são boas, mas eu aceitei essa, porque ela vem com uma explicação dos truques usados.
Gosto de codificar
Ou faça-o de forma portável (POSIX) e ainda manipule qualquer caractere especial: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Consulte unix.stackexchange.com/a/321753/135943 para obter explicações e antecedentes.
Curinga
11
@Wildcard é a única coisa que não é posix aqui é o find -printf, então tudo que você precisa para portabilidade é substituí-lo por `-exec printf '% s \ 0' {} +`.
terdon
14

Você pode usar o forloop bash da seguinte maneira:

#!/bin/bash
for pdfile in *.pdf ; do
  convert -verbose -density 500 -resize '800' "${pdfile}" "${pdfile%.*}".png
done
mkc
fonte
7

Você pode usar mogrifypara converter e redimensionar todos os .pdfs no diretório atual:

mogrify -verbose -density 500 -resize 800 -format png ./*.pdf

Ao usar um s diferente format(nesse caso -format png), os originais .pdfsão deixados intocados, os arquivos de saída com o mesmo nome, exceto a extensão que será alterada para a especificada por format.

don_crissti
fonte
1

Se você não estiver restrito a usar o bash, poderá usar um script python para converter todos os .pdfarquivos no diretório atual em .pngimagens de alta resolução . Pode ser modificado para outros tipos de imagens de entrada / saída ou para usar argumentos diferentes convert.

#! /usr/bin/env python

import os

def main():
    dir_list = os.listdir('.')
    for full_file_name in dir_list:
        base_name, extension = os.path.splitext(full_file_name)
        if extension == '.pdf': # then .pdf file --> convert to image!
            cmd_str = ' '.join(['convert',
                                '-density 400',
                                full_file_name,
                                base_name + '.png'])
            print(cmd_str)  # echo command to terminal
            os.system(cmd_str)  # execute command

if __name__ == '__main__':
    main()
MattKelly
fonte