Convertir chaque pdf du répertoire courant en png


16

Je veux écrire un bashscript pour convertir chaque .pdffichier du répertoire actuel en un .pngfichier. Par exemple:

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

Ceci est ma meilleure tentative:

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

Réponses:


17

Si vous avez des noms vraiment étranges, ceux qui contiennent des nouvelles lignes ou des barres obliques inverses, etc., vous pouvez faire quelque chose comme ceci:

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

Cela devrait pouvoir traiter à peu près tout ce que vous lui lancez.

Astuces utilisées:

  • find ... -print0: fait findimprimer ses résultats séparés par le caractère nul, traitons les sauts de ligne.
  • IFS= : cela désactivera la division des mots, nécessaire pour gérer les espaces blancs.
  • read -r: désactive l'interprétation des caractères d'échappement antislash, pour gérer les fichiers contenant des antislashs.
  • read -d '': définit le délimiteur d'enregistrement sur le caractère nul, pour gérer la sortie de find et gérer correctement les noms de fichier avec des caractères de nouvelle ligne.
  • ${file%.*}.png: utilise les capacités de manipulation de chaînes intégrées du shell pour supprimer l'extension.

Les deux réponses sont bonnes mais j'ai accepté celle-ci car elle est accompagnée d'une explication des astuces utilisées.
J'aime

Ou faites-le de manière portative (POSIX) et gérez toujours les caractères spéciaux: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Voir unix.stackexchange.com/a/321753/135943 pour des explications et des informations de base.
Wildcard

1
@Wildcard la seule chose non-posix ici est la recherche -printf, donc tout ce dont vous avez besoin pour la portabilité est de le remplacer par `-exec printf '% s \ 0' {} +`.
terdon

14

Vous pouvez utiliser la forboucle bash comme suit:

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

7

Vous pouvez utiliser mogrifypour convertir par lots et redimensionner tous les .pdfs dans le répertoire actuel:

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

Lorsque vous utilisez un autre format(dans ce cas -format png), les originaux ne .pdfsont pas modifiés, les fichiers de sortie portant le même nom, à l'exception de l'extension qui sera remplacée par celle spécifiée par format.


1

Si vous n'êtes pas limité à l'utilisation de bash, vous pouvez utiliser un script python pour convertir tous les .pdffichiers du répertoire actuel en .pngimages haute résolution . Il peut être modifié pour d'autres types d'images d'entrée / sortie, ou pour utiliser différents arguments pour 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()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.