InDesign Story

Pour les lecteurs du billets concernant Tiddlywiki, c’est peut être du réchaffé si ces derniers ont poussé à lire le TW de l’article, sinon tant pis, et de toutes façons il n’y a pas de lien direct, ici il s’agit de modifier la langue utilisée par le logiciel.

Sous QuarkXPress, j’ai longtemps réceptionné des documents en provenance d’outre-Rhin qu’il nous fallait traduire en français. Un des problèmes était que de base le logiciel utilisait la langue d’origine du document comme référence de dictionnaire de césure. Bien que la méthode de mise à jour des styles eut été une solution propre, elle n’a été que vaguement envisagé, les styles étaient bien utilisés, mais variaient d’une parution à l’autre, voir même document à l’autre. Il fallait donc plus radical et efficace.
Facile ! A l’aide d’une bibliothèque on glisse un petit bloc texte type dans la maquette. Ce bloc texte ayant, bien entendu, épuré de tout style afin de ne pas encombrer le document de travail, et bien sur, la langue du paragraphe contenu réglée sur celle de destination (ici français pour ceux qui ne suivent déjà plus!). Il n’y a plus qu’à effectuer un Enregistrer sous et activer la langue unique pour modifier tout le document dans la langue désirée.

Sous InDesign, j’ai bien cherché, mais je n’ai rien trouvé! Soit! Une occasion de plus jouer avec des scripts. En plus cette fois, les fichiers proviennent d’outre-Manche, c’est pas gagné pour leur faire comprendre que le texte français qu’ils maquettent doit utiliser des règles de césures issues d’un dictionnaire français! Ici pas d’option autre que mot par mot, paragraphe par paragraphe, style par style ou même bloc par bloc.

J’ai profité de ce petit contre-temps pour aller une fois de plus du côté de chez Swann, puis du Javascript pour approfondir encore un peu mes expériences.
L’option choisie est de laisser le choix du champ d’application des modification:

  • tous les styles de paragraphes
  • tous les styles de caractères
  • tous les paragraphes

Ce découpage permettant de voir un peu les différents côtés identiques (sic!) de l’application d’une langue dans InDesign via des scripts. L’ordre me parait également logique dans un esprit de nettoyage logique du texte les styles avant les paragraphes afin de préserver les liens de style au maximum en cas de modification à venir.

Première étape, une fenêtre dialogue permettant le choix du champ d’application, si un document est ouvert:

function main(){
  if(app.documents.length != 0){
      var myDialog = app.dialogs.add({name:"Conversion langue FRANCAIS"});
      with(myDialog.dialogColumns.add()){
        staticTexts.add({staticLabel:"Appliquer aux éléments:"});
        var sP = checkboxControls.add({staticLabel:"Style de paragraphe", checkedState:true});
        var sC = checkboxControls.add({staticLabel:"Style de caractères", checkedState:true});
        var aP = checkboxControls.add({staticLabel:"Tous les paragraphes", checkedState:true});
      }

Seconde étape, on effectue les changements sur les items désirés en se basant sur l’état des checkbox précédents:

if(myDialog.show() == true){
        var sP, sC, aP;
        if(sP.checkedState == true){
          for(myCounter = 1; myCounter < app.activeDocument.paragraphStyles.length; myCounter++){
          app.activeDocument.paragraphStyles.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
        }}
        if(sC.checkedState == true){
          for(myCounter = 1; myCounter < app.activeDocument.characterStyles.length; myCounter++){
          app.activeDocument.characterStyles.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
        }}
        if(aP.checkedState == true){
          for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
          app.activeDocument.stories.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
      }}

Et pour finir, on n’oublie pas de détruire la fenêtre de dialogue, sinon avec le temps InDesign va un peu craquer!

myDialog.destroy();

Au final, le script complet permettant de convertir un document en français est le suivant:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function main(){
  if(app.documents.length != 0){
      var myDialog = app.dialogs.add({name:"Conversion langue FRANCAIS"});
      with(myDialog.dialogColumns.add()){
        staticTexts.add({staticLabel:"Appliquer aux éléments:"});
        var sP = checkboxControls.add({staticLabel:"Style de paragraphe", checkedState:true});
        var sC = checkboxControls.add({staticLabel:"Style de caractères", checkedState:true});
        var aP = checkboxControls.add({staticLabel:"Tous les paragraphes", checkedState:true});
      }
      if(myDialog.show() == true){
        var sP, sC, aP;
        if(sP.checkedState == true){
          for(myCounter = 1; myCounter < app.activeDocument.paragraphStyles.length; myCounter++){
          app.activeDocument.paragraphStyles.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
        }}
        if(sC.checkedState == true){
          for(myCounter = 1; myCounter < app.activeDocument.characterStyles.length; myCounter++){
          app.activeDocument.characterStyles.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
        }}
        if(aP.checkedState == true){
          for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
          app.activeDocument.stories.item(myCounter).appliedLanguage = app.languagesWithVendors.item("French");
      }}
    }
  myDialog.destroy();
  }
  else{
    alert("Merci d'ouvrir un document.");
  }
}

A venir, quand j’en trouverais la motivation et/ou l’utilisation, un script plus générique allant puiser la liste des langues disponibles, et proposer un changement dans la langue du logiciel après récupérer cette dernière.

TiddlyWiki, le bloc-note utile

TiddlyWiki, c’est un site (?), un bloc-note (?), une application (?), un OVNI (?), en fait c’est un peu tout cela à la fois de mon point de vue.

Je suis tombé sur ce projet un peu par hasard, j’étais à la recherche d’un CMS permettant le partage d’information dans le cadre professionnel avec des intervenants extérieurs. J’en suis devenu fan lorsque j’ai vu la simplicité et légèreté (en poids, 342 Ko) du système pour des échanges mails/web.

TiddlyWiki m’a séduit par le simple fait que tout est contenu dans un unique fichier HTML (à part, de base, les liens/médias), ce qui permet de déplacer et mettre à jour le contenu assez rapidement, et sans risque d’oubli d’un morceau quelque part (tout le monde n’est pas organisé). Et cette organisation présente en plus une facilité d’indexation pour les recherches de contenu dans le bloc-note.

Il faut ajouter à cela quelques animations lors d’ouvertures des billets assez sympatique (il m’en faut peu), un système de plugins (mes 2 sources de plugins sont TiddlyVault et TiddlyTools), tout cela nous fait un bloc-note à usage personnel bien pratique, mais également un moyen de distribuer du contenu avec une mise en forme et une interface d’utilisation bien pratique !

En pratique ça donne cela en visualisation en ligne (qui ne permet pas l’édition du contenu): pao’Help, ça porte encore une fois sur la PAO (désolé :) ). Il existe même un système de permalien, ce qui permet de pointer directement sur l’article voulu, lorsqu’on utilise ce wiki pour un partage de connaissances ou informations, par exemple pour les différences de noir InDesign (qui n’est pas l’article déjà paru ici, mais de contenu semblable).

InDesign, nettoyage des couleurs

Encore un nouveau script à base de Javascript et d’InDesign… mais non, je n’y suis pas accro ;)

Une grande partie de mon temps est occupé par la conversion des couleurs d’accompagnement d’un document InDesign et le nettoyage du document qui va avec: suppression de couleurs en double, et parce que je suis un peu maniaque sur la façon d’organiser son travail nommage des couleurs selon leur composition.
Pour le moment, j’avais 2 Applescripts qui faisaient bien leur boulot, mais qui dit 2 scripts, dit forcément 2 lancement! CQFD. Alors oui, il était possible de les fusionner, mais c’est tout de même plus polyvalent de revoir son pannel de scripts pour les rendre encore plus pratiques et multi-plateforme.

Le script se divise en plusieurs segments:

1e partie: le test de version d’application

#target indesign
var IDvers = parseInt(app.version);

on ne récupére que la partie entière de la version de l’application

switch(IDvers) {
	case 4 :
		var mSwatches = app.activeDocument.colors;
		for (x = 1; x &lt;= 4; x++){updateColors(mSwatches);}
		break;
	case 5 :
		var mSwatches = app.activeDocument.swatches;
		updateColors(mSwatches);
		break;
}

Un petit switch permettant de s’occuper des méthodes selon la version.
A noter que pour une raison inconnue le script doit être éxécuter plusieurs fois sous InDesign CS2…

2e partie: le test des Pantone

if (mSwatches[i].name.substr (0, 7).toUpperCase() != "PANTONE") {
  try {

On évite de traiter les couleurs Pantone en éliminant ces nuances via leur noms. On lance ensuite un try / catch pour éviter les erreurs de traitement lorsqu’on arrive sur les couleurs protégées comme celle de repérage ou de [Papier].

3e partie: le changement de mode et nom

mSwatches[i].model = 1886548851; // = Process
mSwatches[i].space = 1129142603; // = CMJN
with (mSwatches[i]){
  mC = Math.round(colorValue[0]);
  mM = Math.round(colorValue[1]);
  mY = Math.round(colorValue[2]);
  mK = Math.round(colorValue[3]);
}

on change le modèle de couleur, ainsi que l’espace colorimétrique, puis on récupérer la valeur entière de la composante pour préparer le renommage de la nuance.

4e partie: le renommage et la fusion

try {
  mSwatches[i].name = myName;  }
catch(err){
  mSwatches.item(myName).merge(mSwatches[i]);  }
}

dans une boucle try / catch, on tente de renommer la nuance, en cas d’erreur, la couleur existe, étant un doublon on la fusionne avec l’existante.

Conclusion: le script complet

#target indesign
var IDvers = parseInt(app.version);  // version InDesign CSx
 
switch(IDvers) {
	case 4 : 	// CS2
		var mSwatches = app.activeDocument.colors;
		// Hack pour passer plusieurs la méthode
		for (x = 1; x <= 4; x++){updateColors(mSwatches);}
		break;
	default :		// CS3
		var mSwatches = app.activeDocument.swatches;
		updateColors(mSwatches);
		break;
	/*default : 	// Ni CS2 ni CS3, avertissement
		alert('Script testé uniquement avec CS2 & CS3');*/
}
 
alert('Fin du traitement');
 
function updateColors(mSwatches) {
	for (i = mSwatches.length-1; i >= 0; i--){
		// si la nuance se nomme "Pantone xxxx" on ne fait rien
		if (mSwatches[i].name.substr (0, 7).toUpperCase() != "PANTONE") {
			try {
				mSwatches[i].model = 1886548851; // 1936748404 = SPOT | 1886548851 = Process | 1919248243 = repérage
				mSwatches[i].space = 1129142603; // 1129142603 = CMJN | 1666336578 = RVB
				with (mSwatches[i]){ // récupération des composantes CMJN
					mC = Math.round(colorValue[0]);
					mM = Math.round(colorValue[1]);
					mY = Math.round(colorValue[2]);
					mK = Math.round(colorValue[3]);
					}
				var myName = "C=" + mC + " M=" + mM + " J=" + mY + " N=" + mK;
				try {
					// renommage de la nuance selon sa composition
					mSwatches[i].name = myName;
					}
				catch(err){
					// fusion de la nuance en cours avec l'existante de même composition
					mSwatches.item(myName).merge(mSwatches[i]);
					}
				}
		catch (e) {}
		}
	}
}

InDesign, mise à jour des liens

Mettre à jour les liens d’un document InDesign peut être simple, du moins plus que si la manipulation était à faire sous QuarkXPress. En effet, l’option permettant de remplacer le lien sélectionné garantis la préservation des attributions de l’image, comme l’échelle, le décalage ou l’orientation.

Il suffit juste de répéter la manipulation pour chacun des liens du document… cool !!!

C’est là que l’automatisme intervient, ben oui, si pour un document d’une ou deux pages cela semble rapide, pour un 16 pages et ses 80 liens, c’est déjà une autre affaire, à vue de nez 3 à 5 secondes par lien ce qui nous donne un peu plus de 5 min de traitement si on admet que l’opérateur est rapide et use le clavier pour gagner du temps ;)

Le script proposé utilise le Javascript Adobe (quelques fonctions supplémentaires et dédiées aux produits Adobe), et surtout ne demande même pas une minute de traitement pour ces 80 liens, oui oui j’ai bien dis 1 minute (notée avec un chiffre pour être plus clair) !!!

C’est un premier jet, il ne remplace que des liens ayant pour extension .tiff par des liens de même nom avec l’extension .eps, c’est la raison de l’écriture de ce script. N’ayant pas les acquis actuellement pour proposer une boîte de dialogue permettant de configurer le script au lancement, il faudra remplacer les textes .tiff et « .eps » dans le script pour changer les conditions. Promis, bientot une mise à jour ;)

#target "InDesign"
var z = 0; // compteur de mise à jour
var extS = prompt("Quelle est l'extension de fichier recherchée (sans le point)","tiff","Extension recherchée");
var extR = prompt("Quelle est l'extension de fichier de remplacement (sans le point)","eps","Extension remplacée");
var myRegex = new RegExp('\.' + extS + '$', 'i'); // construction de la RegExp
var myImages = app.activeDocument.allGraphics; // liste des images
for (i = myImages.length-1; i >= 0 ; i--) {  // boucle 
	var myImage = myImages[i].itemLink;
	var myNewNamePath = myImage.filePath;
	var myNewName = myNewNamePath.replace(myRegex , '.' + extR)
	var myNewLink =  new File (myNewName);
	if (myNewLink.exists) { // si remplacement & lien existant alors
			myImage.relink (myNewLink);
			myImage.update();
			z = z + 1; // incrémentation du compteur
		}
}
alert("Mise à jour des images" + "rMise à jour effectuée sur " + z);

Acrobat, PDF & recadrage

Il y avait bien la méthode Applescript (bah oui sous Mac OSX), mais j’estime en avoir fait le tour, il me fallait un nouveau challenge, et j’ai trouvé mon nouvel objectif: le Javascript !

Après avoir compris (ou du moins fait comme si) les méthodes d’accès aux éléments du documents PDF, il suffit de lire, sauvegarder et appliquer ce que l’on a trouvé! Comme quoi, c’est facile l’approche automatisme même dans le monde de la PAO traditionnelle ;)

Aller, envoyez le bouzin :

//FONCTION LOOP
function MyResizeLoop()
{
	var CountOfPages = this.numPages - 1;
 
	for (var x = 0; x <= CountOfPages; x++)
		{
		var mediaBox = this.getPageBox("Crop",this.pageNum = x);
		var cropBox = this.getPageBox("Trim",this.pageNum = x);
		var pBox = [];
			pBox[0] = mediaBox[0];
			pBox[1] = mediaBox[1];
			pBox[2] = mediaBox[2];
			pBox[3] = mediaBox[3];
 
		if(x/2 == Math.round(x/2)) // paire
			{pBox[0] = cropBox[0];}
		else
			{pBox[2] = cropBox[2];} // impaire
		this.setPageBoxes("Crop", x, x, pBox);
		}
	this.layout = "TwoPageRight";
	this.pageNum = 0;
}

C’est bien pratique tout ça, mais comment l’utiliser sous Acrobat? Le plus simple est, selon moi, l’ajout de bouton sur le barre personnalisée d’Acrobat.

app.addToolButton({ cName: "mBT", cExec: "MyResizeLoop()", cTooltext: "Rogne les marges intérieures des pages"});

Ne reste plus qu’à enregistrer tout cela dans un fichier Mescripts.js (par exemple) et l’ajouter à Acrobat.