Forum Linux.débutant Bash : PDFs vers Jpeg à la chaîne

Posté par  .
Étiquettes : aucune
0
9
fév.
2005
Je débute en bash. j'ai écrit un petit script qui convertit tous les PDFs du dossier dans lequel il est lancé en jpeg.

#!/bin/sh
for I in *.pdf
do
pdftoppm $I a
convert a-000001.ppm $I.jpg
rm a-000001.ppm
done
for j in *.pdf.jpg
do
mv $j ${j%%.pdf.jpg}.jpg
done


Comme vous pouvez le voir, je n'ai pas réussi à ne "prendre" que la racine du nom du fichier pdf (sans son extension .pdf en simple). Donc je suis oubligé de l'enlever à la fin pour renommer tous mes *.pdf.jpg en *.jpg

D'autre part, le script convertis les fichiers du dossier dans lequel il est lancé mais je ne saurais lui indiquer un fichier spécifique.

Est-ce que vous pourriez m'aider à l'améliorer?
  • # basename

    Posté par  . Évalué à 4.

    La commande basename sert à extraire d'un chemin complet /toto/fichier.ext le nom de fichier seul (fichier.ext), et enlève aussi tout chaine de caractère finale si on lui la précise.
    Tu peux donc faire un convert a-000001.ppm `basename $I .pdf`.jpg (n'oublie pas le point !)

    Sinon, tu sais que convert peut directement convertir un pdf en jpg, sans avoir besoin de passer par pdftoppm ? (Si c'est du multi-page il fera plusieurs jpegs)
    • [^] # Re: basename

      Posté par  . Évalué à 2.

      Pour convert j'ai pas trouvé la commande qui permet de régler la qualité et le nombre de dpi à appliquer lors de la transformation. Par défaut, convert fichier.pdf fichier.jpg me donne un jpeg bien moins détaillé que pdftoppm. voila ma raison. Si tu trouves les paramètres à appliquer à convert je t'en remercie. J'ai cherché dans le man j'ai pas trouvé.

      Merci à tous je vous plussoie
  • # La réponse est dans ton script !

    Posté par  (site web personnel) . Évalué à 4.


    convert a-000001.ppm $I.jpg
    [...]
    mv $j ${j%%.pdf.jpg}.jpg


    Si on l'écrit


    convert A B
    mv B C


    est-ce que ça rend plus clair le fait qu'il y a plus simple ? ;-)

    Sinon, man basename.
  • # basename

    Posté par  . Évalué à 4.

    Pour supprimer l'extension des fichiers, tu peux utiliser basename:
    $basename fichier.pdf .pdf
    fichier
    D'autre part, pourquoi ne pas utiliser simplement convert ? Le code ressemblerait à:
    #! /bin/sh
    for pdf in *.pdf
    do
    convert $pdf `basename $pdf .pdf`.jpg
    done
    Ce qui créé des .jpg.0 .. .jpg.n pour les PDFs avec plusieurs pages. Pour ce qui est de déplacer les fichiers dans un autre répertoire: convert $pdf $1/`basename $pdf .pdf`.jpg devrait aller.
  • # fichiers en argument

    Posté par  . Évalué à 4.

    Pour que le script puisse traiter seulement des fichiers passés en paramètres, il faut établir une liste de fichiers à traitement différente selon qu'on passe des arguments au script (nombre d'argument $# différent de 0, et alors on utilise ces arguments: $*) ou pas.

    if [ $# -eq 0 ]; then
    fichiers=*.pdf
    else
    fichiers=$*
    fi

    for I in $fichiers
    do [ tes traitement]; done


    Attention, si tu passes en argument un fichier qui n'est pas dans le repertoire courant, à bien écrire le résultat dans son répertoire ! (on le perd avec "basename", on le récupère avec "dirname". Autant garder ta substitution {%%} qui garde tout, et qui évite de lancer un binaire extérieur de plus à chaque tour de boucle.)
  • # Erreur classique

    Posté par  (site web personnel) . Évalué à 4.

    Oublier les double quotes autour des variables peut s'avérer douloureux de temps à autres (tous ceux qui un jour ont fait un "rm -fr /home/foo/ bar", notez l'espace après foo/, voient de quoi je parle. donc :
    for i in blabla; do
            mv "$i" ${i%%.pdf};
            ...
    done
    
    Il faut ptet penser à positionner correctement la variable IFS :
    IFS=$'\n'
    
    C'est toujours pratique.
    • [^] # Re: Erreur classique

      Posté par  . Évalué à 2.

      Peux-tu expliquer un peu plus? pourquoi les "" et qu'est-ce que l'IFS?
  • # toujours tout afficher a l ecran ...

    Posté par  (site web personnel) . Évalué à 1.

    premiere etape, verifier ce que contiens $i:

    for i in *.pdf
    do echo $i
    done

    voila, je commence toujours par une boucle comme ca, et apres je remplis:

    j=`echo $i | sed 's/.pdf/,jpg/'`
    echo $j
    convert $i $j

    mais je te previens, utiliser convert pour pdf->jpg, tu vas etre decu du resultat. Enfin moi je l ai ete.

    Lecon du jour: for i in *.pdf ne remplis pas i avec le contenu de l etoile, mais tout ce que retourne
    ls *.pdf
  • # Avancement du script

    Posté par  . Évalué à 3.

    #!/bin/sh
    # Regarde s'il y a au moins 1 argument pour exécuter la commande
    if [ $# -eq 0 ]; then
    echo "Commande sans arguments: indiquer 'tout' pour convertir tout le répertoire"
    else

    #Déclaration du répertoire en cours comme lieu d'éxécution
    cd ./

    # Si l'argument est "tout" il saisit tous les PDFs du répertoire. Sinon il saisit les nom des fichiers spécifiés dans la commande
    if [ $# == 1 ]; then
    if [ $* == "tout" ]; then
    fichiers=*.pdf
    else
    fichiers=$*
    fi
    else
    fichiers=$*
    fi

    # Conversion des fichiers demandés
    for I in $fichiers
    do
    # Conversion PDF > ppm
    pdftoppm $I a
    # Conversion ppm > jpg
    convert a-000001.ppm `basename $I .pdf`.jpg
    # Suppression du ppm intermédiaire
    rm a-000001.ppm
    echo "$I converti en jpeg"
    done

    fi


    Je ne sais pas écrire la condition "différent de" qui permettrait de raccourcir la section 3 sur les argument des la commande.

    Merci pour votre aide. :-)
    • [^] # Re: Avancement du script

      Posté par  . Évalué à 3.

      Je ne sais pas écrire la condition "différent de" qui permettrait de raccourcir la section 3 sur les argument des la commande.

      Tout simplement != comme c'est mentionné dans le manuel de bash (recherche la chaîne "=="). Ca marche pour les chaînes de caractères, ce qui est le cas ici.
      Sinon pour les opérateurs arithmétiques c'est : -eq, -ne, -lt, -le, -gt, -ge (ce sont des abréviations anglaises bien sûr).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.