Allgemein Automatisierung InDesign Javascript

Verknüpfungen aus InDesign

umbenennen und neu verlinken

Nachdem ich gerade ein InDesign-Dokument bekommen habe, in dem alle Verknüpfungen „komische“ Namen hatten, dachte ich mir so: „Toll wäre doch jetzt, wenn ich direkt – ohne das Programm zu verlassen – die Links umbenennen und direkt neu verknüpfen könnte“. Hmm – geht aber halt nicht.

Aber: Sowas kann man scripten 🙂

InDesign selektiert nun ein Bild in meinem Dokument und öffnet ein kleines Fenster mit dem Dateinamen des ausgewählten Bildes. Dort kann ich einen neuen Namen für meine Verlinkung angeben. Das Script ändert den Namen der Datei und aktualisiert anschließend die Verknüpfung in InDesign.

Den Code dafür gibt es hier (Update vom 14.11.2016: Rahmenkonturen bleiben nun erhalten, die Ebene „nummern“ wird nicht mehr angelegt):

//Verknüpfungen in InDesign umbenennen und neu verlinken
//Autor: Stephan Wissner – stephan@pixelstaub.de
//Stand: 14.11.2016
var myDoc = app.activeDocument;
for (a = 0; a < myDoc.links.length; a++)
{ 
 var theLinks = myDoc.links[a];
 var thePath = File(theLinks.filePath);
 var theImage = theLinks.parent.parent;
 app.selection = theImage;
 var oldStrokeWeight = theImage.strokeWeight;
 var oldStrokeColor = theImage.strokeColor ;
 var oldStrokeStyle = theImage.strokeType;
 theImage.strokeWeight = 20;
 theImage.strokeColor = "C=0 M=100 Y=0 K=0";
 theImage.strokeType = app.activeDocument.strokeStyles[17];
 var theBounds = theImage.geometricBounds;
 var Laenge = theLinks.name.length;
 var suffix = theLinks.name.substr(Laenge-4, Laenge);
 var OhneSuffix = theLinks.name.substr(0, Laenge-4);
 thePath = Folder(thePath.path);
 myName = String(File.encode(theLinks.name));
 var meinDialog = new Window ("dialog", "Dateien neu benennen und vertheLinksn"); //Dialog 
 var BildXvonX = meinDialog.add("statictext", undefined, "Dateiname für \tBild " + a + " von " + (myDoc.links.length-1) + "\tauf Seite " + theImage.parentPage.name); 
 var Edit = meinDialog.add("edittext", undefined, OhneSuffix);
 Edit.characters = 55;
 okbut = meinDialog.add ("button", undefined, "Datei umbenennen und neu vertheLinksn", {name: "OK"}); // Okay-Button
 var Gruppe = meinDialog.add("group");
 var zuueckbut = Gruppe.add ("button", undefined, "< letztes", {name: "weiter"}); // Okay-Button
 var weiterbut = Gruppe.add ("button", undefined, "nächstes >", {name: "weiter"}); // Okay-Button
 meinDialog.add("statictext", undefined, "\r"); 
 var cancelbut = Gruppe.add ("button", undefined, "Alle Abbrechen", {name: "cancel"}); // Okay-Button
 cancelbut.onClick = function(){GoOn = false; meinDialog.close(); a = myDoc.links.length - 1; exit()} 
 okbut.onClick = function(){GoOn = true; meinDialog.close();} //Variable umschalten bei Click auf okay 
 zuueckbut.onClick = function(){a = a-2; GoOn = false; meinDialog.close();} //Variable umschalten bei Click auf okay 
 weiterbut.onClick = function(){GoOn = false; meinDialog.close();} //Variable umschalten bei Click auf okay 
 meinDialog.enabled = true;
 Edit.enabled = true;
 meinDialog.show();
 var ohnePunkte = Edit.text;
 var NameOhnePunkte = ohnePunkte.replace(".", "");
 NameOhnePunkte = NameOhnePunkte.replace(" ", "");
 var myNewName = NameOhnePunkte + suffix;
 var theFile = File(thePath + "/" + myName);
 theImage.strokeWeight = oldStrokeWeight;
 theImage.strokeColor = oldStrokeColor ;
 theImage.strokeType = oldStrokeStyle;
 if (GoOn == true && File(thePath + "/" + myNewName).exists == true){alert ("ACHTUNG: Datei " + myNewName + " existiert bereits!\r \rBitte neuen Namen vergeben!");
 meinDialog.close();
 var GoOn = false;
 a = a-1;
 };
 if (GoOn == true){meinDialog.close();
 var NewFile= File(theFile.rename(myNewName));
 var theNewFile = File(thePath + "/" + myNewName);
 theLinks.relink(theNewFile);
 theLinks.update();
 };
}
Share

13 Kommentare

  1. Hallo, genau das würde ich brauchen! jetzt bin ich nicht soo der Indesign-Scripting-Held, und daher schaff ich es nicht, das Ding zum laufen zu bringen.
    Ich habe:
    – Code in eine jsx-Datei kopiert.
    – in den enstprechenden Ordner von Indesign CC kopiert.

    Leider kommt Fehlermeldung: „Problematischer Text: myDoc“

    wat mach ich falsch?

  2. Hallo Sven,

    ich habe Dir hier mal eine gepackte Version des Scripts als zip hinterlegt (habe die Version gerade nochmal in CC 015 getestet – und da läuft’s). Lass mich gerne nochmal wissen, ob’s geklappt hat.

  3. … alternativ kannst Du Dir den Code nochmal von oben kopieren – da war an einer Stelle ein Vertipper 🙂

  4. Super Sache!

    Noch besser wäre es, die Verknüpfungen und Dateien automatisiert umzubennen… Z.b.
    „Seite_01_Bild_01″…

    Vielen Dank aber auch 😉

  5. Hallo Markus,

    das ist insofern schwierig, als dass Bild1 nicht zwingend das ist, das oben rechts auf der Seite steht (InDesign zählt da anders: In welcher Reihenfolge wurden die Bilder hinzugefügt …).

  6. Tastentipper

    Hallo Pixelstaub,

    ich bin durch Zufall auf dein Script gestoßen und war von dem Gedanken sofort begeistert. Wenn ich dein Script (die Download-Version) anwende, kommt eine Fehlermeldung:

    JavaScript Fehler!
    Fehlernummer: 30477
    Fehlerzeichenfolge: Ungültiger Wert für Einrichtung der Eigenschaft „strokeColor“: Swatch or String erwartet, aber „C=0 M=100 Y=0 K=0“ erhalten.

    Engine: main
    Datei: /Users/benutzername/Library/Preferences/Adobe InDesign/Version 11.0/de_DE/Scripts Panel/Bildumbennung.jsx
    Zeile: 17
    Quelle: theBild.strokeColor = „C=0 M=100 Y=0 K=0“ ;

    Größer kann das Meldungsfenster nicht gezogen werden, darum kann ich dir nicht sagen, ob die Meldung noch weitergeht. Vielleicht kannst du damit ja etwas anfangen.

  7. Hallo Eckart,

    ich vermute, Du kannst die Fehlermeldung „ausschalten“, in dem Du Dir ein Farbfeld anlegst, dass die Bezeichnung »C=0 M=100 Y=0 K=0« (ohne die Anführungszeichen) trägt. Wenn das Script kein entsprechendes Farbfeld im Dokument findet, gibt’s eine Fehlermeldung 🙂
    Alternativ kannst Du die Zeile

    theBild.strokeColor = „C=0 M=100 Y=0 K=0“;

    durch zwei vorangestellte Backslashes auskommentieren (d.h. diese werden bei der Scriptausführung ignoriert).

    Sag gerne nochmal Bescheid, ob’s so funktioniert. Beste Grüße Stephan

  8. Tastentipper

    Zuerst hatte ich keine Möglichkeit etwas „auszuschalten“. Ich hatte lediglich das Script von dir in den entsprechenden Scriptordner gelegt und gestartet.
    Dann habe ich versucht, das Script im „ExtendScript Toolkit“ zu öffnen.
    Hier kam dann tatsächlich die Möglichkeit, die Fehlermeldung auszuschalten.
    Der Bildname konnte danach geändert werden.

    Ich habe dein Script nun wie folgt geändert:
    theBild.strokeColor = „Magenta“

    Dies funktioniert nun wunderbar auch ohne eine eigene Farbe Magenta angelegt zu haben.

    Ich danke dir, für dieses großartige Script. Es ist super. Und ich wusste gar nicht, was man so machen kann.

    Vielen lieben Dank.
    Eckart

  9. Pinkback: Wochenrückblick – Aus’m InDesign Universum – KW 44 2016InDesign-Blog

  10. morgenstund

    Salu Pixelstaub
    besten Dank für das script. Umbennen von Bildern und neuverlinken geht prima.
    In meinem Projekt habe ich Excel-Files importiert und eine Verknüpfung daraus erstellt. Wenn sich etwas an den Zahlen ändert, speichere ich das im Excel und aktualisiere die entsprechende Verknüpfung. Soweit vermutlich bekannt.
    Das Ganze kommt in 3 Sprachen daher. Ich möchte allerdings nicht jedesmal die Zellenstile auf alle Tabellen anwenden müssen, sondern nur einmal in der deutschen Version. Dann kopiere ich das InDesign-File als _fr und jetzt sollte dein script zum Zuge kommen: Umbennen des Excelfiles bzw Neuverlinkung um Excel_fr.
    Beim Testen mit Excel- und Image-Files erhalte ich diese Fehlermeldung:
    Fehlernummer: 330477
    Fehlerzeichenfolge: Ungültiger Wert für Einrichtung der Eigenschaft „selection“. Array of Objects, Objects or NothingEnum enumerator erwartet, aber Document erhalten.
    Engine:main
    Datei: /Application……./verknuepfungen_umbenennen.js
    Zeile: 11
    Quelle: app.selection = theImage;

    Das Excel-File steht in der Verknüpfungsliste an Position 1, dann folgenden die Bilder.
    Gibt es einen Workaround, der die Anpassung der Namen oder Pfade möglich macht für Excel-Files?
    bytheway: die Absatzformate bleiben beim bisherigen Testing/manuellenVerknüpfung-Aktualisieren erhalten, da diese in den Tabellen mit Zellenstilen angewendet werden.

    Grüsslich
    Stefan

  11. morgenstund

    und hier meine Umsetzung:

    var myDoc = app.activeDocument;
    for (a = 0; a < myDoc.links.length; a++) {
    var theLinks = myDoc.links[a];
    var Laenge_xlsx = theLinks.name.length;
    var suffix_xlsx = theLinks.name.substr(Laenge_xlsx – 4, Laenge_xlsx);
    // nur Excelfiles werden neu verlinkt
    if (suffix_xlsx == 'xlsx') {
    var thePath = File(theLinks.filePath);
    var path_FR = '';
    // die deutschen Files liegen in /DE/file.xlsx
    // die franzoesischen Files liegen in /FR/file.xlsx
    // das DE im path wird durch FR ersetzt
    path_FR = thePath_de.replace("FR", "DE");

    var theNewFile = File(path_FR);
    theLinks.relink(theNewFile);
    theLinks.update();
    }
    }

  12. morgenstund

    getestet (CS6) und für gut befunden:

    var myDoc = app.activeDocument;
    for (a = 0; a < myDoc.links.length; a++) {
    var theLinks = myDoc.links[a];
    var Laenge_xlsx = theLinks.name.length;
    var suffix_xlsx = theLinks.name.substr(Laenge_xlsx – 4, Laenge_xlsx);
    // nur Excelfiles werden neu verlinkt
    if (suffix_xlsx == 'xlsx') {
    var thePath = File(theLinks.filePath)+'';
    var path_FR = '';
    // die deutschen Files liegen in /DE/file.xlsx
    // die franzoesischen Files liegen in /FR/file.xlsx
    // das DE im path wird durch FR ersetzt
    path_FR = thePath.replace("DE", "FR");

    var theNewFile = File(path_FR);
    theLinks.relink(theNewFile);
    theLinks.update();
    }
    }

  13. Hi morgenstund,

    prima, freut mich, wenn Dich das Script zur Weiterentwicklung angespornt hat 🙂
    Danke für Deinen Kommentar und gute Grüße

    Stephan

Schreibe einen Kommentar