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

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.

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

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.


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()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.