Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Letztes Element auf der Seite mit besimmten Scriptlabel löschen

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

Friederike Römer
Beiträge gesamt: 5

9. Jan 2013, 11:53
Bewertung:

gelesen: 2900

Beitrag als Lesezeichen
Hallo zusammen,

ich habe eine XML-Datei aus unserer Datenbank in InDesign (CS 5.5, Windows 7) importiert, um einen vollständigen Produktkatalog zu erzeugen. Vor jeder Produktgruppe wird eine Zwischenüberschrift eingefügt (eigener Textrahmen mit dem Scriptlabel "katalog_untergruppe"), bei einem Seitenumbruch kann es jedoch passieren, dass diese als letztes Element auf der vorhergehenden Seite steht, auf der neuen Seite wird er zusätzlich automatisch neu erzeugt. Diese "letzten" Elemente möchte ich nun über ein Skript in der fertigen Datei suchen und löschen.
Mein erster Ansatz war die Elemente der Seite zu zählen und falls der Textrahmen einen höheren Wert als 40 hat zu löschen. Leider variieren die Inhalte der Seiten zu stark, so bleibt manchmal ein Textrahmen stehen und manchmal wird ein noch benötigter gelöscht. Vielleicht hat einer von Euch eine Lösungsidee.
Danke im vorraus Rike

Hier meine erster Ansatz, vielleicht hilfts:

function test(){
for(var i=0;i<document.allPageItems.length; i++){
if(document.allPageItems[i].label != ""){
//pagestart
if(document.allPageItems[i].label == 'katalog_untergruppe'){
var n= 1;
while(document.allPageItems[i+n].label == ""){
n++;
}
if(n>40){
document.allPageItems[i].remove();
}
}
if(document.allPageItems[i].label == 'katalog_untergruppe' && document.allPageItems[i+1].label == 'pagestart'){
document.allPageItems[i].remove();
}
}
}
}
test();

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

mx
Beiträge gesamt: 161

9. Jan 2013, 13:11
Bewertung:

gelesen: 2870

Beitrag als Lesezeichen
Hallo Frederike,

der Punkt mit
Zitat auf der neuen Seite wird er zusätzlich automatisch neu erzeugt

klingt interessant, damit könnte dann z.B. dieser zusätzliche Rahmen noch markiert werden.
Dann die markierten Rahmen suchen und jeweils auf der vorhergehenden Seite den Rahmen gleichen Inhalts entfernen.
Oder gibt es da mehrere und es geht zwingend darum den letzten zu finden?
Wie klappt es überhaupt den Seitenumbruch zu erkennen und dann die Überschrift samt Rahmen erneut zu schreiben? Da ist doch eigentlich schon der Schlüssel drin z.B. dann den zuletzt geschriebenen Rahmen zu verschieben, statt neu anzulegen, falls das z.B. auch bereits über ein Script läuft.

Viele Grüße
Jo

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

Friederike Römer
Beiträge gesamt: 5

9. Jan 2013, 13:39
Bewertung:

gelesen: 2854

Beitrag als Lesezeichen
Der Import erfolgt aus einer XML Datei die vorher über XSLT in ein InDesign verständliches Dokument transformiert wird. In dieser Datei ist über ein Importplugin für XML (viamedici) eine Satzspiegelhöhe definiert, ist ein Element oder eine Gruppe zu groß, passt also nicht mehr auf die Seite, wird ein Seitenumbruch erzeugt und das Element/die Gruppe auf die neue Seite verschoben. Die aktuelle Zwischenüberschrift steht auf einer neuen Seite im Kopftext und wird aus den Daten erzeugt, also ist es nicht wirklich eine Wiederholung des vorherigen Textrahmens, sondern völlig unabhängig. Daher muss das letzte Element der Seite gelöscht werden, falls es das Scriptlabel besitzt.
Ich habe in der XSLT Programierung schon gesucht und probiert das zu lösen, aber leider wird der Seitenumbruch erst beim Import ermittelt, und deshalb ist es nichts worauf ich vorher schon prüfen kann.

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

mx
Beiträge gesamt: 161

9. Jan 2013, 16:58
Bewertung:

gelesen: 2811

Beitrag als Lesezeichen
Hallo Friederike,

dann musst du im Script tatsächlich alle Seiten durchgehen, jeweils auf einer Seite über die TextFrames gehen und den mit dem größen Wert in geometricBounds[0] (größter Y-Wert = Oberkante des untersten Rahmens) prüfen, ob das Label gesetzt ist, das die Zwischenüberschriften identifiziert. Falls vorhanden löschen, falls nicht auf der nächsten Seite weitermachen.

In etwa so:
Code
for (var i = 0; i < app.activeDocument.pages.length; i++) { 
var currentPage = app.activeDocument.pages[i];
var lastTextFrame;
for (var j = 0; j < currentPage.textFrames.length; j++) {
var currentTextFrame = currentPage.textFrames[j];
if (j == 0)
lastTextFrame = currentTextFrame;
else if (currentTextFrame.geometricBounds[0] > lastTextFrame.geometricBounds[0])
lastTextFrame = currentTextFrame;
}
if (lastTextFrame.label == 'katalog_untergruppe')
lastTextFrame.remove();
}



Viele Grüße
Jo

(Dieser Beitrag wurde von mx am 9. Jan 2013, 17:15 geändert)

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

Friederike Römer
Beiträge gesamt: 5

9. Jan 2013, 17:19
Bewertung:

gelesen: 2801

Beitrag als Lesezeichen
@Jo
Super, fast perfekt :-)
Manchmal ist jedoch auf der Seite unter dem Textrahmen noch ein Bildrahmen, dann darf die Überschrift natürlich nicht gelöscht werden. Nur wenn er definitiv das letzte Element der Seite (ohne Musterseitenelemente natürlich) ist.
Kann man da noch so eine Abfrage einfügen, dass generell auf den letzten Rahmen geprüft wird, wenn dieser dann das Scriptlabel hat, und nicht nur auf Textrahmen?

Gruß Rike

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

mx
Beiträge gesamt: 161

9. Jan 2013, 18:02
Bewertung:

gelesen: 2768

Beitrag als Lesezeichen
Hallo Friederike,

klar, dann geht die innere Schleife halt so wie bei deinem ersten Ansatz über die pageItems statt die textFrames, dann ist es egal ob Bild oder Text.

Viele Grüße
Jo

Letztes Element auf der Seite mit besimmten Scriptlabel löschen

Friederike Römer
Beiträge gesamt: 5

10. Jan 2013, 07:31
Bewertung:

gelesen: 2713

Beitrag als Lesezeichen
Hallo Jo,

Super vielen lieben Dank, funktioniert perfekt :)
Genau so wollte ich das haben.

Viele Grüße
Rike

hier nun das fertige Skript
Code
function test(){ 

for (var i = 0; i < app.activeDocument.pages.length; i++) {
var currentPage = app.activeDocument.pages[i];
var lastpageItems;
for (var j = 0; j < currentPage.pageItems.length; j++) {
var currentpageItems = currentPage.pageItems[j];
if (j == 0)
lastpageItems = currentpageItems;
else if (currentpageItems.geometricBounds[0] > lastpageItems.geometricBounds[0])
lastpageItems = currentpageItems;
}
if (lastpageItems.label == 'katalog_untergruppe')
lastpageItems.remove();
}
}
test();


(Dieser Beitrag wurde von Friederike Römer am 10. Jan 2013, 07:46 geändert)