# Fusion PDF par lots



## ordonez09 (12 Août 2021)

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 (13 Août 2021)

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 (13 Août 2021)

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 .

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.


----------



## ordonez09 (13 Août 2021)

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 (14 Août 2021)

@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.


```
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 (14 Août 2021)

Je continue de chercher une solution plus rapide...
Je te tiens au courant.


----------



## zeltron54 (14 Août 2021)

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








Ensuite un applescript.


```
-- 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 (15 Août 2021)

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 (15 Août 2021)

Whaou!! Merci beaucoup! Je teste ça et je te tiens au courant.


----------



## ordonez09 (15 Août 2021)

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 (15 Août 2021)

Je te mets les 2 fichiers de la 2ieme méthode (automator et applescript) en téléchargement dans un zip à cette adresse.





						Free Transfert
					

Service d'envoi et de partage de fichiers, simple, gratuit et sécurisé destiné aussi bien aux particuliers qu'aux entreprises.




					transfert.free.fr
				




Dis-moi si là ça fonctionne !


----------



## zeltron54 (15 Août 2021)

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.


----------



## ordonez09 (16 Août 2021)

Ca a marché! Merci beaucoup pour ton aide et le temps que tu as pris pour m'aider!


----------



## zeltron54 (16 Août 2021)

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.


```
-- 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
```


----------



## ordonez09 (17 Août 2021)

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!


----------



## ordonez09 (13 Août 2022)

Bonjour,

Je ressors ce topic car j'en ai de nouveau besoin mais malheureusement ça ne fonctionne plus... 
"L'outil ligne de commande a renvoyé l'erreur 127" avec le script et automator renseigné comme indiqué.
Est-ce dû à une mise à jour du système depuis l'année dernière?
Je précise que j'ai autorisé Automator dans les préférences.

Merci de votre aide, encore une fois


----------



## zeltron54 (13 Août 2022)

Bonjour,

Je suis toujours sous sytème Mojave 10.14.6
je viens de tester et chez moi tout fonctionne.

tu procèdes de quelle manière ?
tu es sous quel système ? bien que à priori cela ne devrait rien changer...
As-tu encore les 2 scripts que je t'avais mis en téléchargement (1 applescript et 1 automator)?

Edit: après quelques recherches sur le net, il semblerait que le problème vienne de la mise à jour du système Monterey qui ne supporterait plus le script en "Python" qui était utilisé dans automator ...
Je ne peut pas tester n'ayant pas de mac avec ce système.


----------



## ordonez09 (13 Août 2022)

Bonjour,
Si tu les as toujours je veux bien que tu me les renvoies, je te dirai


----------



## zeltron54 (13 Août 2022)

le lien 





						Free Transfert
					

Service d'envoi et de partage de fichiers, simple, gratuit et sécurisé destiné aussi bien aux particuliers qu'aux entreprises.




					transfert.free.fr


----------



## zeltron54 (13 Août 2022)

Le lien internet qui parle du problème.





						MacOS 12.3 (Monterey) Automator Combine P… - Apple Community
					






					discussions.apple.com


----------



## ordonez09 (13 Août 2022)

Oui c’est bien l’action « combiner pdf » qui plantait. Merci beaucoup je teste ça et j’te tiens au courant


----------



## zeltron54 (13 Août 2022)

Peut-être qu'en installant "Python" dans Monterey cela fonctionnerait.
Si apple ne l'installe plus d'office par défaut, mais que dans automator l'action combiner PDF continue de faire appel à Python, alors une installation devrait résoudre le problème ... A tester !


----------



## ordonez09 (13 Août 2022)

Loupé, même en installant Python ça ne fonctionne pas. En revanche, Automator précise bien au début que l'action "Combiner pdf" peut ne pas fonctionner correctement (puisqu'il a été créé avec une version antérieure)...


----------



## ungars (13 Août 2022)

ordonez09 a dit:


> Loupé, même en installant Python ça ne fonctionne pas. En revanche, Automator précise bien au début que l'action "Combiner pdf" peut ne pas fonctionner correctement (puisqu'il a été créé avec une version antérieure)...


Ah ben refaite "Combiner pdf" alors...


----------



## zeltron54 (13 Août 2022)

Si tu refais le script automator avec les pavés issus du système monterey (si cette action est toujours disponible dans le système)? comme suggéré par @ungars
Sinon reste plus qu'a avoir un système ancien, ou faire le boulot avec "adobe acrobat pro" ou en ligne ...

Suivant le nombre (volume) de fichiers à traiter n'est pas trop important et, si tu es coincé, tu me zip le tout et je te le fait sur mon vieux système "Mojave"


----------



## zeltron54 (13 Août 2022)

Tu peux également essayer le logiciel "PDF sam Basic" gratuit a télécharger là:








						PDF Split And Merge
					

Un logiciel de source gratuite et ouverte pour fusionner, diviser, faire pivoter et extraire des pages des fichiers PDF




					pdfsam.org
				




Il faudra bien sur travailler dossier par dossier ...


----------



## ordonez09 (13 Août 2022)

J'ai essayé en remettant "Combiner pdf" avec Monterey, pareil... 
J'ai plus de 520 dossiers, j'me vois mal me cogner dossier par dossier. Bizarre cette histoire de Python, ou de process toujours dispo mais qui ne fonctionne plus avec une MAJ.
Pas possible de se passer d'Automator? (même si je me doute de la réponse). Sinon oui avec une solution logicielle mais qui sache aller chercher dans chaque dossier, sinon ça reviendrait au même que de le faire manuellement...


----------



## zeltron54 (13 Août 2022)

Tu peux pas t'installer un ancien système ?(si tu as une bécane qui supporte)

sinon comme proposé, tu me zip tes dossiers et je te fais çà !


----------



## ordonez09 (13 Août 2022)

Pas d’autre machine pour installer une ancienne version.
C’est très gentil de proposer mais je ne peux pas diffuser ces documents (confidentiels)…
C’est bien parti pour tout me faire à la main! Si j’avais su j’aurais pas fait la Maj rien que pour ça !!


----------



## zeltron54 (13 Août 2022)

Désolé pour toi ...  
Si je trouve une solution je ne manquerai pas de t'en faire sur ce post !


----------



## ordonez09 (13 Août 2022)

Merci encore pour ton aide! Je cherche aussi de mon côté


----------



## zeltron54 (14 Août 2022)

Bonjour,

As-tu essayé de te servir du script du message #5, qui était très long, pour vérifier si lui fonctionne, fais un essai sur un petit nombre de fichiers


----------



## ordonez09 (14 Août 2022)

Bonjour,
Je l’avais testé mais j’avais un message d’erreur. Je retenterai ce soir et j’te préciserai le message


----------



## zeltron54 (14 Août 2022)

Bonjour,

J'ai continué à chercher ! et je t'ai fait un nouvel applescript à tester...
Il n'utilise pas automator ni python...

Comme d'habitude tu exécutes le script il te demande de choisir le dossier, il combine les pdf par dossier et enregistre le résultat dans chaque dossier avec le nom combine.pdf. A la fin il met un message comme quoi il a terminé.

Un petit impératif, les dossiers ne doivent contenir que des pdf sinon ce dossier est ignoré ...

J'espère qu'il fonctionnera chez toi , chez moi sur Mojave çà fonctionne.

J'attends le résultat de tes essais...


```
use scripting additions
use framework "Foundation"
use framework "Quartz" -- required for PDF stuff
property inFolderPosix : ""
property destPosixPath : ""

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"
        set inFolderPosix to POSIX path of chemin as text
        set destPosixPath to POSIX path of chemin & "Combine.pdf" as text
    end tell
   
   
    its combineFilesIn:inFolderPosix savingTo:destPosixPath
   
    tell application "Finder"
        set chemin to chemin as alias
        set les_dossiers to folders of chemin
        repeat with chaque_dossier in les_dossiers
            set chaque_dossier to chaque_dossier as alias
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on combineFilesIn:inFolderPosix savingTo:destPosixPath
   
    try
        set dirURL to current application's class "NSURL"'s fileURLWithPath:inFolderPosix
        set theURLs to current application's NSFileManager's defaultManager()'s contentsOfDirectoryAtURL:dirURL includingPropertiesForKeys:{} options:(current application's NSDirectoryEnumerationSkipsHiddenFiles) |error|:(missing value)
       
        set theDoc to current application's PDFDocument's alloc()'s initWithURL:(theURLs's firstObject())
       
        set oldDocCount to theDoc's pageCount()
        repeat with i from 1 to ((theURLs's |count|()) - 1)
           
            set newDoc to (current application's PDFDocument's alloc()'s initWithURL:(theURLs's objectAtIndex:i))
            -- loop through, moving pages
            set newDocCount to newDoc's pageCount()
            repeat with i from 1 to newDocCount
               
                set thePDFPage to (newDoc's pageAtIndex:(i - 1)) -- zero-based indexes
               
                (theDoc's insertPage:thePDFPage atIndex:oldDocCount)
                set oldDocCount to oldDocCount + 1
            end repeat
        end repeat
        set outNSURL to current application's class "NSURL"'s fileURLWithPath:destPosixPath
       
        (theDoc's writeToURL:outNSURL)
    end try
end combineFilesIn:savingTo:
```


----------



## ordonez09 (14 Août 2022)

Ohh super! Je tente ce soir et j’te dis.


----------



## ordonez09 (14 Août 2022)

Super ça marche!! 
Ca a l'air long, mais bon, le principal c'est que ça fonctionne! Pas grave si il ignore les dossiers contenant autre chose que du pdf (normalement j'en ai pas j'avais vérifié).
C'est super, j'me le garde au chaud ce script!
Merci beaucoup à toi pour ton temps et ton travail!


----------



## zeltron54 (14 Août 2022)

Content pour toi !


----------



## zeltron54 (14 Août 2022)

Bonsoir,

Vu que cela fonctionne je t'ai ajouté une fonction.

Le script crée un fichier texte "erreur.txt" sur le bureau, ce fichier contient la liste des dossiers qui n'ont pas été traité, soit parce qu'il sont vide soit parce qu'il contienne un fichier pas pdf ou impossible à traiter.

Il y a un dossier non traité par ligne.


```
use scripting additions
use framework "Foundation"
use framework "Quartz" -- required for PDF stuff
property inFolderPosix : ""
property destPosixPath : ""
property doserreur : ""

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"
        set inFolderPosix to POSIX path of chemin as text
        set destPosixPath to POSIX path of chemin & "Combine.pdf" as text
    end tell
    set doserreur to inFolderPosix
    
    its combineFilesIn:inFolderPosix savingTo:destPosixPath
    
    tell application "Finder"
        set chemin to chemin as alias
        set les_dossiers to folders of chemin
        repeat with chaque_dossier in les_dossiers
            set chaque_dossier to chaque_dossier as alias
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on combineFilesIn:inFolderPosix savingTo:destPosixPath
    
    try
        set dirURL to current application's class "NSURL"'s fileURLWithPath:inFolderPosix
        set theURLs to current application's NSFileManager's defaultManager()'s contentsOfDirectoryAtURL:dirURL includingPropertiesForKeys:{} options:(current application's NSDirectoryEnumerationSkipsHiddenFiles) |error|:(missing value)
        
        set theDoc to current application's PDFDocument's alloc()'s initWithURL:(theURLs's firstObject())
        
        set oldDocCount to theDoc's pageCount()
        repeat with i from 1 to ((theURLs's |count|()) - 1)
            
            set newDoc to (current application's PDFDocument's alloc()'s initWithURL:(theURLs's objectAtIndex:i))
            -- loop through, moving pages
            set newDocCount to newDoc's pageCount()
            repeat with i from 1 to newDocCount
                
                set thePDFPage to (newDoc's pageAtIndex:(i - 1)) -- zero-based indexes
                
                (theDoc's insertPage:thePDFPage atIndex:oldDocCount)
                set oldDocCount to oldDocCount + 1
            end repeat
        end repeat
        set outNSURL to current application's class "NSURL"'s fileURLWithPath:destPosixPath
        
        (theDoc's writeToURL:outNSURL)
    on error
        set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
        write "Le dossier : " & doserreur & "     ne sera pas traité !" & return to lelog starting at eof
        close access lelog
    end try
end combineFilesIn:savingTo:
```


----------

