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 = "Magenta";
 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();
 };
}

24 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

  14. Pinkback: InDesign-Skripte – wer zur Hölle braucht sowas? – PIXELSTAUB/BLOG

  15. brainstorming

    Hi Stephan,

    vielen Dank für dein Script.
    Ich wollte es in CC19 einsetzen, bekomme aber nach 2, 3 Bildern immer eine Fehlermeldung.
    Hast du vllt. auch eine Version für CC19?

    Danke und liebe Grüße
    René

  16. Hi René,

    wie lautet die Fehlermeldung?
    Falls das Script bei Dir unter CC2018 mit dem gleichen Dokument reibungslos funktioniert, kannst Du in Deinem Script mal ganz oben folgendes ergänzen

    app.scriptPreferences.version = 13.0;

    dann sollte es unter CC2019 genauso funktionieren.

    Grüße
    Stephan

  17. brainstorming

    Hi Stephan,

    ich habe die Zeile hinzugefügt.
    Bekomme aber nach wie vor folgenden Fehler, wenn ich beim zweiten Mal „Nächstes“ drücke.
    JavaScript Fehler! Fehlernummer: 21; Fehlerzeichenfolge: null is not an object
    Engine: main
    Datei: Pfad zur .jsx
    Zeile: 26
    Quelle: var BildXvonX = meinDialog.add(„statictext“, undefined, „Dateiname für \tBild “ + a + “ von “ + (myDoc.links.length-1) + „\tauf Seite “ + theImage.parentPage.name);
    Interpreter: CC 2018 (13.0)

    Vielleicht hast du ja noch einen Tipp für mich.
    Danke.

    Liebe Grüße,
    René

  18. Hi René habs gerade nochmal mit CC 2018 getestet (die Version, die nun durch die geänderte Zeile in Deinem Script simuliert wird). Hier funktioniert (solange kein Bild mehrfach im Dokument platziert wurde).

    Ohne das Dokument zu sehen, kann ich da gerade leider nix zu sagen.

    Trotzdem beste Grüße
    Stephan

  19. brainstorming

    Lieber Stephan,

    ich bin auf das Problem gestossen: die Bilder liegen nicht in der Arbeitsfläche, sondern außerhalb.
    Dann taucht dieser Fehler auf.
    Hast du da eine Idee, ob man da was machen kann?
    Vielen Dank.
    Liebe Grüße,
    René

  20. Hallo René,

    etwa in der Mitte des Scripts (bei mir ist das Zeile 24) steht folgendes

    var BildXvonX = meinDialog.add("statictext", undefined, 
    "Dateiname für \tBild " + a + " von " + (myDoc.links.length-1) 
    + "\tauf Seite " + theImage.parentPage.name); 

    der letzte Teil sorgt im Dialog dafür, dass dort beispielsweise Bild 1 von 2 „auf Seite 3“ steht. Da die Montagefläche aber keine Seite darstellt, gibt’s einen Fehler.

    Wenn Du den Code an dieser Stelle abänderst in

    var BildXvonX = meinDialog.add("statictext", 
    undefined, "Dateiname für \tBild " + a + " von " 
    + (myDoc.links.length-1)); 

    sollte der Fehler behoben sein.

    Beste Grüße
    Stephan

  21. brainstorming

    Lieber Stephan,

    vielen Dank für deine große Hilfe! Das ganze funktioniert nun einwandfrei.
    Eine zusätzliche Frage/Anmerkung, passt zwar nicht ganz zu diesem Thema, ist aber Indesign Script: Kann man über ein Script auch nur den sichtbaren Bildausschnitt speichern. Quasi ein Automatismus läuft durch ein Dokument und speichert die Bilder genau so, wie sie im Indesign sichtbar sind.

    Danke schon mal vorab.

    Liebe Grüße
    René

  22. Lieber René,

    ja, das geht auf jeden Fall per Script …

    Liebe Grüße
    Stephan

  23. Hallo Stephan,
    gerade dein Script gefunden und getestet. Sehr hilfreich. Vielen Dank!

    Eine Frage hätte ich, und ich kenne mich leider nicht mit scripten aus:
    Besteht auch die Möglichkeit, die ›Umbenennung und Neuverlinkung‹ nur für ein ausgewähltes Bild zu machen?
    Also angenommen ein Dokument ist schon sauber, es kommen aber 10 neue Bilder hinzu und ich will nicht alle nochmals durchgehen, sondern nur die 10 neuen …

    Über eine Anwort würde ich mich sehr freuen. D a n k e .

  24. Hallo Wolfgang,

    danke Dir – freut mich, wenn’s hilft 🙂 Wenn’s nur um ein einziges ausgewähltes Bild (oder „alle Bilder innerhalb der ausgewählten Bildrahmen“ geht, könnte man das Script relativ einfach anpassen. Schwieriger wäre „alle gerade hinzugefügten Bilder“ (die u.U. auf verschiedenen Seiten liegen), wobei auch das ginge.

    Leider fehlt mir aber gerade die Zeit dafür, dass mal eben anzupassen 🙁

    Beste Grüße
    Stephan

Schreibe einen Kommentar