Конвертировать каждый PDF в текущем каталоге в PNG

16

Я хочу написать bashскрипт для преобразования каждого .pdfфайла в текущем каталоге в .pngфайл. Например:

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

Это моя лучшая попытка:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Мне нравится код
источник

Ответы:

17

Если у вас есть действительно странные имена, которые содержат переводы строки или обратную косую черту и тому подобное, вы можете сделать что-то вроде этого:

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

Это должно быть в состоянии справиться почти со всем, что вы бросаете на это.

Используемые трюки:

  • find ... -print0: заставляет findпечатать результаты, разделенные нулевым символом, давайте разберемся с символами новой строки.
  • IFS= : это отключит разделение слов, необходимое для работы с пробелами.
  • read -r: отключает интерпретацию escape-символов обратной косой черты для работы с файлами, содержащими обратную косую черту.
  • read -d '': устанавливает разделитель записи на нулевой символ, чтобы иметь дело с выводом find и правильно обрабатывать имена файлов с символами новой строки.
  • ${file%.*}.png: использует встроенные в оболочку возможности манипуляции со строками для удаления расширения.
Тердон
источник
Оба ответа хороши, но я принял этот, потому что он идет с объяснением используемых трюков.
Мне нравится код
Или сделайте это переносимо (POSIX) и по-прежнему обрабатывайте любые специальные символы: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + см. Unix.stackexchange.com/a/321753/135943 для объяснения и фона.
Wildcard
1
@Wildcard единственная не-posix вещь здесь - это find -printf, поэтому все, что вам нужно для переносимости, это заменить ее на `-exec printf '% s \ 0' {} +`.
Тердон
14

Вы можете использовать forцикл bash следующим образом:

#!/bin/bash
for pdfile in *.pdf ; do
  convert -verbose -density 500 -resize '800' "${pdfile}" "${pdfile%.*}".png
done
MKC
источник
7

Вы можете использовать mogrifyдля пакетного преобразования и изменения размера всех .pdfфайлов в текущем каталоге:

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

При использовании другого format(в данном случае -format png) исходного .pdfфайла не затрагивается, выходные файлы имеют одинаковое имя, за исключением расширения, которое будет изменено на имя, указанное с помощью format.

don_crissti
источник
1

Если вы не ограничены использованием bash, то вы можете использовать скрипт Python для преобразования всех .pdfфайлов в текущем каталоге в .pngизображения с высоким разрешением . Его можно изменить для других типов изображений ввода / вывода или использовать другие аргументы для 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
источник