[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Objektebenenoptionen in platziertem PDF ändern

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

Objektebenenoptionen in platziertem PDF ändern

Jack.
Beiträge gesamt: 25

6. Feb 2015, 08:25
Beitrag # 1 von 13
Bewertung:
(8293 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

stehe hier leider vor einem Problem wo ich einfach keine Lösung finde.

Ich habe im Illustrator eine PDF mit 4 Ebenen erstellt, "de"; "fr"; "it"; "Gestaltungselemente", diese als PDF gespeichert und im InDesign CS6 auf der Arbeitsfläche platziert.

Nun habe ich ein Script welches mir bestimmte Ebenen ausblenden die nicht dem Namen entsprechen.

Code
function pdfLayer(_object, layerName){ 

var _objectFirstGraphic = _object.allGraphics[0];
var _objectLayerLength = _objectFirstGraphic.graphicLayerOptions.graphicLayers.length;
var _objectGraphicLayer = _objectFirstGraphic.graphicLayerOptions.graphicLayers;

for(var i = _objectLayerLength - 1; i >= 0; i--){
if(_objectGraphicLayer[i].name !== layerName && _objectGraphicLayer[i].name !== "Gestaltungselemente"){
_objectGraphicLayer.itemByName(_objectGraphicLayer[i].name).currentVisibility = false;
}
}
}

var thisDoc = app.activeDocument;
var thisRec = thisDoc.selection[0];

try{
pdfLayer(thisRec, "fr");
}catch(e){
$.writeln("Fehler: " + e);
}


Die Ebenen sind alle immer eingeblendet und nicht gesperrt, er findet die erste Ebene und blendet diese aus, sobald er aber eine 2. Ebene findet bricht er mit dem Fehler "Referenzfehler: Objekt ist ungültig" ab, als würde das Objekt nicht mehr existieren.

Ich hoffe mir kann hier jemand weiterhelfen.

Grüße Jack

(Dieser Beitrag wurde von Martin Fischer am 6. Feb 2015, 15:59 geändert)
X

Objektebenenoptionen in platziertem PDF ändern

Uwe Laubender
Beiträge gesamt: 5319

6. Feb 2015, 11:55
Beitrag # 2 von 13
Beitrag ID: #536734
Bewertung:
(8207 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Jack!

Das ein "berühmt-berüchtigter" Bug!

Die ID des platzierten Objekts (nämlich deine AI-Datei !) hat sich nach dem ersten Ausschalten der Sichtbarkeit geändert. Von daher ist die Variable _objectFirstGraphic nicht mehr gültig. Das ursprünglich eingefangene Objekt existiert nicht mehr.

Das kannst Du nachprüfen, wenn Du vor Ablauf des Skripts die ID prüfst:

Code
var myIDBefore = _object.allGraphics[0].id; 

//Hier kommt dann die Schleife
// …

//Dann nochmal prüfen:
var myIDAfter = _object.allGraphics[0].id;

//Vergleichen:
$.writeln(myIDBefore+"\r"+myIDAfter);


Eine try/catch ohne Abbruchbedingung um die if-Abfrage wickeln, damit die Schleife durchlaufen kann.

Code
try{ 
//Bedingung
}catch(e){};


So, jetzt wollen wir mal drüber nachdenken, was der beste Workaround in diesem Fall sein könnte…

Uwe


als Antwort auf: [#536727]

Objektebenenoptionen in platziertem PDF ändern

Uwe Laubender
Beiträge gesamt: 5319

6. Feb 2015, 12:02
Beitrag # 3 von 13
Beitrag ID: #536735
Bewertung:
(8202 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier noch mal zum Nachvollziehen:

Neue inDesign-Datei erstellen. Genau eine AI-Grafik mit den Ebenen platzieren. Dann folgendes Snippet laufen lassen:

Code
var myID = app.documents[0].allGraphics[0].id; 
var _objectFirstGraphic = app.documents[0].allGraphics[0];
var _objectLayerLength = _objectFirstGraphic.graphicLayerOptions.graphicLayers.length;


for(var n=0; n<_objectLayerLength;n++){

//Fehlermeldung in die JavaScript-Konsole des ESTK, falls Objekt nicht mehr gültig:
try{
if(_objectFirstGraphic.graphicLayerOptions.graphicLayers[n].name !== "Gestaltungselemente"){
_objectFirstGraphic.graphicLayerOptions.graphicLayers[n].currentVisibility = false;
};
}catch(e){$.writeln(n+"\t"+e.message)};

};

/*
Anmerkung: Die gesuchte Ebene ist die unterste der vier Ebenen.

RESULTAT:

1 Die angeforderte Aktion konnte nicht ausgeführt werden, da das Objekt nicht mehr existiert.
2 Die angeforderte Aktion konnte nicht ausgeführt werden, da das Objekt nicht mehr existiert.
3 Die angeforderte Aktion konnte nicht ausgeführt werden, da das Objekt nicht mehr existiert.
*/

var myIDAgain = app.documents[0].allGraphics[0].id;
$.writeln(myID+"\r"+myIDAgain);



als Antwort auf: [#536734]

Objektebenenoptionen in platziertem PDF ändern

Kai Rübsamen
Beiträge gesamt: 4684

6. Feb 2015, 14:18
Beitrag # 4 von 13
Beitrag ID: #536741
Bewertung:
(8141 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Ich hab ein Skript von jongware gefunden und etwas umgeschrieben. Hier fehlen aber noch ein paar Prüfungen. Muss leider jetzt dringend weg und hole das später nach, falls richtige Richtung.

Code
main(); 
function main() {

var checklist = [];
var layernames = [ "de", "fr", "it", "Gestaltungselemente" ];

var ilDialog = app.dialogs.add({ name: "Objektebenen ein- / ausblenden", canCancel: true });
with ( ilDialog ) {
with( dialogColumns.add() ) {
with( dialogRows.add() ) {
staticTexts.add ({ staticLabel: "Check to show, uncheck to hide" });
for ( var i = 0; i < layernames.length; i++ ) {
with( dialogRows.add() ) {
checklist.push ( checkboxControls.add({ staticLabel: layernames[i], checkedState: false }) );
} // with
} // for
} // with
} // with
} // with


if (ilDialog.show() == true) {

var placedFile = app.selection[0].graphics[0];

for ( var k = 0; k < layernames.length; k++ ) {
var layer = app.selection[0].graphics[0].graphicLayerOptions.graphicLayers.item( layernames[k] );

if ( layer.isValid && layer.currentVisibility != checklist[k].checkedState ) {
layer.currentVisibility = checklist[k].checkedState;
}
}
}

} // end main

[ Edit: Auf speziellen Wunsch von Kai ("Sieht ja furchtbar aus.") die Tabs durch Leerschläge ersetzt. ]


als Antwort auf: [#536735]
(Dieser Beitrag wurde von Hans Haesler am 7. Feb 2015, 21:00 geändert)

Objektebenenoptionen in platziertem PDF ändern

Uwe Laubender
Beiträge gesamt: 5319

6. Feb 2015, 14:33
Beitrag # 5 von 13
Beitrag ID: #536742
Bewertung:
(8137 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Kai!

Ich denke, das wird funktionieren, da Du immer mit der Auswahl hier arbeitest.
Und die verliert sich nicht, wenn die ID des platzierten Objekts sich im ausgewählten Grafikrahmen ändert.

Wir schauen also *nicht* auf die Grafik selbst, um etwas zu tun (Layer ausschalten), sondern referenzieren stattdessen den Container, den Grafikrahmen. Von da aus wird dann in der Schleife immer die gerade aktualisierte Grafik angesprochen.

Ja, diese Vorgehensweise haut hin…


als Antwort auf: [#536741]

Objektebenenoptionen in platziertem PDF ändern

Martin Fischer
  
Beiträge gesamt: 12783

6. Feb 2015, 15:56
Beitrag # 6 von 13
Beitrag ID: #536744
Bewertung:
(8102 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Antwort auf: Wir schauen also *nicht* auf die Grafik selbst, um etwas zu tun (Layer ausschalten), sondern referenzieren stattdessen den Container, den Grafikrahmen.


Gute Idee!
Das lege ich mir auf Evernote. ;-)


als Antwort auf: [#536742]
(Dieser Beitrag wurde von Martin Fischer am 6. Feb 2015, 15:57 geändert)

Objektebenenoptionen in platziertem PDF ändern

Hans Haesler
  
Beiträge gesamt: 5826

7. Feb 2015, 15:59
Beitrag # 7 von 13
Beitrag ID: #536752
Bewertung:
(7948 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Dein Vorschlag funktioniert. Einigermassen.
Aber die Checkboxen zeigen nicht den aktuellen Zustand.

Das folgende Script listet die Namen und die Sichtbarkeit der Ebenen auf und verwendet diese Arrays im Dialog.
Zu Beginn sind auch die von Dir angesprochenen Prüfungen eingebaut.

Code
//EbenenEinAus_501d.js 
//© 07.02.15 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
//DESCRIPTION:PDF-Ebenen ein- und ausblenden

//Credits: Nach einer Steilvorlage von Kai Rübsamen :-)

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung", true);
exit();
}

// die Auswahl speichern ...
var curSel = app.selection;
var nItems = curSel.length;
// ... und prüfen
if (nItems == 0) {
alert ("Es ist nichts ausgewählt.", "Stop", true);
exit();
}
else if (nItems > 1) {
alert ("Nur *ein* Objekt auswählen.", "Achtung", true);
exit();
}
// testen, ob ein Bildrahmen oder dessen Inhalt ausgewählt ist
var objType = curSel[0].constructor.name;
if (objType == "Rectangle" || objType == "Polygon" || objType == "Oval") {
try {
var curObj = curSel[0].graphics[0];
var curLink = curObj.itemLink;
}
catch (e) {
alert ("Der Bildrahmen ist leer.", "Stop", true);
exit();
}
}
else if (objType == "PDF") {
var curObj = curSel[0];
var curLink = curObj.itemLink;
app.select(curObj.parent);
}
else {
alert ("Bitte ein plaziertes PDF auswählen.", "Achtung", true);
exit();
}

// die ausgewählte Datei
var placedFile = app.selection[0].graphics[0];
var nLayers = 0;
try {
var allLayers = placedFile.graphicLayerOptions.graphicLayers;
var nLayers = allLayers.length;
}
catch (e) {
alert ("Mit dieser Datei klappt es nicht.", "Stop", true);
exit();
}
if (nLayers == 0) {
alert ("Es sind keine Ebenen vorhanden.", "Stop", true);
exit();
}

var layerNames = new Array();
var checkList = new Array();

for (var i=0; i<nLayers; i++) {
layerNames.push(allLayers[i].name);
checkList.push(allLayers[i].currentVisibility);
}

// eventuell vorhandene Dialoge entfernen
try {
app.dialogs.everyItem().destroy();
}
catch (e) {
}

// den Dialog vorbereiten ...
var dlogCheckList = new Array();
var aDialog = app.dialogs.add({name:"Objektebenen ein-/ausblenden", canCancel:true});
with (aDialog) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add({staticLabel:"aktiviert = einblenden"});
for (var n=0; n<nLayers; n++) {
with (dialogRows.add()) {
dlogCheckList.push(checkboxControls.add({staticLabel:layerNames[n], checkedState:checkList[n]}));
}
}
}
}
}
// ... anzeigen und die Wahl des Anwenders anwenden
if (aDialog.show() == true) {
for (var k=0; k<nLayers; k++) {
var curLayer = app.selection[0].graphics[0].graphicLayerOptions.graphicLayers.itemByName(layerNames[k]);
curLayer.currentVisibility = dlogCheckList[k].checkedState;
}
aDialog.destroy();
}
else {
aDialog.destroy();
}

@ Jack: Ob PDF- oder Illustrator-(ai mit PDF)-Datei: Es funktioniert mit beiden.

Gruss, Hans

[ Edit: Auf speziellen Wunsch von Kai ("Sieht ja furchtbar aus.") die Tabs durch Leerschläge ersetzt.


als Antwort auf: [#536741]
(Dieser Beitrag wurde von Hans Haesler am 7. Feb 2015, 21:00 geändert)

Objektebenenoptionen in platziertem PDF ändern

Kai Rübsamen
Beiträge gesamt: 4684

7. Feb 2015, 21:29
Beitrag # 8 von 13
Beitrag ID: #536759
Bewertung:
(7859 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

nicht nur sehr gute Lösung, sondern du hast wieder mal vorbildlich gezeigt, wie man ein Skript aufbauen kann. Danke.

Die Idee, den Dialog aufgrund der im PDF-gefundenen Ebenen aufbauen zu lassen, finde ich gut. Ich könnte mir aber auch eine Variante vorstellen, bei der man durch alle platzierten Grafiken geht und global z.B. von 'de' auf 'fr' umstellst.


als Antwort auf: [#536752]

Objektebenenoptionen in platziertem PDF ändern

Hans Haesler
  
Beiträge gesamt: 5826

8. Feb 2015, 15:07
Beitrag # 9 von 13
Beitrag ID: #536776
Bewertung:
(7724 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

bitte sehr.

Nun, dass der Dialog den aktuellen Zustand wiedergibt, ist doch unabdingbar.
Zwar sieht der Benutzer dem Dokument an, was gerade eingestellt ist.
Aber mithilfe der Checkboxen kann er dem Script seinen Wunsch durchgeben.

Die Variante der Schleife durch die geladenen PDF-Dateien ist einfach einzufügen.
Ausgangspunkt wäre auch ein ausgewählter Rahmen und der Zustand der Ebenen.

Problematisch würde es aber, wenn die Ebenen der Dateien nicht dieselben sind.

Doch warten wir schon mal ab, ob der OP Jack das gepostete Script gebrauchen kann.
Und ob eine Erweiterung für ihn Sinn macht.

Gruss, Hans


als Antwort auf: [#536759]

Objektebenenoptionen in platziertem PDF ändern

Jack.
Beiträge gesamt: 25

9. Feb 2015, 13:08
Beitrag # 10 von 13
Beitrag ID: #536816
Bewertung:
(7539 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen!

Erstmal sorry für meine späte Antwort.

Der 2. Beitrag von Uwe hat mich schon in die richtige Spur gebracht.

Ich habe hier nur nach der try-catch-schleife die platzierte PDF nochmal zugeordnet.

Code
var _objectFirstGraphic = app.documents[0].allGraphics[0];  
var _objectLayerLength = _objectFirstGraphic.graphicLayerOptions.graphicLayers.length;

for(var n=0; n<_objectLayerLength;n++){
try{
if(_objectFirstGraphic.graphicLayerOptions.graphicLayers[n].name !== "Gestaltungselemente"){
_objectFirstGraphic.graphicLayerOptions.graphicLayers[n].currentVisibility = false;
};
}catch(e){
$.writeln(n+"\t"+e.message)
};
_objectFirstGraphic = app.documents[0].allGraphics[0];
};


Ich hoffe ihr habt euch mit dem Dialog-Script nicht zuviel Arbeit gemacht. :)

Grüße Jack


als Antwort auf: [#536776]

Objektebenenoptionen in platziertem PDF ändern

Hans Haesler
  
Beiträge gesamt: 5826

9. Feb 2015, 13:57
Beitrag # 11 von 13
Beitrag ID: #536823
Bewertung:
(7525 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jack,

nöö, nicht zu viel Arbeit. Das war eher eine schöne Fingerübung. :-)

Aber hast Du wenigstens das Script im Beitrag #7 ausprobiert?

Gruss, Hans


als Antwort auf: [#536816]

Objektebenenoptionen in platziertem PDF ändern

David Siebi
Beiträge gesamt: 2

28. Feb 2024, 20:34
Beitrag # 12 von 13
Beitrag ID: #587800
Bewertung:
(3004 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo liebe Leute,

ich bin leider noch sehr neu beim Indesign skripten. Früher habe ich etwas JS geschrieben, aber das ist leider schon sehr lange her.
Ich bin auf diesen Thread gestoßen, weil ich genau diese Funktion benötige und zwar mit verknüpften indd-Dateien statt Pdfs, aber das Script von Hans läuft auch dabei perfekt.

Jetzt würde ich die genau zuletzt erwähnte Erweiterung des Skriptes brauchen und zwar, dass die Änderung über alle indd-Dateien des gesamten Dokumentes ausgeführt wird.

Am Besten aber nur diese, die in einer bestimmten Ebene des aktuelle Dokuments liegen. Also gibt es vielleicht einen zusätzliche Dialogbox für die Auswahl oder es würde auch reichen, wenn das Script sich auf die Ebene des ausgewählten Objektes beschränkt.

Es geht darum, dass ich einen Katalog erstelle, von dem es mehrere Varianten gibt. Alle Einzelseiten werden in das Dokument verknüpft. Nach dem Sortieren möchte ich die Ebene in der sich die Verknüpfungen befinden duplizieren und darin die Ebenen für die Variante ändern. Es kann sein, dass es mehrere Varianten gibt und ich dies öfter durchführen muss.

Wäre es vielleicht möglich, wenn ihr mir beim das Erweitern des Skriptes behilflich sein könntet?

Ich danke euch sehr!
Grüße David


als Antwort auf: [#536823]

Objektebenenoptionen in platziertem PDF ändern

David Siebi
Beiträge gesamt: 2

2. Mär 2024, 09:16
Beitrag # 13 von 13
Beitrag ID: #587822
Bewertung:
(2881 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Leute,

ich konnte das Problem jetzt selbst lösen. Leider kann ich nicht sagen wie sauber mein Code ist, denke mal weniger :)
Jetzt würde ich noch gerne 2 Sachen verbessern, vielleicht kann mir dabei wer helfen.
Ich möchte das ausführen des Scripts auf eine Ebene des Hauptdokumentes beschränken und auch genauso auf verknüpfte INDD Dateien. Zur Zeit bekomme ich noch eine Fehlermeldung, wenn ein Bild dabei ist.

Hier ist der vorläufige Code

Code
// vorbeugenderweise das Anzeigen von Dialogen aktivieren 
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// prüfen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung", true);
exit();
}

// die Auswahl speichern ...
var curSel = app.selection;
var nItems = curSel.length;
// ... und prüfen
if (nItems == 0) {
alert ("Es ist nichts ausgewählt.", "Stop", true);
exit();
}
else if (nItems > 1) {
alert ("Nur *ein* Objekt auswählen.", "Achtung", true);
exit();
}
// testen, ob ein Bildrahmen oder dessen Inhalt ausgewählt ist
var objType = curSel[0].constructor.name;
if (objType == "Rectangle" || objType == "Polygon" || objType == "Oval") {
try {
var curObj = curSel[0].graphics[0];
var curLink = curObj.itemLink;
}
catch (e) {
alert ("Der Bildrahmen ist leer.", "Stop", true);
exit();
}
}
else if (objType == "PDF") {
var curObj = curSel[0];
var curLink = curObj.itemLink;
app.select(curObj.parent);
}
else {
alert ("Bitte ein plaziertes PDF auswählen.", "Achtung", true);
exit();
}

// die ausgewählte Datei
var placedFile = app.selection[0].graphics[0];
var nLayers = 0;
try {
var allLayers = placedFile.graphicLayerOptions.graphicLayers;
var nLayers = allLayers.length;
}
catch (e) {
alert ("Mit dieser Datei klappt es nicht.", "Stop", true);
exit();
}
if (nLayers == 0) {
alert ("Es sind keine Ebenen vorhanden.", "Stop", true);
exit();
}

var layerNames = new Array();
var checkList = new Array();

if (layerNames.length<1) {
for (var i=0; i<nLayers; i++) {
layerNames.push(allLayers[i].name);
checkList.push(allLayers[i].currentVisibility);
}

// eventuell vorhandene Dialoge entfernen
try {
app.dialogs.everyItem().destroy();
}
catch (e) {
}

//Checkliste erstellen
var dlogCheckList = new Array();
dialogEinblenden();

// den Dialog vorbereiten ...
function dialogEinblenden (){

var aDialog = app.dialogs.add({name:"Objektebenen ein-/ausblenden", canCancel:true});
with (aDialog) {
with (dialogColumns.add()) {
with (dialogRows.add()) {
staticTexts.add({staticLabel:"aktiviert = einblenden"});
for (var n=0; n<nLayers; n++) {
with (dialogRows.add()) {
dlogCheckList.push(checkboxControls.add({staticLabel:layerNames[n], checkedState:checkList[n]}));
}
}
}
}
}
// ... anzeigen und die Wahl des Anwenders anwenden, Wenn der Button "OK" geklickt wird
if (aDialog.show() == true) {
bearbeiteVerknuepfteDatei(curLink);
}
// Wenn "abbrechen" geklickt wird
else {
aDialog.destroy();
}
}
}

//alle Dateien bearbeiten
alleDateienAufrufenUndBearbeiten();


// Hauptfunktion, um Layer für eine verknüpfte Datei zu bearbeiten
function bearbeiteVerknuepfteDatei(placedFile) {
// Hier werden die Ebenen ein- oder ausgeblendet basierend auf den Benutzerinput im Dialog
for (var k=0; k<nLayers; k++) {
var curLayer = placedFile.parent.graphicLayerOptions.graphicLayers.itemByName(layerNames[k]);
curLayer.currentVisibility = dlogCheckList[k].checkedState;
}
//aDialog.destroy();
}


//Funktion ruft alle Elemente im Dokument auf und leitet Modifizierung ein
function alleDateienAufrufenUndBearbeiten () {
// Funktion aufrufen, um alle anderen verknüpften Dateien im Dokument zu bearbeiten
for (var i = 0; i < app.documents[0].allGraphics.length; i++) {
var graphic = app.documents[0].allGraphics[i];
if (graphic.itemLink != curLink) {
bearbeiteVerknuepfteDatei(graphic.itemLink);
}
}
}



als Antwort auf: [#587800]
X