Konvertiere jedes PDF im aktuellen Verzeichnis nach png

16

Ich möchte ein bashSkript schreiben , um jede .pdfDatei im aktuellen Verzeichnis in eine .pngDatei zu konvertieren . Beispielsweise:

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

Das ist mein bester Versuch:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Ich mag es zu kodieren
quelle

Antworten:

17

Wenn Sie wirklich seltsame Namen haben, die Zeilenumbrüche oder umgekehrte Schrägstriche enthalten, können Sie Folgendes tun:

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

Das sollte mit so gut wie allem fertig werden, was Sie darauf werfen.

Tricks verwendet:

  • find ... -print0: bewirkt find, dass die Ergebnisse durch das Null-Zeichen getrennt ausgegeben werden. Wir wollen uns mit Zeilenumbrüchen befassen.
  • IFS= : Dadurch wird die Wortteilung deaktiviert, die für den Umgang mit Leerzeichen erforderlich ist.
  • read -r: Deaktiviert die Interpretation von Backslash-Escape-Zeichen für Dateien mit Backslashes.
  • read -d '': Setzt den Datensatzbegrenzer auf das Nullzeichen, um die Ausgabe von find zu verarbeiten und Dateinamen mit Zeilenvorschubzeichen korrekt zu behandeln.
  • ${file%.*}.png: verwendet die eingebauten Manipulationsfunktionen der Shell , um die Erweiterung zu entfernen.
terdon
quelle
Beide Antworten sind gut, aber ich habe sie akzeptiert, da sie eine Erklärung der verwendeten Tricks enthalten.
Ich mag
Oder portabel (POSIX) und trotzdem mit Sonderzeichen umgehen: Erläuterungen und Hintergrundinformationen finden find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Sie unter unix.stackexchange.com/a/321753/135943 .
Wildcard
1
@Wildcard Das einzige, was hier nicht als Posix zu bezeichnen ist, ist find's -printf. Alles, was Sie für die Portabilität benötigen, ist, es durch -exec printf% s \ 0 {} + zu ersetzen.
Terdon
14

Sie können die Bash- forSchleife folgendermaßen verwenden:

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

Sie können mogrifyalle .pdfs im aktuellen Verzeichnis stapelweise konvertieren und in der Größe ändern :

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

Wenn Sie ein anderes format(in diesem Fall -format png) Original verwenden, .pdfbleiben die ursprünglichen s unberührt. Die Ausgabedateien haben denselben Namen, mit Ausnahme der Erweiterung, die in die durch angegebene geändert wird format.

don_crissti
quelle
1

Wenn Sie nicht auf die Verwendung von Bash beschränkt sind, können Sie mit einem Python-Skript alle .pdfDateien im aktuellen Verzeichnis in hochauflösende .pngBilder konvertieren . Sie kann für andere Eingabe- / Ausgabebildtypen oder für andere Argumente für geändert werden 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
quelle