InDesign CS4, bug d’assemblage

IDCS4 Elle commence à avoir un peu de bouteille cette Creative Suite 4, mais n’est toujours pas exempte de bugs.

J’ai toujours des problèmes pour sélectionner les différentes boxes des PDF lors de l’import, il faut passer par un ré-enregistrement sous Acrobat afin d’en retrouver trace dans les options lors de l’import du fichier PDF.

Dernier petit bug décelé lors de la réalisation d’une gravure en provenance de l’extérieur… les liens manquants ! Sur une soixantaine de liens utilisés dans la mise en page, plus d’une douzaine absents du dossier links réalisé à l’aide de la fonction d’assemblage, la fonction destinée à ne pas avoir de liens manquants lors du transfert d’un dossier. Un comble !

En réalisant divers essais sur ma machine de travail, je n’arrive pas à reproduire l’erreur. Pourtant c’est le 3e dossier consécutif que j’ai avec des liens manquants.
Après m’être assuré du process suivi en externe pour préparer cela, j’en déduis que c’est bien InDesign qui bug à l’assemblage, aller zou! on file googler!

Et là, jackpot ! Premier résultat sur un sujet des forums Adobe, ce n’est pas un cas isolé !
Ok, on lit, il va bien y avoir une solution autre que d’écrire un petit script d’assemblage (quoique, ça fait longtemps que je n’avais rien écrit… ;) ).
Premières constations, Adobe a publier une mise à jour 6.0.2 qui corrigerait le bug… ah ben non, 3 réponses plus bas, il y a toujours des constats d’erreur d’assemblage ! Arg !
Bon, on continue de lire (mais par la fin cette fois), et là c’est gagné (comme dirait notre amie Dora), la mise à jour 6.0.3 semble bien avoir éliminé ce problème.

Après vérification, suis-je à jour: oui, je mets toujours mes applications à jour, ma seule mauvaise surprise ayant été la mise à jour Java sur Mac OS X.5 qui m’a plombé toutes les préférences des applications, sinon que des bonnes surprises.
Par contre, en externe, c’était toujours la version du DVD qui était utilisée… oups ! Après mise à jour, l’assemblage s’est déroulé correctement.

Morale: toujours penser à mettre à jour ses logiciels de travail !
Enfin lorsque c’est possible, ça me fait penser à une histoire de Silverlight….

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.

Indesign et ses différents noirs

backinblackPour des habitués d’XPress, la gestion de la nuance noir peut être un peu déconcertante sous InDesign. Il n’est pas rare de trouver des documents avec plusieurs nuances utilisées pour un noir. Entre les nuances importées avec un texte, celle d’un document XPress ourvert dans InDesign, et celles créées pour une occasion particulière…

J’ai commencé par citer XPress, car à cette vieille époque il y existait une palette obscure pour le graphiste, utile pour le maquettiste, formidable pour le flasheur: les infos de défonces ! La palette venait compléter la gestion des défonces par nuances dans les options de couleurs, et oui, il y était possible de faire surimprimer du jaune à un noir par défaut ! Totalement inutile cité ainsi, mais tellement pratique dans certains cas.
Mais surtout, avec ces options qui par défaut se géraient assez bien, il faut le dire, il était possible de créer différents noirs, le logiciel décidant ou non de surimprimer les nuances. Or dans InDesign, il semblerait que par défaut tout défonce, à part la nuance [Noir] ! Je dis « semblerait« , à part les options d’objets permettant de surimprimer un objet, je ne rien trouvé d’aussi détaillé avec des réglagles fins comme une défonce positive ou négative…

Une petit illustration valant plus que tout au monde (je me suis servi sur Flickr pour le fond, je vous laisse deviner les mots clés utilisés pour trouver cela):

Noir Indesign

La première ligne ne laissent pas deviner qu’un problème de défonce peut apparaître au flashage, tant que nous restons sur un support de type écran ou sortie imprimante, le défaut ne sera pas visible. Par contre lorsque l’on rentre dans les couches, on voit que les nuances de noir autre que [Noir] défoncent le fond, ce qui peut être la cause d’une impression offset de qualité inférieure.
En effet, le moindre petit décalage du noir lors de l’impression fera apparaître un léger filet blanc suite à ce décalage.

Oui, il est toujours possible de se dire que ce n’est pas le problème du maquettiste de s’occupper de ce type de problème, mais n’est-ce pas plus rassurant et gratifiant de se dire d’avoir remis un document propre à l’impression et qu’il n’y aura pas de doute sur le rendu ?

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);