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 05/12/2011, à 01:28

Levi59

[Astuce] Compresser un fichier odt en convertissant les png en jpeg

J'ai voulu écrire un script qui me permettrais de convertir les images png contenus dans un odt en jpeg afin de gagner en poids. J'ai réussi à tout modifier (Il me faut encore optimiser le tout) mais malgré ça, je me retrouve avec un odt corrompu qui ne peut être ouvert par Libre office.

Quelqu'un qui s'y connait pourrait-il me dire ou se situe mon erreur? D'avance merci!

EDIT : Corrigé! L'erreur venait de zip qui ne conserve par les dossiers vides lors de la compression, dossiers qui étaient ici essentiel pour Libre Office.

Voici le script :
writer_minimize.sh

#!/bin/bash

function __Convert_Dir() {
    for File in "${1}"/*
    do
        [[ -f $File ]] && __Convert_File "${File}"
    done
}

function __Convert_File() {
    Mimetype=$(file -ib "$1")
    Mimetype=${Mimetype%;*}
    [[ ${Mimetype} == application/vnd.oasis.opendocument.text ]] && __Edit_file "$1" || echo "\"$1\" n'est pas un .odt"
}

function __Edit_file() {
    Name="${1##*/}"
    File="$1"
    mkdir -p "/tmp/writer_minimizer/${Name// /_}_FILES"
    unzip "$File" -d "/tmp/writer_minimizer/${Name// /_}_FILES"
    
    for Png in /tmp/writer_minimizer/${Name// /_}_FILES/Pictures/*.png
    do
        Name_Png=${Png##*/}
        Name_Png=${Name_Png%.png}
        
        sed -i 's/png" manifest:full-path="Pictures\/'"${Name_Png}"'\.png/jpeg" manifest:full-path="Pictures\/'"${Name_Png}"'.jpg/' "/tmp/writer_minimizer/${Name// /_}_FILES/META-INF/manifest.xml"
        sed -i 's/'"${Name_Png}"'\.png/'"${Name_Png}"'.jpg/' "/tmp/writer_minimizer/${Name// /_}_FILES/content.xml"
        
        convert "${Png}" "${Png%.png}.jpg"
        rm "${Png}"
    done
    
    OldPwd="$(pwd)"
    cd "/tmp/writer_minimizer/${Name// /_}_FILES"
    7z a "${Name%.odt}.zip" *
    cd "$OldPwd"
   
    [[ -d ${File%/*}/writer_minimize/ ]] || mkdir "${File%/*}/writer_minimize/"
    mv "/tmp/writer_minimizer/${Name// /_}_FILES/${Name%.odt}.zip" "${File%/*}/writer_minimize/$Name"
    rm -r "/tmp/writer_minimizer/${Name// /_}_FILES/"
}

function __Erreur() {
    [[ -d "/tmp/writer_minimizer/" ]] && rm -r "/tmp/writer_minimizer"
    __Help
    exit 127
}

function __Help() {
    echo -e "\nOptions disponibles :\n\t-d /Chemin/vers/dossier/\tConvertir tout un dossier\n\t-f /Chemin/vers/fichier.odt\tConvertir un fichier\n\t(Chemin absolu et relatif possible)\n\t-h\t\t\t\tAide"
}

while getopts "d:f:h" Option
do
    case $Option in
        d ) Ok=1
            [[ -z ${OPTARG} ]] && __Erreur
            [[ -d $OPTARG ]] && OPTARG="${OPTARG}/" && __Convert_Dir "${OPTARG//\/\//}" || echo "Erreur : \"$OPTARG\" n'est pas un dossier" >&2 ;;
       
        f ) Ok=1
            [[ -z ${OPTARG} ]] && __Erreur
            [[ ${OPTARG%%/*} == . || ${OPTARG%%/*} == ${OPTARG} ]] && {
            OPTARG="$(pwd)/${OPTARG/.\//}"
        }
        [[ -f $OPTARG ]] && __Convert_File "${OPTARG}" || echo "Erreur : \"$OPTARG\" n'est pas un fichier" >&2 ;;
       
        h ) Ok=1
            __Help
            exit ;;
        [?] ) Ok=1
            __Erreur ;;
    esac   
done

(($Ok)) || {
    [[ -n $1 ]] && echo "Erreur : Pas d'option définie" >&2
    __Erreur
}

[[ -d "/tmp/writer_minimizer/" ]] && rm -r "/tmp/writer_minimizer"
exit

EDIT :
Correction d'une petite erreur dans le code

Dernière modification par Levi59 (Le 10/12/2011, à 21:56)

Hors ligne

#2 Le 09/12/2011, à 00:52

Levi59

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

J'aurais besoin d'un coups de main pour le getops. Lorsque je ne met pas d'option, je devrais avoir la fonction __Erreur qui se lance mais ici, il ne se passe rien...

levi59@crunchbang-desktop:~/Test$ writer-minimize test.odt   #Normalement je dois indiquer un fichier avec -f
levi59@crunchbang-desktop:~/Test$ bash -x writer-minimize test.odt 
+ [[ '' == . ]]
+ [[ '' == '' ]]
++ pwd
+ OPTARG=/home/rombeaut/Test/
+ getopts d:f:h Option
+ [[ -d /tmp/writer_minimizer/ ]]
+ exit

Où est mon erreur?
D'avance merci.

Hors ligne

#3 Le 09/12/2011, à 09:19

Dude

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

Tu oublies de préciser que la solution t'a été donnée sur le forum officiel :
http://user.services.openoffice.org/fr/ … =8&t=31360

mad

Hors ligne

#4 Le 09/12/2011, à 15:34

Levi59

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

Mea Culpa j'aurais en effet du le préciser mais j'ai attendu plusieurs jours sur ce forum sans avoir de réponse.

L'interet ici étant de comprendre mon erreur et surtout de partager cette expérience et ne cherchant pas à m'attirer la paternité de la découverte, je ne crois pas que mon oubli soit si gênant. wink

Hors ligne

#5 Le 10/12/2011, à 08:31

pingouinux

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

Bonjour,

Levi59 #2 a écrit :

J'aurais besoin d'un coups de main pour le getops. Lorsque je ne met pas d'option, je devrais avoir la fonction __Erreur qui se lance mais ici, il ne se passe rien...

Je pense que cette fonction __Erreur ne va se déclencher qu'en cas d'option inconnue ou d'argument manquant à une option valide.
Pour voir s'il manque des arguments d'appel, on peut tester après la boucle while getopts ... si tout ce qui devrait être initialisé l'a bien été.
Ton utilisation d'OPTARG avant la boucle m'étonne, car c'est getopts qui remplit cette variable.
Cordialement

Hors ligne

#6 Le 10/12/2011, à 14:31

Levi59

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

oups! Le test sur le optarg avant getops est un oubli d'un précédente version. Elle n'avait cependant pas d'effet sur le comportement...

Par contre j'ai réussi à atteindre la fonction erreur que j'ai aussi modifié car getopts indiquait déja les options non prévu par contre je n'arrive pas à mettre un message en cas d'absence d'option. ex :

crunchbang:~/Test writer_minimiser.sh -f
/home/akira/bin/writer_minimiser.sh : l'option nécessite un argument -- f
Options disponibles :
    -d /Chemin/vers/dossier/    Convertir tout un dossier
    -f /Chemin/vers/fichier.odt    Convertir un fichier
    (Chemin absolu et relatif possible)
    -h                Aide
crunchbang:~/Test writer_minimiser.sh -p
/home/akira/bin/writer_minimiser.sh : option non permise -- p

Options disponibles :
    -d /Chemin/vers/dossier/    Convertir tout un dossier
    -f /Chemin/vers/fichier.odt    Convertir un fichier
    (Chemin absolu et relatif possible)
    -h                Aide
crunchbang:~/Test writer_minimiser.sh -f
/home/akira/bin/writer_minimiser.sh : l'option nécessite un argument -- f

Options disponibles :
    -d /Chemin/vers/dossier/    Convertir tout un dossier
    -f /Chemin/vers/fichier.odt    Convertir un fichier
    (Chemin absolu et relatif possible)
    -h                Aide
crunchbang:~/Test writer_minimiser.sh test_test.odt

La bonne écriture serait "writer_minimiser.sh -f test_test.odt"

EDIT Mise à jour du script.

Hors ligne

#7 Le 10/12/2011, à 15:38

pingouinux

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

Levi59 #6 a écrit :

par contre je n'arrive pas à mettre un message en cas d'absence d'option

À ma connaissance, getops ne fait que détecter les erreurs sur les paramètres qu'on lui fournit, et pas sur l'absence d'un paramètre. Pour y remédier, voilà ce que je ferais :

ok=""
while ...
do
    case $Option in
        d ) ...
             ok=oui
        f ) ...
             ok=oui
        h ) ...
             exit ;;
        [?] ) __Erreur ;;
    esac   
done
[[ "$ok" ]] || { echo "Paramètre obligatoire"; __Erreur; }

Dernière modification par pingouinux (Le 10/12/2011, à 15:39)

Hors ligne

#8 Le 10/12/2011, à 22:00

Levi59

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

J'ai appliqué ton idée et en effet ça a l'air de fonctionner! Je vais réfléchir à d'autres améliorations. ^^

En tout cas merci de ton aide wink

Hors ligne

#9 Le 11/12/2011, à 12:15

nesthib

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

mieux que

ok="oui"
…
[[ "$ok" ]] || {…}

plus simple et sans test :

ok=true
…
$ok || {…}

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#10 Le 11/12/2011, à 12:30

pingouinux

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

@nesthib #9 : en effet, merci du tuyau

Hors ligne

#11 Le 15/12/2011, à 09:23

kikislater

Re : [Astuce] Compresser un fichier odt en convertissant les png en jpeg

Hum, top ça !

On pourrais peut-être le transformer en nautilus-actions

Hors ligne