Перетворіть кожен 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: відключає інтерпретацію символів втечі зворотної косої риси для обробки файлів, що містять звороту косу рису.
  • read -d '': встановлює роздільник запису на нульовий символ, щоб мати справу з результатами пошуку та правильно обробляти імена файлів символами нового рядка.
  • ${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 є єдиним, що не має тут позиції, це пошук -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

7

Ви можете використовувати mogrifyдля пакетного перетворення та зміни розміру всіх .pdfs у поточному каталозі:

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

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


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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.