abracadabraPDF › Forums › PDF – Général › Script pour ajouter une image sur les pages impaires puis dupliquer pages paires
- Ce sujet est vide.
-
CréateurSujet
-
2 juin 2019 à 12:09 #46073dodoParticipant
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’avancePS : 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é)
-
CréateurSujet
-
AuteurRéponses
-
2 juin 2019 à 19:27 #65752bebarthMaî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:3 juin 2019 à 07:46 #65753MerlinMaître des clésBonjour.
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:4 juin 2019 à 15:56 #65754dodoParticipantBonjour,
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 aide4 juin 2019 à 17:24 #65755MerlinMaître des clésDans 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:4 juin 2019 à 18:14 #65756dodoParticipantJe 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.4 juin 2019 à 20:16 #65757bebarthMaître des clésbonsoir,
Voici un script pour imprimer 1 fois les pages impaires et 2 fois les pages paires :Code:for (var i=0; ithis.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:5 juin 2019 à 08:06 #65758MerlinMaître des clésCe 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
});
}
5 juin 2019 à 08:37 #65759dodoParticipantBonjour à 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.5 juin 2019 à 08:40 #65760bebarthMaître des clésbonjour,
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:5 juin 2019 à 09:52 #65761bebarthMaître des clésSoit on créé un nouveau fichier :
Code:var newDoc=app.newDoc();
for (var i=0; inewDoc.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:5 juin 2019 à 10:15 #65762MerlinMaître des clésMais, 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 UpCe 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/5 juin 2019 à 16:42 #65763dodoParticipantUne 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 vite5 juin 2019 à 17:01 #65764bebarthMaître des clésSi 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:5 juin 2019 à 17:05 #65765MerlinMaître des clésJe 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:5 juin 2019 à 18:58 #65766bebarthMaître des clésd*[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:6 juin 2019 à 08:13 #65767bebarthMaître des clésbonjour,
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:6 juin 2019 à 08:24 #65768MerlinMaître des clésCette 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:6 juin 2019 à 09:44 #65769bebarthMaître des clésOn 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 !!!
6 juin 2019 à 12:14 #65770MerlinMaître des clés“On” c’est moi !!!
Non, c’est nous.
:Smiley03:6 juin 2019 à 12:19 #65771MerlinMaître des clésou : 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…6 juin 2019 à 13:23 #65772bebarthMaître des clésEn 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:6 juin 2019 à 16:47 #65773MerlinMaître des clésRetour vers le CM1 !
:Smiley08:Bon rafraichissement de mémoire, j’avais oublié le “reste”.
:bravo:10 juin 2019 à 13:19 #65774dodoParticipantBonjour 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:
11 juin 2019 à 08:32 #65775MerlinMaître des clés:bonjour:
11 juin 2019 à 12:00 #65776dodoParticipantEssai effectué sur l’autre PC avec succès. Tout est donc parfait. Merci !
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.