Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/12/2024, à 18:08

cristobal78

(résolu) script qui fait tourner un pdf

bonjour à tous

J'aurai besoin de vos lumières pour m'expliquer pourquoi mon script qui marche une fois, ne marche pas deux fois !

Voici le script :

#!/bin/bash
################################################################################################
# ceci est un script nemo : rot-pdf-90-d
# fait tourner les fichiers pdf sélectionnés (par CTRL-Click droit) de 90 deg (1/4 tour à droite)
# nécessite l'installation préalable de : pdftk
################################################################################################
fichier="$1"
nomficsansext=$(basename -s .pdf "$fichier")            # nom du fic sans extension
# execute la rotation de 90 deg. et renomme le fichier
pdftk "$fichier" cat 1-endeast output "$nomficsansext"-rot90d.pdf  

Ce nemo script qui s'exécute suite à un click droit sur un fichier .pdf quelconque le fait tourner de 90 degrés vers la droite et le renomme en lui ajoutant un suffixe "-rot90d"

Ça marche. La rotation de 90 degrés s'effectue. smile

Là où je ne comprends plus, c'est que quand j'applique ce script au résultat précédent (donc sur le fichier qui vient de tourner de 90 deg) le script est inopérant alors que je m'attendais à une deuxième rotation vers la droite, c-à-d à une rotation totale de 180 degrés par rapport au fichier d'origine. sad

Dernière modification par cristobal78 (Le 16/12/2024, à 18:26)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 14/12/2024, à 18:15

sputnick

Re : (résolu) script qui fait tourner un pdf

Salut,

effectivement, cela ne fonctionne pas deux fois consécutives.

Peut-être peux tu créer un script pour tourner à 180° pour contourner le problème.


Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr

Hors ligne

#3 Le 14/12/2024, à 18:26

Sciensous

Re : (résolu) script qui fait tourner un pdf

essaye un suffixe différent de -90d ... QvDd (QuatreVingtDixDroite) ?
(est-ce le - ou le 90 qui fait bloquer ?)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#4 Le 14/12/2024, à 19:09

sputnick

Re : (résolu) script qui fait tourner un pdf

Mon intuition (ce n'est pas très scientifique, j'en conviens) c'est que le PDF modifié n'est plus vraiment un vrai PDF mais une image avec une enveloppe PDF.

Je peux me tromper.

Voir:

od -c rotated.pdf

Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr

Hors ligne

#5 Le 14/12/2024, à 19:17

cqfd93

Re : (résolu) script qui fait tourner un pdf

Bonjour,

Je ne connais pas trop pdftk, mais d'après le man, il y a l'option rotate, est-ce que tu l'as essayée ?

Et sinon, pour éliminer un problème avec le nom du fichier généré, tu as essayé en le renommant avant de ré-exécuter ton script ?


cqfd93

Hors ligne

#6 Le 14/12/2024, à 19:44

cristobal78

Re : (résolu) script qui fait tourner un pdf

Merci à tous et je vais essayer de répondre ;

@ cqfd : option "rotate" essayée, mais sans succès, même problème. J'avais aussi essayé en renommant différemment le pdf obtenu après premier passage du script.

@ sputnick : je me suis dit ça aussi mais je n'ai pas la moindre idée de la manière de le prouver
@ sputnick : l'option 180 marche mais la raison d'être de mon script c'est (ou plutôt c'était ! ) de se dire je n'écris qu'un seul script que j'utilise :

1 fois pour une rot de 90 à droite
2 fois pour un retournement de 180 deg et
3 fois pour 3/4 de tour à droite (qui est aussi une fois 90 deg à gauche)

Cela aurait permis d'éviter d'écrire 3 scripts un pour chaque type de rotation !

@ sciensious : j'ai fait aussi un script effectuant rotation de -90 degré (1/4 de tour à gauche). Le pb apparait chez moi qd j'applique le script sur le fichier initial modifié par le script.

une solution ridicule serait de
convertir le pdf en jpeg
faire tourner le jpeg
convertir le jpeg en pdf   tongue tongue tongue


Modération : merci de respecter la langue du forum qui est le français, pas le SMS.

Dernière modification par cqfd93 (Le 14/12/2024, à 20:35)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#7 Le 14/12/2024, à 20:37

cqfd93

Re : (résolu) script qui fait tourner un pdf

Il te reste la solution de faire un script qui te propose le choix entre les 3 rotations, avec zenity c'est facile.


cqfd93

Hors ligne

#8 Le 14/12/2024, à 20:39

Watael

Re : (résolu) script qui fait tourner un pdf

@ sputnick : l'option 180 marche mais la raison d'être de mon script c'est (ou plutôt c'était ! ) de se dire je n'écris qu'un seul script que j'utilise :

1 fois pour une rot de 90 à droite
2 fois pour un retournement de 180 deg et
3 fois pour 3/4 de tour à droite (qui est aussi une fois 90 deg à gauche)

Cela aurait permis d'éviter d'écrire 3 scripts un pour chaque type de rotation !

mauivaise idée

#!/bin/bash

#d'après https://linux.die.net/man/1/pdftk
declare -A Angles=( [0]=N [90]=E [180]=S [270]=W [-90]=R [+90]=L [+180]=D )

fichier=$1 #TODO: check fichier est un fichier, et est un pdf ayant une extension .pdf
angle=${2:-0} #TODO: ou arrêter le script en l'absence de correspondance entre le second argument et les indices du tableau Angles

pdftk "$fichier" cat 1-end${Angles[$angle]} output "${fichier/%.pdf /-rot90d.pdf}"

à appeler ainsi :

$ pdfRotate nomFichier.pdf 90

par exemple

/!\ pas testé.

Dernière modification par Watael (Le 14/12/2024, à 20:40)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 15/12/2024, à 00:33

cristobal78

Re : (résolu) script qui fait tourner un pdf

Avec un peu ou beaucoup de chacun de vos conseils - merci à vous tous - je suis arrivé à ce script unique qui marche au poil :

#!/bin/bash
###################################################################################
# nom du script : rot-pdf
# modif de l'orientation finale des fichiers pdf sélectionnés (par CTRL-Click droit)
# nécessite l'installation préalable de : pdftk
###################################################################################

format_in="PDF"
est_pas="Fin du programme :\n\n ce fichier n'est pas au format "
op_en_cours="Opération en cours... \n\nCliquer sur Valider dès que la barre est fixe et entièrement colorée"   
pas_fichier="Fin du programme :\n\nIl faut sélectionner un fichier et non un répertoire"
annulation="<span color=\"red\">Pas d'orientation choisie\n\nFin du script</span>"

### fonctions requises

# Vérif qu'on a choisi un fichier et pas un rep.
# ---------------------------------------------------------------
fich_ou_rep() { fichier=$1 ; if [ -d "$fichier" ] ; then zenity --warning --text="$2" ; exit ; fi ; }

# Vérif qu'on travaille sur un fichier pdf
# ---------------------------------------------------------------
test_format_in() { file "$1" | grep -qE "$3" ; if [ $? -ne 0 ] ; then zenity --warning --text="$2 $3"  ; exit ; fi ; }

# (09) controle les saisies faites au clavier
# ---------------------------------------------------------------
erreur_saisie() { if [ "$1" -ne 0 ] ; then zenity --error --title="" --text="$2" ; exit ; fi ; }
	
# Barre de progression
# ---------------------------------------------------------------
bar_de_progress() { zenity --progress --pulsate --title="" --text="$1" ; }

### script ###
while [ $# -gt 0 ] ; do
	fichier="$1"

	fich_ou_rep "$fichier" "$pas_fichier"                   # on sort si on a choisi un rép au lieu d'un fichier
	test_format_in  "$fichier" "$est_pas"  "$format_in"     # on sort si le fichier n'est pas pdf

# choisir l'orientation finale
angle=$(zenity --width=300 --height=200 --list --title="Quelle orientaion veut-on ?" --text=""  --column="Cliquer sur la ligne adéquate" --print-column="1" east south west)
	code=$? 
	erreur_saisie $code "$annulation"

	nomficsansext=$(basename -s .pdf "$fichier")            # nom du fic sans extension

# rotation 90 et renommage du fichier
    pdftk "$fichier" cat 1-end"$angle" output "$nomficsansext"-"$angle".pdf  | bar_de_progress "$op_en_cours"
	
    shift
done

Ce n'est peut-être pas du Victor Hugo (clin d'oeil à watael, notre maitre à tous  smile ) mais j'en comprends chaque ligne !


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#10 Le 15/12/2024, à 01:02

sputnick

Re : (résolu) script qui fait tourner un pdf

Watael a écrit :

mauivaise idée

Tellement mauviaise que tu l'a améliorée big_smile


Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr

Hors ligne

#11 Le 15/12/2024, à 02:00

Watael

Re : (résolu) script qui fait tourner un pdf

test_format_in () if [[ $(file --brief --mime-type "$1") == *pdf ]]; then zenity --warning --text="$2 $3"; exit 1; fi

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 15/12/2024, à 08:17

cristobal78

Re : (résolu) script qui fait tourner un pdf

@watael

Merci pour cette nouvelle et belle fonction. smile

- Si j'ai bien compris ma fonction qui teste le type de fichier par son extension n'est pas sûre à 100% car un fichier peut être au format pdf mais ne pas avoir d'extension.
Donc j'ai regardé le test du --mime-type qui lui ne dépend pas d'une éventuelle extension mais d'un retour de la commande file.
C'est bien ça ?

Mais je pense que tu as dû oublier un !   quelque part parce qu'il faut quitter le script si le fichier n'est PAS au format pdf.

- Une question aussi : est-il nécessaire de mettre [[ ..... ]] ? Pourquoi pas des [ ..... ]  ?

Dernière modification par cristobal78 (Le 15/12/2024, à 08:19)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#13 Le 15/12/2024, à 18:18

cristobal78

Re : (résolu) script qui fait tourner un pdf

Watael m'a fait réfléchir longtemps jusqu'à ce que je trouve ce qui manque dans sa fonction : les "{ " et  "}"  et le "!"

test_format_in () { if [[ $(file --brief --mime-type "$1") != *pdf ]] ; then zenity --warning --text="$2 $3" ; exit 1; fi ; }

Je repars tester l'ensemble !


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#14 Le 15/12/2024, à 19:29

Watael

Re : (résolu) script qui fait tourner un pdf

oops, j'ai omis la négation !

oui, les crochets doubles sont indispensables; test n'a pas la capacité d'analyser *pdf.

NB: les accolades ne sont pas nécessaires dans une fonction si elle est constituée d'une commande composée : if, for, while...

maFonc() for i in {1..3}; do echo $i; done
$ maFonc
1
2
3

les accolades contiennent une liste de commandes. (c'est au début du man : Grammaire du shell / listes)
on pourrait même, à la place, utiliser des parenthèses pour exécuter la fonction dans un sous-shell.

Dernière modification par Watael (Le 15/12/2024, à 21:09)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 15/12/2024, à 20:19

cristobal78

Re : (résolu) script qui fait tourner un pdf

je croyais avoir posté la version finale.
La voici :

#!/bin/bash
###################################################################################
# nom du script : rot-pdf
# modif de l'orientation finale des fichiers pdf sélectionnés (par CTRL-Click droit)
# nécessite l'installation préalable de : pdftk
###################################################################################

### variables & messages

format_in="PDF"
est_pas="Fin du programme :\n\n ce fichier n'est pas au format "
op_en_cours="Opération en cours... \n\nCliquer sur Valider dès que la barre est fixe et entièrement colorée"   
pas_fichier="Fin du programme :\n\nIl faut sélectionner un fichier et non un répertoire"
annulation="<span color=\"red\">Pas d'orientation choisie\n\nFin du script</span>"

### fonctions requises

# Vérif qu'on a choisi un fichier et non pas un rep.
# ---------------------------------------------------------------
fich_ou_rep() { fichier=$1 ; if [ -d "$fichier" ] ; then zenity --warning --text="$2" ; exit ; fi ; }

# Vérif qu'on travaille bien sur un fichier pdf
# ---------------------------------------------------------------
test_format_in () { if [[ $(file --brief --mime-type "$1") != *pdf ]] ; then zenity --warning --text="$2 $3" ; exit 1; fi ; }

# contrôle les saisies faites au clavier
# ---------------------------------------------------------------
erreur_saisie() { if [ "$1" -ne 0 ] ; then zenity --error --title="" --text="$2" ; exit ; fi ; }
	
# Barre de progression
# ---------------------------------------------------------------
bar_de_progress() { zenity --progress --pulsate --title="" --text="$1" ; }

### script ###
while [ $# -gt 0 ] ; do
	fichier="$1"

	fich_ou_rep "$fichier" "$pas_fichier"                  # on sort si on a choisi un rép au lieu d'un fichier
	test_format_in "$fichier" "$est_pas"  "$format_in"     # on sort si le fichier n'est pas pdf

# choisir l'orientation finale
angle=$(zenity --width=300 --height=200 --list --title="Quelle orientaion veut-on ?" --text=""  --column="Cliquer sur la ligne adéquate" --print-column="1" east south west)
	code=$? 
	erreur_saisie $code "$annulation"

	nomficsansext=$(basename -s .pdf "$fichier")            # nom du fic sans extension

# rotation et renommage du fichier
    pdftk "$fichier" cat 1-end"$angle" output "$nomficsansext"-"$angle".pdf  | bar_de_progress "$op_en_cours"
	
    shift
done

Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#16 Le 15/12/2024, à 21:16

Watael

Re : (résolu) script qui fait tourner un pdf

# while [ $# -gt 0 ] ; do
#	fichier="$1"
for fichier #in "$@" #le `in "$@"` est facultatif
do
...
#    shift #plus besoin
done

je ne suis pas fan des fonctions courtes dont le code n'est pas réutilisé.
c'est un peu comme mettre un seul caractère dans une variable dont le nom comporte forcément plusieurs caractères, quand ce seul carctère n'est utilisé qu'une fois dans le code. wink

Dernière modification par Watael (Le 15/12/2024, à 21:16)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 16/12/2024, à 08:26

Tawal

Re : (résolu) script qui fait tourner un pdf

Hello,

J'interviens un peu tard, mais ImageMagic (commande convert) fais très bien les rotations.
Par contre le sens est anti-conventionnel (non trigonométrique).
Mais il est applicable plusieurs fois.
Exemple de rotation "vers la gauche" (+90° sens trigo) :

convert -rotate -90 fichier.pdf resultat.pdf

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#18 Le 16/12/2024, à 13:02

cristobal78

Re : (résolu) script qui fait tourner un pdf

Comme Tawal est toujours de très bon conseil  smile  j'ai testé son idée mais chez moi ça donne ça sur un fichier toto de type pdf situé dans le dossier Documents.

On vérifie que toto est de type pdf :

moi@ldlcfixe22p:~/Documents$ file --brief --mime-type toto
application/pdf

donc puisque toto est bien un fichier pdf on continue :

moi@ldlcfixe22p:~/Documents$ convert -rotate -90  toto  resultat.pdf
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/426.
convert-im6.q16: no images defined `resultat.pdf' @ error/convert.c/ConvertImageCommand/3229.
moi@ldlcfixe22p:~/Documents$ 

Error, error, error, ... pourtant c'est bien la syntaxe du man ! Que se passe-t-il ? roll

Puis j'ai remarqué que l'option rotate était précédée d'un seul tiret '-' 
Pourtant je croyais que le tiret unique était réservé aux options en une seule lettre.
Je me dis que  "rotate" aurait donc dû ou pu être précédé de deux tirets '--'.
Mais la commande ne marche pas non plus avec "--rotate".   mad


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#19 Le 16/12/2024, à 14:45

tycooon

Re : (résolu) script qui fait tourner un pdf

bonjour,
curieux ça fonctionne chez moi :

convert -rotate -90  toto  resultat.pdf

$ convert -version
Version: ImageMagick 6.9.12-98 Q16 x86_64 18038 https://legacy.imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP(4.5) 
Delegates (built-in): bzlib djvu fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png raw tiff webp wmf x xml zlib

Hors ligne

#20 Le 16/12/2024, à 15:51

Tawal

Re : (résolu) script qui fait tourner un pdf

@cristobal78 :
Pour ton erreur, regarde ce post sur Debian Facile : https://debian-facile.org/viewtopic.php … 54#p374254
Il donne la démarche et la solution à appliquer pour que convert puisse traiter des PDFs.


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#21 Le 16/12/2024, à 17:08

cqfd93

Re : (résolu) script qui fait tourner un pdf

Bonjour,

Éditer le fichier /etc/ImageMagick-6/policy.xml pour remplacer "none" par "read|write" dans la ligne :

<policy domain="coder" rights="none" pattern="PDF" />

Elle devient donc :

<policy domain="coder" rights="read|write" pattern="PDF" />

La commande :

sudo sed -i '/pattern="PDF"/s/none/read\|write/' /etc/ImageMagick-6/policy.xml

cqfd93

Hors ligne

#22 Le 16/12/2024, à 18:25

cristobal78

Re : (résolu) script qui fait tourner un pdf

Après avoir vu que ma version de GS est la 9.55 j'ai opté pour la solution 2 de tawal qui consiste à commenter les lignes avec    <!--   devant chaque ligne de la section : "disable ghostscript format types "

Et vous savez quoi ?
Ça "rote" de 90 et on peut recommencer sur le fichier "resultat"  autant de fois qu'on veut smile:):)
"Et pourtant il tourne" aurait dit Galilée. smile

En conclusion un seul script suffit : pour faire 180 ° on fait 2 fois de suite 90°

Merci à tawal et aussi à cqfd93

Je passe en résolu.


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#23 Le 16/12/2024, à 20:35

lynn

Re : (résolu) script qui fait tourner un pdf

cristobal78 a écrit :

Ça "rote" de 90 et on peut recommencer sur le fichier "resultat"  autant de fois qu'on veut smile:):)
"Et pourtant il tourne" aurait dit Galilée. smile

Oui enfin, elle rote tourne de 90°, c'est bien aussi et dans cette phrase qu'aurait prononcé Galilée, c'est elle et non il. tongue


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#24 Le 16/12/2024, à 20:39

Tawal

Re : (résolu) script qui fait tourner un pdf

Tu aurais pu essayer la méthode moins permissive de cqfd93.


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#25 Le 17/12/2024, à 00:57

cristobal78

Re : (résolu) script qui fait tourner un pdf

@ tawal

c'est bien ce que j'ai fait    smile  car j'ai appliqué la méthode cqfd93 sur mon laptop et la méthode tawal sur mon fixe.

A vrai dire j'ai trouvé plus "propre" l'idée de ne pas toucher au fichier et de seulement commenter les lignes adéquates car cela permet de bien voir ce qu'on a fait ... si on veut le défaire.


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne