Fusion PDF par lots

ordonez09

Membre enregistré
15 Mai 2019
9
0
Bonjour,

je cherche une solution afin de fusionner des fichiers PDF en lot.
J’ai un répertoire général dans lequel j’ai 250 dossiers (contenant chacun plusieurs fichiers PDF). Je souhaite fusionner, pour chaque dossier, les pdf contenus. Je devrai donc me retrouver avec 250 fichiers pdf, tout en gardant l’arborescence actuelle.
J’espère que c’est compréhensible…
J’ai essayé Automator mais je n’y parviens pas. Et les scripts… je suis un peu dépassé…
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Bonjour,

Le plus simple est d'ouvrir un des pdf d'un dossier avec aperçu, Dans la barre de gauche "vignettes" y glisser tous les autres pdf du dossier et faire un enregistrer sous ... tu obtiens un nouveau PDF avec tous les fichiers, reste plus , si OK, qu'a effacer les originaux.

La solution en passant par un applescript est possible mais très.....très longue.
 

iDanGener

Membre actif
12 Mars 2011
814
138
Bonjour,

J'espère que vous aurez un coup de main d'un spécialiste d'Automator, car ça me semble tout à fait être le genre de tâches pour lui.

Sinon, une alternative à la méthode de @zeltron54, c'est d'utiliser l'action «Créer un pdf» qui se trouve dans le menu Actions rapides de la fenêtre pop-up que l'on obtient avec le clic droit, après avoir sélectionné les fichiers pdf à fusionner.
  • On ouvre l'un des dossiers contenant des pdf
  • On sélectionne les fichiers à fusionner (Cmd-A pour avoir tous les fichiers, si le dossier ne contient que des pdf)
  • Clic droit sur l'un des fichiers sélectionnés
  • Menu Action rapide > Article Créer un pdf
Vous aurez alors un nouveau fichier pdf dans le dossier qui sera constitué de la fusion des documents pdf sélectionnés. L'ordre dans lequel les documents sont fusionnés est l'ordre selon lequel ils ont été sélectionnés (cela correspond à l'ordre dans lequel ils sont dans la fenêtre (en mode liste), si on les sélectionne tous avec Cmd-A)

Et on recommence avec les 249 autres dossiers :oops:.

Note: Sous Mojave, la taille du fichier contenant la fusion est nettement plus grande que la somme des tailles des fichiers utilisés pour le consituer.
 
Dernière édition:
  • J’aime
Réactions: zeltron54

ordonez09

Membre enregistré
15 Mai 2019
9
0
Merci de vos réponses.
Aucun moyen pour que Automator fasse de lui-même dossier après dossier? C’est justement le but: éviter de faire 250 fois la même chose…
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
@ordonez09
Bonjour,

J'ai essayé de te faire un script, mais malheureusement il est trèèèèèèèèès long, car il ne sait que ajouter une seule page à un fichier donc obliger d 'enregistrer a chaque fichier ajouté, et attendre 3 secondes qu'il est fini pour faire le fichier suivant... etc...

je te met quand même ce script, qui te demande de sélectionner le dossier a traiter, à la fin il te met un message comme quoi c'est terminé, et tu trouves dans chaque dossier un fichier compilation.pdf qui contient l'ensemble des fichiers du dossier.

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à traiter"
    my inspecter(chemin)
end tell

on inspecter(chemin)
    tell application "Finder"
        make new folder at ((path to desktop folder) as string) with properties {name:"compilation"}
        make new folder at ((path to desktop folder) & "compilation" as string) with properties {name:"la_selection"}
        set chemin_compilation to ((path to desktop folder) & "compilation:") as string
        set chemin_selection to ((path to desktop folder) & "compilation:la_selection:") as string
       
        set les_fichiers to files of chemin
       
        repeat with chaque_fichier in les_fichiers
            set nom to name of chaque_fichier as string
           
            if nom contains ".pdf" then
                duplicate chaque_fichier to chemin_selection
            end if
        end repeat
       
        set la_selection to chemin_selection as alias
        set les_fichiers to files of la_selection
        repeat with le_fichier in les_fichiers
            set nom to name of le_fichier
           
            if not (exists chemin_compilation & "la_compilation.pdf") then
                duplicate le_fichier to chemin_compilation
                set anciennom to chemin_compilation & nom as alias
                set name of anciennom to "la_compilation.pdf"
                delay 3
            else
               
                duplicate le_fichier to chemin_compilation
                set anciennom to chemin_compilation & nom as alias
                set name of anciennom to "suite.pdf"
               
                set fich to ((path to desktop folder) & "compilation:la_compilation.pdf") as string
                set fich to quoted form of POSIX path of fich
               
                set NP to do shell script "mdls -name kMDItemNumberOfPages " & fich
               
                set NP to word 3 of NP
                if NP mod 2 is not 0 then
                   
                    set nouveau to ((path to desktop folder) & "compilation:nouveau.pdf") as string
                    set nouveau1 to quoted form of POSIX path of nouveau
                    set lenew to fich --& " " & leblanc
                   
                    do shell script "'/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py' --output " & nouveau1 & space & lenew
                    do shell script "rm " & fich
                    set nouveau to nouveau as alias
                    set name of nouveau to "la_compilation.pdf"
                end if
               
                set le2 to ((path to desktop folder) & "compilation:suite.pdf") as string
                set le2 to quoted form of POSIX path of le2
                set nouveau to ((path to desktop folder) & "compilation:nouveau.pdf") as string
                set nouveau1 to quoted form of POSIX path of nouveau
                set lenew to fich & " " & le2
               
                do shell script "'/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py' --output " & nouveau1 & space & lenew
                do shell script "rm " & fich
                do shell script "rm " & le2
                set nouveau to nouveau as alias
                set name of nouveau to "la_compilation.pdf"
                delay 2
            end if
        end repeat
       
        set fichiercompil to (path to desktop folder) & "compilation:la_compilation.pdf" as string
        set adeplacer to ((path to desktop folder) & "compilation:la_compilation.pdf") as string
        set adeplacer to quoted form of POSIX path of adeplacer
        set dossierfini to chemin as string
        set dossierfini to quoted form of POSIX path of dossierfini
        if exists fichiercompil then
            do shell script "mv " & adeplacer & " " & dossierfini
        end if
        set aeffacer to (path to desktop folder) & "compilation" as string
        set aeffacer to quoted form of POSIX path of aeffacer
        do shell script "rm -Rf " & aeffacer
       
        set chemin to chemin as alias
        set les_dossiers to folders of chemin
        repeat with chaque_dossier in les_dossiers
            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
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Je continue de chercher une solution plus rapide...
Je te tiens au courant.
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Une autre solution...

Faire un processus automator suivant la copie écran ci-dessous. qui devra se nommer "combin.workflow" et devra être ouvert lors du lancement du script applescript


Capture d’écran 2021-08-14 à 19.49.36.png


Ensuite un applescript.

Bloc de code:
-- regroupe les fichiers pdf du dossier dans un PDF

tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les dossiers des PDF"
    
    my inspecter(chemin) --appel routine avec transmission des variables
end tell




on inspecter(un_dossier)
    -- récupération du nom du dossier
    set ledossier to un_dossier as string
    set ledossier to text 1 thru -2 of ledossier
    set AppleScript's text item delimiters to {":"}
    set ddd to get last text item of ledossier
    
    if ddd = "compilation" then
    else
        tell application "Automator"
            set w to workflow "Combin.workflow" -- pour appel du script automator
            set value of variable "Dossier" of w to ((ledossier as text) as alias) -- Transmet variable dossier
            execute w -- appelle automator
        end tell
    end if
    
    tell application "Finder"
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        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

Le processus Automator étant ouvert, lancer l'applescript qui demande de choisir le dossier contenant les dossiers contenant les PDF.
Il s'exécute et crée un dossier du nom de compilation contenant le fichier PDF résultant, dans chaque dossier, à la fin il affiche un message de fin
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Bonjour,
Il faudra ensuite, faire un petit script de déplacement et renommage des fichiers obtenus, en fonction de ce que tu veux obtenir au final.
 

ordonez09

Membre enregistré
15 Mai 2019
9
0
J'ai un message d'erreur pour la 2nde méthode: combin.workflow introuvable alors que j'ai bien Automator d'ouvert et tout renseigné. Pour la 1ere méthode, il me dit qu'il n'a pas les droits pour enregistrer sous le desktop (alors qu'il créé le dossier "compilation")
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Je te mets les 2 fichiers de la 2ieme méthode (automator et applescript) en téléchargement dans un zip à cette adresse.

Dis-moi si là ça fonctionne !
 

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
J'y pense !
Il faut autoriser Automator, si ce n'est pas déjà fait.
Dans préférences système--> sécurité et confidentialité--> onglet Confidentialité--Accessibilité

Edit : je viens de vérifier, si c'est nécessaire, une fenêtre s'ouvre pour te demande d'autoriser.
 
Dernière édition:

zeltron54

Membre expert
Club MacG
29 Mars 2008
2 349
369
Lorraine
Bon maintenant reste à savoir où tu veux mettre les fichiers de la compilation.

je te propose de te faire un script qui renomme les fichiers des compilations avec le nom du dossier de leur origine. Puis les déplace dans un nouveau dossier à créer.
le script te demanderai de sélectionner le dossier contenant les compilations, puis de choisir le dossier de destination, puis ferai le boulot…
dis moi si cela te va ?

je te met le script qui renomme et copie le fichier dans le dossier destination
Si tu veux un résultat différent fais signe.

Bloc de code:
-- renomme et copie les pdf créés
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les dossiers des PDF"
    set chemindest to choose folder with prompt "Sélectionnez le dossier de destination"
    
    my inspecter(chemin, chemindest) --appel routine avec transmission des variables
end tell

on inspecter(un_dossier, chemindest)
    -- récupération du nom du dossier
    tell application "Finder"
        set ledossier to un_dossier as string
        set ledossiercourt to text 1 thru -2 of ledossier
        set AppleScript's text item delimiters to {":"}
        set ddd to get last text item of ledossiercourt
        
        if ddd = "compilation" then
            set ledossier to ledossier as alias
            set lefichier to files of ledossier
            set aa to lefichier as string
            if aa = "" then
            else --renomme
                set nomfichier to text item -3 of aa
                set lefichier to lefichier as alias
                set name of lefichier to nomfichier & ".pdf"
                --copie dans destination
                duplicate lefichier to chemindest
                
            end if
        end if
    end tell
    tell application "Finder"
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier, chemindest)
        end repeat
    end tell
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:

ordonez09

Membre enregistré
15 Mai 2019
9
0
On peut vraiment tout faire avec un script… ;) mais ça me suffit amplement, c’est déjà énorme d’avoir pu les assembler automatiquement, c’est ce que je cherchais à faire. Pour info: pour 250 dossiers ça a pris une bonne demi-heure. Merci encore!