Donnez vie à vos documents numériques !
 

Script pour ajouter une image sur les pages impaires puis dupliquer pages paires

abracadabraPDF Forums PDF – Général Script pour ajouter une image sur les pages impaires puis dupliquer pages paires

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #46073
    dodo
    Participant

    Bonjour,
    Je souhaiterai automatiser une tâche qui me prend régulièrement pas mal de temps, mais je ne sais pas si c’est possible.
    Je dispose d’un fichier PDF d’origine composé (généralement) de 172 pages (ce nombre peut varier, mais toujours multiple de 2). J’adapte ce fichier à mes besoins en ajoutant une image (toujours la même) sur chaque page impaire de ce fichier (toujours à la même position).Puis je souhaite imprimer chaque page impaire 1 fois et chaque page paire 2 fois. Pour ce faire, je duplique manuellement chaque page paire avant de lancer mon impression car les paramètres d’impression ne permettent pas de spécifier un grand nombre de pages à imprimer (ex : 1-2-2-3-4-4-5-6-6-7-8-8-9-10-10-………).
    Actuellement je sauvegarde mes modifications dans le fichier d’origine, mais si je pouvais créer un nouveau fichier contenant mes modifications et ainsi conserver mon fichier original intact sans passer par la copie manuelle de celui-ci, j’en serai ravi.

    J’ai trouvé des exemples de scripts permettant d’ajouter une page “template”, mais pas de “simplement” dupliquer une page. Concernant l’ajout d’une image, je n’ai absolument rien trouvé (peut-être que je n’utilise pas les bons mots-clés).
    Pourriez-vous me dire s’il semble envisageable d’écrire un script en ce sens ou si les limites d’Acrobat ne me permettront pas de gagner du temps ?Bien entendu, si ça vous semble concevable, je suis preneur de tout lien qui pourrait m’aiguiller.
    Merci d’avance

    PS : mes excuses si ces sujets ont déjà été traités dans un autre sujet du forum, mais je ne les ai pas trouvés (en tout cas, rien qui ne m’ait aidé)

Affichage de 25 réponses de 1 à 25 (sur un total de 25)
  • Auteur
    Réponses
  • #65752
    bebarth
    Maître des clés

    bonsoir,Ça me parait réalisable !
    As-tu réellement besoin d’un nouveau fichier final ?
    L’image que tu veux ajouter est un fichier jpeg accessible ?
    @+
    :bonjour:

    #65753
    Merlin
    Maître des clés

    Bonjour.

    Partant du principe que tu utilises Acrobat Pro, utiliser des scripts JavaScript pour faire ça reviendrait à utiliser un canon pour tuer une mouche.  :geek:

    • Pour ajouter une image (ou un PDF ou autre) sur chaque page impaire on peut utiliser la fonction Filigrane (Watermark).
    • Pour n’imprimer que les pages paires ou impaires on peut utiliser la fonction Imprimer.
    • Bien entendu, l’Assistant d’action permet d’automatiser tout ça en quelques clics, y compris l’enregistrement, ou non, du document modifié.

    Explication en images ci-dessous.
    :Smiley15:

    #65754
    dodo
    Participant

    Bonjour,
    Tout d’abord, mes excuses pour le retard dans ma réponse ; je viens seulement d’avoir un mail m’indiquant une réponse (je pensais que c’était instantané). Merci pour votre réactivité.

    Ensuite, les réponses à vos questions :   
    bebarth :
    Non, je n’ai pas forcément besoin d’un autre fichier contenant les modifications. Si tout se fait sur le fichier d’origine, ça me va déjà très bien.Concernant l’image, je ne comprends pas ce que tu veux dire par “accessible”. L’image est un fichier stocké dans un cloud, car il doit être accessible depuis différents postes de travail.

    Merlin :
    Tout à fait d’accord avec toi, inutile de sortir un canon pour tuer une mouche, mais j’ignorais qu’il était possible d’enregistrer des actions permettant l’ajout de filigrane, qui plus est, uniquement sur les pages impaires. La logique Adobe est donc respectée lol (j’utilise des actions sur Photoshop pour gérer des images en masse). Je vais explorer cette section un peu plus en détails car elle pourrait m’apporter d’autres aides pour certaines tâches dont j’ignorais qu’il était possible de les automatiser.
    Autrement dit : cette solution toute bête fonctionne à merveille et son utilisation est des plus simples.Concernant l’impression, ce n’est pas ce que je veux faire.Je veux imprimer toutes les pages du document, mais les pages paires doivent être imprimées en double et à la suite ; les pages impaires doivent être imprimées en une seule copie. Mon fichier de base comporte donc 172 pages et l’impression me sort 258 feuilles.
    L’ordre d’impression des pages doit donc être :
    1;2;2;3;4;4;5;6;6;7;8;8;9;10;10;11;12;12;13;14;14;15;16;16;17;18;18;19;20;20;21;22;22;23;24;24…..
    N’ayant pas trouvé de possibilité de stipuler la quantité de copies à imprimer pour les pages paires ou impaires, j’avais essayé en inscrivant la série inscrite ci-dessus dans “Pages” (voir copie d’écran ci-dessous), mais il n’est pas possible de spécifier un nombre assez important de pages dans ce champ ; je n’ai plus la limite, mais en tout j’aurai 258 pages inscrites dans ce champ.

    merci à vous 2 pour votre aide

    #65755
    Merlin
    Maître des clés

    Dans ce cas il te faudrait une imprimante avec une trieuse.
    Sinon, intercaler une petite centaine de pages à la main ça prend moins de 2 minutes… Avec un peu d’habitude.  :Smiley15:

    #65756
    dodo
    Participant

    Je fais cette manipulation à la main depuis de très nombreux mois maintenant et c’est justement pour ça que je cherche une solution pour automatiser cette tâche (qui certes ne prend que quelques minutes, mais vu la fréquence à laquelle j’effectue cette manipulation…).
    L’imprimante ne peut être remplacée pour des raisons de coût mais pas que… j’utilise une imprimante thermique qui imprime chaque page sur une étiquette autocollante (rouleau de 260 étiquettes).
    Tu as l’air de très bien t’y connaître en PDF et Acrobat, j’en déduis qu’Acrobat n’intègre pas de solution simple me permettant cette manipulation.Dans ce cas, peut-être qu’un script peut faire l’affaire.Est-il possible de dupliquer une page en spécifiant son emplacement à l’aide d’un script ?
    bebarth : tu semblais penser que ce serait faisable. Aurais-tu une idée sachant que pour le placement des images, la solution de Merlin me convient parfaitement puisqu’elle reste simple et efficace.

    #65757
    bebarth
    Maître des clés

    bonsoir,
    Voici un script pour imprimer 1 fois les pages impaires et 2 fois les pages paires :

    Code:
    for (var i=0; i    this.print({
            bUI:false,
            nStart:i
        });
        // Si la page est paire on imprime une seconde fois
        if ((i+1)%2==0) {
            this.print({
                bUI:false,
                nStart:i
            });
        }
    }

    @+
    :bonjour:

    #65758
    Merlin
    Maître des clés

    Ce script duplique toutes les pages paires d’un document, mais pour une raison que je ne comprend pas il duplique aussi les pages impaires de 11 à 19…
    :doute:  :Euuuh:  :doute:

    Code:
    var doc = this;
    var n2Pages = this.numPages;
    for (var i = n2Pages - 1; i >= 0; i--) {
    if (/d*[13579]/.test(i) == false) continue;
    doc.insertPages({
    cPath: doc.path,
    nStart : i,
    nEnd : i,
    nPage : i
    });
    }
    #65759
    dodo
    Participant

    Bonjour à vous et merci.

    bebarth :
    Je viens de tester ton script. il fonctionne comme voulu, c’est-à-dire que les commandes d’impression sont envoyées dans le bon ordre.Cependant, j’ai un autre souci lié au matériel : comme il s’agit d’une succession d’ordres d’impression, l’impression n’est pas fluide. Le transfert des données est assez rapide, mais l’imprimante thermique initialise la position du rouleau après chaque impression. En lançant un fichier contenant toutes les pages, le rouleau est imprimé sans initialisation entre chaque étiquette et l’impression est donc continue ; la bande se déroule à vitesse constante sans arrêt.Peut-être qu’en fouillant dans les paramètres de l’imprimante il est possible de faire en sorte que cette initialisation de position ne se fasse pas, mais alors je rencontrerai d’autres soucis par la suite lors d’un changement de rouleau ou une reprise sur un rouleau entamé, ce qui semble trop risqué.
    Cette méthode ne permet pas de gain de temps au final puisqu’il faut enrouler les étiquettes au fur et à mesure qu’elles sont imprimées et je dois donc rester à attendre que l’impression se fasse (temps quasi similaire entre cette impression et le temps que je mets à dupliquer manuellement les pages avant impression).

    Merlin :
    Je viens de tester ton script, qui du coup devrait résoudre mon problème de “lenteur” d’impression puisque le document serait directement modifié.Mais, j’obtiens une erreur:
    NotAllowedError: Les paramètres de protection interdisent l’accès à cette propriété ou à cette méthode.
    Doc.insertPages:9:Field Button1:Mouse Up

    J’ai vérifié les propriétés de mon document et il n’y a aucune protection, tout est autorisé avec ce document.
    Malheureusement je n’aurai plus de temps pour continuer mes recherches tout de suite. Je regarderai à nouveau ce soir pour comprendre d’où vient ce problème. Je reviens vers vous dès que j’ai du nouveau.

    #65760
    bebarth
    Maître des clés

    bonjour,

    Ce script duplique toutes les pages paires d’un document, mais pour une raison que je ne comprend pas il duplique aussi les pages impaires de 11 à 19…

    Je viens de faire un essai sur un document de 16 pages et ça fonctionne correctement sur une imprimante laser !
    Concernant la fluidité de l’impression, il faudrait peut-être donc mieux créer un fichier temporaire avec les pages doublées.
    @+
    :bonjour:

    #65761
    bebarth
    Maître des clés

    Soit on créé un nouveau fichier :

    Code:
    var newDoc=app.newDoc();
    for (var i=0; i    newDoc.insertPages( {
            nPage: newDoc.numPages-1,
            cPath: this.path,
            nStart: i
        });
        if ((i+1)%2==0) {
            newDoc.insertPages( {
                nPage: newDoc.numPages-1,
                cPath: this.path,
                nStart: i
            });
        }
    }
    if (newDoc.numPages > 1) newDoc.deletePages(0);
    newDoc.print({bUI:false});
    newDoc.dirty = true;
    newDoc.closeDoc();

    …mais “dirty” n’a pas d’effet sur les nouveaux fichiers, on a donc une boite de dialogue pour sa fermeture, soit on duplique les pages dans le fichier :

    Code:
    for (var i=this.numPages-1; i>0; i–) {
        if ((i-1)%2==0) {
            this.insertPages( {
                nPage: i-1,
                cPath: this.path,
                nStart: i
            });
        }
    }
    this.print({bUI:false});
    this.dirty = true;
    this.closeDoc();

    …mais on ne peut fermer le fichier avant d’avoir terminer l’action !
    A moins qu’il y ait une autre solution !!!
    @+
    :bonjour:

    #65762
    Merlin
    Maître des clés

    Mais, j’obtiens une erreur:
    NotAllowedError: Les paramètres de protection interdisent l’accès à cette propriété ou à cette méthode.
    Doc.insertPages:9:Field Button1:Mouse Up

    Ce script ne peut-être exécuté que dans un environnement privilégié* : en clair il ne peut fonctionner que depuis la Console**, depuis l’Assistant d’action ou depuis un script d’application.
    Sécurité oblige.

    * Voir : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/les-differents-niveaux-dutilisation-des-scripts-javascript/
    ** La Console JavaScript a tous les privilèges : https://www.abracadabrapdf.net/ressources-et-tutos/js-et-formulaires-ressources/console-javascript-d-acrobat/

    #65763
    dodo
    Participant

    Une fois de plus, merci à vous 2.

    Merlin:
    Concernant mon problème de privilège, j’avais bien paramétré les options comme indiqué dans le tutoriel pour l’activation de la console (c’est grâce à ça que j’ai vu le message d’erreur car sans console, il ne se passait rien et je n’avais donc aucun retour sur l’erreur). Je viens de refaire les mêmes manipulations sur un autre PC à l’instant et le script ne génère pas d’erreur bien qu ele résultat ne soit pas correct. Des pages sont bien doublées, mais pas les bonnes ; chez moi j’ai des pages paires et impaires doublées un peu partout dans le document.
    Je vais étudier le fonctionnement de ta fonction pour tenter de la déboguer (je ne connais pas du tout le langage javascript, mais je programme en Visual Basic donc je devrais comprendre avec un peu de temps et de recherches).
    Je testerai de nouveau demain sur le PC récalcitrant en vérifiant les paramètres. il doit bien y avoir une différence entre ces 2 installations.
    bebarth:
    je viens de tester tes 2 derniers scripts et j’obtiens une erreur pour ces 2 scripts. Si je comprends bien il s’agit d’une erreur due à une variable non définie et une due à une erreur de syntaxe. Comme je l’écrivais quelques lignes plus haut, javascript est inconnu pour moi, mais je vais chercher à déboguer tout ça.

    Je reviendrai vers vous afin de vous donner le résultat de mes recherches. Il s’agit sans doute d’un truc tout bête, mais je voudrai tenter de le trouver, sinon je n’apprendrai rien du tout lol (par faute de temps il me faudra sans doute ce week-end pour y parvenir).
    En tout cas, grâce à vos scripts je vois déjà les fonctions reconnues par Acrobat. A très vite

    #65764
    bebarth
    Maître des clés

    Si je comprends bien il s’agit d’une erreur due à une variable non définie et une due à une erreur de syntaxe.

    Que dit la console ???
    J’ai essayé les 2 scripts sans erreur…
    @+
    :bonjour:

    #65765
    Merlin
    Maître des clés

    Je vais étudier le fonctionnement de ta fonction pour tenter de la déboguer

    À la base c’est un script qui sert à dupliquer toutes les pages dans un document (JavaScript ne peut pas les dupliquer directement mais il peut importer les pages à l’intérieur d’un document, ce qui revient presque au même. D’où l’utilisation de insertPages).

    J’ai juste ajouté cette ligne :
    if (/d*[13579]/.test(i) == false) continue;
    qui est censée éliminer les pages impaires du processus.

    d*[13579] est une requête GREP éprouvée que j’utilise depuis des années pour détecter les chiffres impairs, mais là je sèche…
    :joker:

    #65766
    bebarth
    Maître des clés

    d*[13579] est une requête GREP éprouvée que j’utilise depuis des années pour détecter les chiffres impairs, mais là je sèche…

    Pour mieux comprendre :

    https://www.w3schools.com/jsref/jsref_obj_regexp.asp
    En gros on fait un teste sur une recherche de chiffre 1, 3, 5, 7 et 9. Si le teste n’est pas réussi c’est que c’est une page paire…
    @+
    :bonjour:

    #65767
    bebarth
    Maître des clés

    bonjour,
    Je viens de réfléchir qu’il faut indique le signe “$” qui signifie “en fin de chaine de caractères” pour que le teste se fasse uniquement sur le dernier chiffre et pour qu’il fonctionne avec des nombres >10 !donc :

    Code:
    var doc = this;
    var n2Pages = this.numPages;
    for (var i = n2Pages – 1; i >= 0; i–) {
    if (/d*[13579]$/.test(i) == false) continue;
    doc.insertPages({
    cPath: doc.path,
    nStart : i,
    nEnd : i,
    nPage : i
    });
    }

    …et ce code fonctionne correctement !
    @+
    :bonjour:

    #65768
    Merlin
    Maître des clés

    Cette regex est déjà censée capter les chiffres impairs > 10, > 100, etc. :
    d = chiffre quelconque
    * = présent zéro ou plusieurs fois
    Mais elle a été prévue pour être utilisée dans un autre contexte (recherche de chiffres impairs sur des pages, donc parmi des milliers de caractères).
    :oh:

    En tout cas, bien vue ton idée de prendre le problème dans l’autre sens, du coup il n’y a plus besoin de d*, le reste de la regex suffit et on peut utiliser :
    if (/[13579]$/.test(i) == false) continue;

    J’ai testé, ça fonctionne.
    :Smiley15:

    #65769
    bebarth
    Maître des clés

    On croit toujours avoir compris les expressions régulières, et c’est compliqué à chaque fois qu’on veut en écrire une…
    C’est pour cela que j’avais utilisé :

    Code:
    if (numeroPage%2==0) {…

    …ou : si le reste du numéro de la page divisé par 2 est égal à 0 (donc le numéro est paire !).
    @+
    :bonjour:

    PS : “On” c’est moi !!!

    #65770
    Merlin
    Maître des clés

    “On” c’est moi !!!

    Non, c’est nous.
      :Smiley03:

    #65771
    Merlin
    Maître des clés

    ou : si le reste du numéro de la page divisé par 2 est égal à 0 (donc le numéro est paire !)

    ???  :Euuuh:
    Je veux bien que tu m’expliques…

    #65772
    bebarth
    Maître des clés

    En JavaScript, le signe % indique le reste d’une division euclidienne (appelée aussi division entière) :
    https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Expressions_et_Op%C3%A9rateurs#Op%C3%A9rateurs_arithm%C3%A9tiques
    Dans une division euclidienne, on a le dividende, le diviseur, le quotient et le reste.
    Ces 4 éléments sont des nombres entiers, donc si le diviseur est 2 et que le reste est 0, le dividende est forcement un nombre paire !
    Donc if (dividende%2==0) signifie si le dividende est un nombre paire.
    @+
    :bonjour:

    #65773
    Merlin
    Maître des clés

    Retour vers le CM1 !
    :Smiley08:

    Bon rafraichissement de mémoire, j’avais oublié le “reste”.
    :bravo:

    #65774
    dodo
    Participant

    Bonjour bebarth et Merlin,

    J’ai enfin eu le temps ce jour de lire les différents tutos fournis et de refaire des essais. J’ai vu qu’entre temps vous aviez trouvé la solution ; j’ai donc directement testé avec ce script et aujourd’hui il fonctionne parfaitement chez moi. Il ne me met plus d’erreur de syntaxe ou de déclaration. C’est tout de même étrange car à priori la seule différence entre les scripts c’est le dollar.
    J’avais peut-être fait une erreur lors de ma première tentative. Je testerai demain sur l’autre PC, mais il n’y a pas de raison que ça ne fonctionne pas.
    Je n’aurai pas appris à écrire en javascript, mais j’ai au moins découvert pas mal de choses, dont l’assistant d’actions !!! J’ai déjà créé d’autres actions pour de petits trucs que je faisais régulièrement sur d’autres documents.

    Ce sujet est donc résolu et je vous en remercie  :bravo: :bravo: :bravo:

    #65775
    Merlin
    Maître des clés

    :bonjour:

    #65776
    dodo
    Participant

    Essai effectué sur l’autre PC avec succès. Tout est donc parfait. Merci !

Affichage de 25 réponses de 1 à 25 (sur un total de 25)
  • Vous devez être connecté pour répondre à ce sujet.