Konwertuj każdy pdf w bieżącym katalogu na png

16

Chcę napisać bashskrypt, aby przekonwertować każdy .pdfplik w bieżącym katalogu na .pngplik. Na przykład:

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

To moja najlepsza próba:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Lubię kodować
źródło

Odpowiedzi:

17

Jeśli masz naprawdę dziwne nazwy, które zawierają znaki nowej linii lub ukośniki odwrotne itp., Możesz zrobić coś takiego:

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

To powinno być w stanie poradzić sobie z wszystkim, co na to rzucisz.

Zastosowane sztuczki:

  • find ... -print0: powoduje findwydrukowanie jego wyników oddzielonych znakiem null, zajmiemy się nowymi liniami.
  • IFS= : spowoduje to wyłączenie podziału słów, potrzebnego do radzenia sobie z białymi odstępami.
  • read -r: wyłącza interpretację znaków specjalnych odwrotnego ukośnika, aby radzić sobie z plikami zawierającymi ukośniki odwrotne.
  • read -d '': ustawia separator rekordu na znak zerowy, aby radzić sobie z danymi wyjściowymi find i poprawnie obsługiwać nazwy plików za pomocą znaków nowej linii.
  • ${file%.*}.png: wykorzystuje wbudowane możliwości powłoki do manipulowania łańcuchem w celu usunięcia rozszerzenia.
terdon
źródło
Obie odpowiedzi są dobre, ale zaakceptowałem tę, ponieważ zawiera wyjaśnienie zastosowanych sztuczek.
Lubię
Czy to przenośnie (POSIX) i nadal obsługiwać żadnych znaków specjalnych: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Zobacz unix.stackexchange.com/a/321753/135943 dla wyjaśnienia i tła.
Wildcard
1
@Wildcard jedyną rzeczą nie posixową tutaj jest find's -printf, więc wszystko, czego potrzebujesz do przenośności, to zastąpić ją `-exec printf '% s \ 0' {} +`.
terdon
14

Możesz użyć forpętli bash w następujący sposób:

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

Możesz użyć mogrifydo konwersji partii i zmiany rozmiaru wszystkich .pdfs w bieżącym katalogu:

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

W przypadku użycia innego format(w tym przypadku -format png) oryginału .pdfpozostawia się nietknięte, pliki wyjściowe mają tę samą nazwę, z wyjątkiem rozszerzenia, które zostanie zmienione na określone przez format.

don_crissti
źródło
1

Jeśli nie jesteś ograniczony do używania bash, możesz użyć skryptu python do konwersji wszystkich .pdfplików w bieżącym katalogu na .pngobrazy o wysokiej rozdzielczości . Można go zmodyfikować dla innych typów obrazów wejściowych / wyjściowych lub użyć różnych argumentów 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
źródło