Conversion par lots .doc/.docx en .pdf

mc13009

Membre junior
10 Décembre 2009
11
0
www.filigrane-recrutement.com
Bonjour à tous,

Et d'avance merci pour les réponses.
J'ai fait des recherches, j'ai trouvé des réponses, mais qui ne fonctionne pas (soit par évolution des Os, soit par erreur de manipulation de ma part). J'ai testé automator, les différents scripts proposés sur le forum, VipRiser...

Bon, en résumé, j'ai 3443 fichier .doc ou .docx (ou sans extension apparente, bien que le Finder sait pertinemment que c'est avec word qu'il faut ouvrir ces documents). Je souhaite tous les convertir en .pdf.

Une idée M'siers Dames ?

Bloc de code:
tell application "Finder"
    set cheminsource to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à exporter en PDF"
    set chemincible to choose folder with prompt "Sélectionnez le dossier cible"
  
    my inspecter(cheminsource, chemincible)
end tell

on inspecter(source, cible)
    tell application "Finder"
        -- traitement des fichiers :
      
        set les_fichiers to files of source
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                set lefichier to chaque_fichier
                set nom to name of chaque_fichier -- recupere le nom du fichier
                set extens to document file nom in source --recupere l extension du fichier
                set lextension to name extension of extens
              
                if lextension = "docx" then
                  
                    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                    set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
                    set elements to text items of nom
                    set nomcourt to (items 1 thru -2 of elements) as string
                    set ancien_nom to nomcourt
                    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                  
                    set sortie to cible & ancien_nom & ".pdf" as string --défini le chemin de sortie
                  
                  
                    set extension hidden of lefichier to false -- force affichage de l'extension
                    set lefichier to chaque_fichier as string
                  
                    tell application "Microsoft Word"
                        open file lefichier -- ouvre le fichier dans Word
                      
                        set theActiveDoc to the active document
                        save as theActiveDoc file format format PDF file name sortie
                      
                        close document nom --ferme le fichier
                    end tell
                end if
              
            end tell
        end repeat
        -- traitement des dossiers :
        set les_dossiers to folders of source
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

J'ai essayé le script ci-dessus. Cela m'indique une erreur:
"Erreur dans Microsoft Word: missing value ne comprends pas le message "save as"


Par ailleurs, je pense avoir un problème d'extension entre les fichiers qui n'en ont pas, ceux en .doc et ceux en .docx. Mais ça ne devrait pas être le plus difficile à résoudre
 

zeltron54

Membre d’élite
29 Mars 2008
1 823
274
Lorraine
Bonjour,

le script avait été conçu avec word 2011 et un ancien OS.
Il y a très peu de changement a effectuer dans le script, par contre avec les nouvelles restriction de l'os à la première exécution il va te demander d'autoriser l'accès au dossier de réception des PDF.

voilà le script qui fonctionne chez moi avec word 16.36 et OS Mojave 10.14.6

Bloc de code:
tell application "Finder"
    set cheminsource to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à exporter en PDF"
    set chemincible to choose folder with prompt "Sélectionnez le dossier cible"
    
    my inspecter(cheminsource, chemincible)
end tell

on inspecter(source, cible)
    tell application "Finder"
        -- traitement des fichiers :
        
        set les_fichiers to files of source
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            tell application "Finder"
                set lefichier to chaque_fichier
                set nom to name of chaque_fichier -- recupere le nom du fichier
                set extens to document file nom in source --recupere l extension du fichier
                set lextension to name extension of extens
                
                if lextension = "docx" then
                    
                    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
                    set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
                    set elements to text items of nom
                    set nomcourt to (items 1 thru -2 of elements) as string
                    set ancien_nom to nomcourt
                    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
                    
                    set sortie to cible & ancien_nom & ".pdf" as string --défini le chemin de sortie
                    
                    
                    set extension hidden of lefichier to false -- force affichage de l'extension
                    set lefichier to chaque_fichier as string
                    
                    tell application "Microsoft Word"
                        activate
                        open file lefichier -- ouvre le fichier dans Word
                        
                        set theActiveDoc to the active document
                        save as theActiveDoc file format format PDF file name sortie
                        
                        close document nom --ferme le fichier
                    end tell
                end if
                
            end tell
        end repeat
        -- traitement des dossiers :
        set les_dossiers to folders of source
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

mc13009

Membre junior
10 Décembre 2009
11
0
www.filigrane-recrutement.com
Merci pour cette réponse.
Avec ce nouveau script, j'ai de nouveau le message "Erreur dans Microsoft Word : missing value ne comprends pas le message "save as"

Version iOs: 10,14,6
Version Word: 16,35
 
Dernière édition par un modérateur:

zeltron54

Membre d’élite
29 Mars 2008
1 823
274
Lorraine
Curieux...
Essai d'ouvrir Word avant de cliquer sur exécuter le script.
Donne quand même exactement comment tu procèdes et ce que tu obtiens à chaque étapes ?
Lorsque ça te met le message, qui à t'il dans word ?
 

Aliboron

Chercheur de son
Modérateur
Club MacG
1 Janvier 2008
13 385
799
Toulouse.cong
faq.office.macintosh.free.fr
Chez moi, en tout cas, le script fonctionne très bien, aussi bien dans Mojave 10.14.6 que dans Catalina 10.15.4. Rien de particulier à signaler, une fois le script lancé on a droit aux demandes de localisation des classeurs, ensuite avant l'enregistrement du premier document la classique demande d'autorisation d'accès et ça roule jusqu'au message final.

Tant que j'y étais, je me suis permis de modifier la ligne des extensions pour que ça prenne aussi les .doc :
if lextension = "docx" or lextension = "doc" then
...et ça fonctionne aussi, RAS... ;)
 

zeltron54

Membre d’élite
29 Mars 2008
1 823
274
Lorraine
Le changement fait par Aliboron ne fait qu’ajouter la prise en charge des fichiers doc, mais ne change en rien le fonctionnement du script qui fonctionnait en sautant tous les fichiers autres que les docx.
Enfin content pour toi si çà fonctionne...