Converti tutti i pdf nella directory corrente in png


16

Voglio scrivere uno bashscript per convertire tutti i .pdffile nella directory corrente in un .pngfile. Per esempio:

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

Questo è il mio miglior tentativo:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png

Risposte:


17

Se hai nomi davvero strani, quelli che contengono nuove righe o barre rovesciate e simili, potresti fare qualcosa del genere:

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

Dovrebbe essere in grado di gestire praticamente qualsiasi cosa tu ci passi.

Trucchi usati:

  • find ... -print0: fa sì findche i suoi risultati vengano stampati separati dal carattere null, trattiamo con le nuove righe.
  • IFS= : questo disabiliterà la suddivisione delle parole, necessaria per gestire gli spazi bianchi.
  • read -r: disabilita l'interpretazione dei caratteri di escape barra rovesciata, per gestire i file che contengono barre rovesciate.
  • read -d '': imposta il delimitatore del record sul carattere null, per gestire l'output di find e gestire correttamente i nomi dei file con caratteri di nuova riga.
  • ${file%.*}.png: usa le abilità di manipolazione delle stringhe integrate nella shell per rimuovere l'estensione.

Entrambe le risposte sono buone ma ho accettato questo perché viene fornito con una spiegazione dei trucchi utilizzati.
Mi piace scrivere il codice

Oppure fallo in modo portabile (POSIX) e gestisci comunque tutti i caratteri speciali: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + vedi unix.stackexchange.com/a/321753/135943 per spiegazioni e informazioni.
Wildcard il

1
@Wildcard l'unica cosa non posix qui è trovare -printf, quindi tutto ciò di cui hai bisogno per la portabilità è sostituirlo con `-exec printf '% s \ 0' {} +`.
terdon

14

Puoi usare il forloop bash come segue:

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

7

È possibile utilizzare mogrifyper convertire in batch e ridimensionare tutti .pdfi messaggi nella directory corrente:

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

Quando si utilizza un diverso format(in questo caso -format png) gli originali non .pdfvengono toccati, i file di output con lo stesso nome ad eccezione dell'estensione che verrà modificata in quella specificata da format.


1

Se non sei limitato all'utilizzo di bash, puoi utilizzare uno script Python per convertire tutti i .pdffile nella directory corrente in .pngimmagini ad alta risoluzione . Potrebbe essere modificato per altri tipi di immagine di input / output o per utilizzare argomenti diversi per 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.