[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Bilder anhand von Liste (CSV) ersetzen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Bilder anhand von Liste (CSV) ersetzen

Steffen Kernstock
Beiträge gesamt: 105

10. Apr 2014, 15:07
Beitrag # 1 von 9
Bewertung:
(2886 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe Scripter,

heute hab ich eine Anforderung, die mich ÜBERfordert (oder ich finde einfach nicht den richtigen Zugang …) und bitte um Eure Hilfe.

System: MacOS 10.6 / ID CS5

Problem:
In einem größeren Werk wurden die Bilder umbenannt UND in einen anderen Unterordner verschoben. Die neuen und alten Bildnamen liegen in einer Liste vor, wobei jeder Datensatz z.B. so aussieht (Unterordner:Dateiname.Ext):

BilderAlt:01234xyz.ai<tab>BilderNeu:56789abc.ai

Beim Öffnen der InDesign-Datei zeigt die Verknüpfungspalette fehlende Bilder an (klar!).

Es gelingt mir nicht, aus den vielzähligen Relink-Scripten etwas zusammenzubasteln, was mir diese Datei einliest, die fehlenden Bilder sucht, und diese durch die neuen ersetzt (d.h. die Bilder sind dieselben, sie heißen nur anders, haben also die gleiche Größe, Position, etc.).

Ich hab mir das so vorgestellt:
- Lies den ersten Datensatz aus der CSV-Datei ein
- suche nach dem (nicht mehr vorhandenen) Bild (links im Datensatz)
- verknüpfe das Bild mit der Datei mit dem neuem Namen (rechts im Datensatz)
- lies den nächsten Datensatz ein ...

Aber vielleicht gibt's das schon und ich bin nur zu blöd zum suchen.

Dank Euch!
Steffen
X

Bilder anhand von Liste (CSV) ersetzen

WernerPerplies
Beiträge gesamt: 2762

10. Apr 2014, 16:02
Beitrag # 2 von 9
Beitrag ID: #526046
Bewertung:
(2864 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich könnte ein (kostenpflichtiges) Skript liefern, das den Job erledigen sollte.

Auf Wunsch kann ich eine Testversion liefern.


als Antwort auf: [#526039]

Bilder anhand von Liste (CSV) ersetzen

Steffen Kernstock
Beiträge gesamt: 105

15. Apr 2014, 10:30
Beitrag # 3 von 9
Beitrag ID: #526169
Bewertung:
(2776 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ohne jetzt eine Grundsatzdiskussion anregen zu wollen - ich bin mit der Problematik "Kosten" als jemand, der selbst häufig an seinem Wissen partizipieren lässt, durchaus bewusst, jedenfalls gehöre ich keineswegs zu denen, die immer nur nehmen ...

Hätte mir vielleicht doch jemand irgendeinen Tipp, wie ich (selbst) weiterkomme?

Wenn sich's dann hinterher rausstellt, dass es mehr Arbeit war als gedacht, kann man mit mir jedenfalls immer reden …

Steffen


als Antwort auf: [#526046]

Bilder anhand von Liste (CSV) ersetzen

WernerPerplies
Beiträge gesamt: 2762

15. Apr 2014, 10:39
Beitrag # 4 von 9
Beitrag ID: #526170
Bewertung:
(2771 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Steffen,

Zitat Ohne jetzt eine Grundsatzdiskussion anregen zu wollen - ich bin mit der Problematik "Kosten" als jemand, der selbst häufig an seinem Wissen partizipieren lässt, durchaus bewusst, jedenfalls gehöre ich keineswegs zu denen, die immer nur nehmen ...


Oh, ich lasse andere auch gerne an meinem Wissen teilhaben.

Aber meine Lösung ist ziemlich aufwändig, und ich mag das Rad nicht neu erfinden.

Probiere meine Lösung doch einfach mal aus, und wenn Du dann feststellst, sie ist Dir zu teuer, oder Ihr Geld nicht wert, ist das ok und vielleicht gibt es dann ja für Dich eine kostenlose Lösung, oder ausreichend Hilfe, um die Lösung selbst zu schreiben.


als Antwort auf: [#526169]

Bilder anhand von Liste (CSV) ersetzen

Martin Fischer
  
Beiträge gesamt: 12783

15. Apr 2014, 11:00
Beitrag # 5 von 9
Beitrag ID: #526173
Bewertung:
(2751 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Steffen,

die Aufgabenstellung ist so kompliziert nicht und Du hast das ja auch bereits skizziert:

Zitat Ich hab mir das so vorgestellt:
- Lies den ersten Datensatz aus der CSV-Datei ein
- suche nach dem (nicht mehr vorhandenen) Bild (links im Datensatz)
- verknüpfe das Bild mit der Datei mit dem neuem Namen (rechts im Datensatz)
- lies den nächsten Datensatz ein ...


Wenn Du skriptest, dann sollte das Auswerten einer CSV-Datei für Dich kein Problem darstellen. Beispiele dafür sollten auch hier in der Skriptwerkstatt zu finden sein.

Ich würde so vorgehen, dass die Namen der Links in ein assoziatives Array eingelesen werden.

Aus den Angaben der CSV-Datei wird dann in einer Schleife geprüft, ob der Wert aus der ersten Spalte als Key des assoziativen Arrays vorkommt.

Ist dies der Fall, wird geprüft, ob am erwarteten Ort (Verzeichnispfad) eine Datei mit dem Namen des Werts aus der zweiten Spalte vorliegt.

Ist dies der Fall, dann wird der alte Link auf die neue Datei (File = Pfad + Dateiname) umgelegt und aktualisiert.

Es ist mit etwas Schreibarbeit und vor allem mit Testarbeit verbunden.
Beides möchte ich mir heute (und den Rest der Woche) ersparen. ;-)

Kommst Du mit der Skizze klar?


als Antwort auf: [#526169]

Bilder anhand von Liste (CSV) ersetzen

Steffen Kernstock
Beiträge gesamt: 105

16. Apr 2014, 14:45
Beitrag # 6 von 9
Beitrag ID: #526259
Bewertung:
(2669 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielen Dank Euch beiden!

Ich habe nun mal den Ehrgeiz es hinzukriegen, deshalb werde ich es die nächsten Tage mal anhand der Skizze probieren und im Erfolgsfall hier einstellen.

Wenn ich's nicht schaffe, werde ich auf Werners freundliches Angebot zurückkommen.

Allen schöne Feiertage - und arbeitet nicht so viel ;-)

Steffen


als Antwort auf: [#526173]
(Dieser Beitrag wurde von Steffen Kernstock am 16. Apr 2014, 14:47 geändert)

Bilder anhand von Liste (CSV) ersetzen

Steffen Kernstock
Beiträge gesamt: 105

24. Apr 2014, 12:04
Beitrag # 7 von 9
Beitrag ID: #526497
Bewertung:
(2561 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe ID-Skripter,

wenn ich mir auch einbilde ziemlich weit gekommen zu sein, es läuft nicht und ich komme selbst mit den üblichen eingestreuten Debug-Alerts nicht mehr weiter. Wahrscheinlich hab ich einen prinzipiellen (Denk-)Fehler eingebaut, oder ich sitz einfach gerade zu nahe dran ...

Vielleicht kann mir jemand weiterhelfen :)

Code
#target InDesign 

var Topverzeichnis = Folder.selectDialog ("Topverzeichnis wählen...");

var CSVmitLinkersetzungen = File.openDialog ("CSV-Datei mit den alten/neuen Dateinamen wählen..."); // Format: AlterName.EXT;NeuerName.EXT
if (CSVmitLinkersetzungen.open("r")) {
var AltNeuVerzeichnis = [];
do {
var AltNeuEintrag = CSVmitLinkersetzungen.readln();
AltNeuVerzeichnis.push(AltNeuEintrag)
} while (CSVmitLinkersetzungen.eof == false);
CSVmitLinkersetzungen.close();
} else {
alert("Die CSV-Datei ist nicht lesbar!");
};

var ZaehlerErsetzt = 0;
var Ordnerverzeichnis = DurchsucheOrdner(Topverzeichnis); // Unterverzeichnisse registrieren

for (var d = app.documents.length-1; d >= 0; d--) // Main: Schleife durch die Dokumente
PruefeVerknuepfungen(app.documents[d]);

alert(ZaehlerErsetzt + " Verknüpfungen aktualisiert");

//----------------------------------------------------------------------------------------
function PruefeVerknuepfungen(DasDokument)
{
for (var LinkNr = DasDokument.links.length-1; LinkNr >= 0; LinkNr--) // Schleife durch die Verknüpfungen
VerknuepfungAendern(DasDokument.links[LinkNr]);
}

//----------------------------------------------------------------------------------------
function VerknuepfungAendern(DieVerknuepfung)
{
if (DieVerknuepfung.status == LinkStatus.linkMissing) // Verknüpfungsstatus "fehlend"
{
var GesuchterName = String(File.encode(DieVerknuepfung.name));
for (var AltNeuNr = 0; AltNeuNr < AltNeuVerzeichnis.length; AltNeuNr++) // Schleife durch die CSV-Daten
{
var AlterNameLaenge = AltNeuVerzeichnis[AltNeuNr].search(";");
var AlterName = AltNeuVerzeichnis[AltNeuNr].substr(0,AlterNameLaenge);
if (AlterName == GesuchterName)
{
var NeuerName = AltNeuVerzeichnis[AltNeuNr].substr(AlterNameLaenge+2); // neuer Name
for (var OrdnerNr = 0; OrdnerNr < Ordnerverzeichnis.length; OrdnerNr++) // Schleife durch die Unterverzeichnisse
{
var NeuerPfad = File(Ordnerverzeichnis[OrdnerNr]+ "/" + NeuerName); // neuer Verknüpfungspfad
try
{
DieVerknuepfung.relink(NeuerPfad); // Verknüpfungsvorgang
DieVerknuepfung.update(); // Aktualisierung der Verknüpfung
ZaehlerErsetzt++; // mitzählen
break;
}
catch(e){}
}
}
}
}
}

//----------------------------------------------------------------------------------------
function DurchsucheOrdner(DasVerzeichnis)
{
var Verzeichnisse = new Array();
Verzeichnisse[0] = DasVerzeichnis;
for (var j = 0; j < Verzeichnisse.length; j++) // Schleife durch die Ordner
{
var DateienImOrdner = Verzeichnisse[j].getFiles();
for (var k = 0; k < DateienImOrdner.length; k++) // Schleife durch den Ordnerinhalt
{
if (DateienImOrdner[k] instanceof Folder)
Verzeichnisse.push(DateienImOrdner[k]);
}
}
return Verzeichnisse;
}


Das Script läuft durch, ohne eine Verknüpfung zu aktualisieren, und meldet das auch so ...

Es müsste nach meinem Dafürhalten an der innersten FOR-Schleife mit der Relink-Anweisung liegen, da die zuvor erfolgten Schritte (Scannen der Ordnerstruktur, Einlesen der CSV-Datei, Finden der fehlenden Links, Namenszuweisungen) eigentlich klappen (soweit ich das mit Alerts abfragen konnte).

Herzliche Grüße
Steffen


als Antwort auf: [#526259]
(Dieser Beitrag wurde von Steffen Kernstock am 24. Apr 2014, 12:19 geändert)

Bilder anhand von Liste (CSV) ersetzen

Kai Rübsamen
Beiträge gesamt: 4684

24. Apr 2014, 15:34
Beitrag # 8 von 9
Beitrag ID: #526511
Bewertung:
(2522 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Steffen,

stellst du auch noch einen Auszug mit 3-4 Zeilen aus der CSV u. viell. ein idml mit 4 Dummy-Bildern zur Verfügung?


als Antwort auf: [#526497]

Bilder anhand von Liste (CSV) ersetzen

Steffen Kernstock
Beiträge gesamt: 105

25. Apr 2014, 00:59
Beitrag # 9 von 9
Beitrag ID: #526538
Bewertung:
(2474 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

wenn auch nicht aktiv, so hast Du mir doch geholfen, vielen Dank!

Beim Erstellen der von Dir angeregten Testdateien ist mir der Fehler quasi ins Gesicht gesprungen, es war nur eine Integer: Statt
Code
				var NeuerName = AltNeuVerzeichnis[AltNeuNr].substr(AlterNameLaenge+2); // neuer Name 

muss es schlicht
Code
				var NeuerName = AltNeuVerzeichnis[AltNeuNr].substr(AlterNameLaenge+1); // neuer Name 

heißen.

Dann klappt's auch mit dem Skript.

Vielleicht kann's ja noch jemand anders gebrauchen.

EoT und viele Grüße
Steffen


als Antwort auf: [#526511]
X