[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt leere Textfelder/Bildrahmen suchen

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

leere Textfelder/Bildrahmen suchen

thangartner
Beiträge gesamt: 27

26. Feb 2010, 12:54
Beitrag # 31 von 47
Beitrag ID: #434819
Bewertung:
(6294 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ist mir bis heute noch gar nie aufgefallen dass dort Unicodes angezeigt werden. Und schon wieder was gelernt.


als Antwort auf: [#434817]
X

leere Textfelder/Bildrahmen suchen

klasinger
Beiträge gesamt: 1671

26. Apr 2010, 17:25
Beitrag # 32 von 47
Beitrag ID: #440199
Bewertung:
(6217 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich muss nun auch mal leere Bildrahmen löschen, allerdings befinden sich diese innerhalb der Textrahmen (mitfließend, eingefügt per Copy&Paste im Mustertextrahmen) - daher funktionieren beider Scripte nicht.
Im Objektmodell bin ich leider auf nichts passendes gestoßen, um das Script anzupassen. Kann jemand helfen?

Dank vorab!


als Antwort auf: [#434819]

leere Textfelder/Bildrahmen suchen

Martin Fischer
  
Beiträge gesamt: 12783

26. Apr 2010, 18:07
Beitrag # 33 von 47
Beitrag ID: #440202
Bewertung:
(6207 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Klaas,

versuch's mal damit:
Code
var my_items = app.documents.firstItem().allPageItems;  
for (var i = my_items.length-1; i>= 0; i-- )
if (my_items[i].constructor.name == 'Rectangle' && my_items[i].graphics.length == 0)
my_items[i].remove();



als Antwort auf: [#440199]

leere Textfelder/Bildrahmen suchen

klasinger
Beiträge gesamt: 1671

27. Apr 2010, 13:45
Beitrag # 34 von 47
Beitrag ID: #440301
Bewertung:
(6173 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Martin,

it works!


als Antwort auf: [#440202]

leere Textfelder/Bildrahmen suchen

Doro W.
Beiträge gesamt: 305

8. Jun 2011, 09:17
Beitrag # 35 von 47
Beitrag ID: #473230
Bewertung:
(5787 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin,

muss diesen alten thread nochmal aufwärmen.

Ich hab mir gerade das Skript removeEmptyTextFrames.jsx geladen. Leider tut es nicht, was ich erhofft hatte. Die Fehlermeldung lautet:

Code
Fehlernummer 24 
Fehlerzeichenfolge: f[i].contents.replace ist keine Funktion
....
Interpreter: CS2 (4.0)


Danke schon mal für eure Unterstützung.
Gruß, doro


als Antwort auf: [#440301]

leere Textfelder/Bildrahmen suchen

Martin Fischer
  
Beiträge gesamt: 12783

8. Jun 2011, 11:33
Beitrag # 36 von 47
Beitrag ID: #473250
Bewertung:
(5753 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wie kommt es zu dieser Differenz:

Zitat von Doro W. Interpreter: CS2 (4.0)


und

Zitat von Doro W. CS4 auf XP


Wie wird das Skript gestartet?


als Antwort auf: [#473230]

leere Textfelder/Bildrahmen suchen

Doro W.
Beiträge gesamt: 305

8. Jun 2011, 12:37
Beitrag # 37 von 47
Beitrag ID: #473259
Bewertung:
(5727 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Wie kommt es zu dieser Differenz:


Das hab ich mich auch gefragt.

Die Skripten liegen bei mir im Verzeichnis C:\Dokumente und Einstellungen\Username\Anwendungsdaten\Adobe\InDesign\Version 6.0\de_DE\Scripts\Scripts Panel\Version 4.0 Scripts

Als ich von CS2 auf CS4 umgestiegen bin, liefen einige der alten Skripten (erst) dann, wenn ich
app.scriptPreferences.version = 4.0;
als erste Zeile in die jsx-Datei eingetragen habe; daher rührt, wenn ich mich richtig erinnere, auch die Anlage des Verzeichnisses Version 4.0 Scripts.

Ich starte das Skript durch Doppelklick auf seinen Namen in der Skriptenpalette.

Gruß, doro


als Antwort auf: [#473250]

leere Textfelder/Bildrahmen suchen

Martin Fischer
  
Beiträge gesamt: 12783

8. Jun 2011, 12:54
Beitrag # 38 von 47
Beitrag ID: #473263
Bewertung:
(5723 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Doro,

Antwort auf: Als ich von CS2 auf CS4 umgestiegen bin, liefen einige der alten Skripten (erst) dann, wenn ich
app.scriptPreferences.version = 4.0;
als erste Zeile in die jsx-Datei eingetragen habe; daher rührt, wenn ich mich richtig erinnere, auch die Anlage des Verzeichnisses Version 4.0 Scripts.


Das ist eine gute Lösung für alte Skripte.
Aber das kann ein Verhinderungsgrund für die Ausführung neuer Skripte sein, die für CS3 und höher entwickelt wurden und mit der CS2-Umgebung nicht klarkommen.

Lege das Skript mal eine Stufe tiefer in C:\Dokumente und Einstellungen\Username\Anwendungsdaten\Adobe\InDesign\Version 6.0\de_DE\Scripts\Scripts Panel und berichte, ob das hilft.


als Antwort auf: [#473259]

leere Textfelder/Bildrahmen suchen

Doro W.
Beiträge gesamt: 305

8. Jun 2011, 13:40
Beitrag # 39 von 47
Beitrag ID: #473273
Bewertung:
(5709 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Martin, du bist der Größte!
Danke, mal wieder,
und schönen Gruß
d.


als Antwort auf: [#473263]

leere Textfelder/Bildrahmen suchen

Martin Fischer
  
Beiträge gesamt: 12783

8. Jun 2011, 13:58
Beitrag # 40 von 47
Beitrag ID: #473276
Bewertung:
(5701 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mich dünkt, Du hättest die Lösung mit dem Hinweis auf den besonderen Pfad des Skripts selbst herausgefunden ...


als Antwort auf: [#473273]

leere Textfelder/Bildrahmen suchen

Doro W.
Beiträge gesamt: 305

8. Jun 2011, 14:06
Beitrag # 41 von 47
Beitrag ID: #473277
Bewertung:
(5707 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
mag sein -- drehe mit den Arbeitsmengen aber gerade so am Rad, dass das Denken nicht mehr in alle Richtungen funktioniert ....
d.


als Antwort auf: [#473276]

leere Textfelder/Bildrahmen suchen

Uwe Laubender
Beiträge gesamt: 5319

24. Feb 2012, 13:25
Beitrag # 42 von 47
Beitrag ID: #490712
Bewertung:
(5355 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Martin!

Aus gegebenem Anlass muss ich diesen alten Thread doch noch mal ausgraben.
es geht hier um Dein Script "removeEmptyTextFrames.jsx".

Das ist leider nicht ganz "wasserdicht". Ich habe ein Hauptproblem damit:
es löscht auch Textrahmen, die Teile von Tabellen enthalten, die über mehrere Textrahmen verteilt sind (threaded text frames).

Ausserdem ist sein Scope (Wirkungsbereich) eingeschränkt, sodass verankerte Textrahmen nicht untersucht werden.

Dies möchte ich hiermit ändern:

1. Textrahmen werden nun dupliziert, wenn ihre ParentStory Tabellen enthalten. Das Duplikat wird der Untersuchung unterzogen.
Erklärung: wird eine Tabelle über mehrere Textrahmen fortgeführt, enthält bei einem Duplikat eines Teilstücks dieses Duplikat eine eigene Tabelle, wird also nicht fälschlicherweise als "leer" angesehen.

2. Ich verwende nun "allPageItems", um den Wirkungsbereich des Scripts auch auf verankerte Textrahmen auszudehnen.

Es werden zwei Schleifen durchlaufen:
Schleife 1 kümmert sich ausschließlich um verankerte Textrahmen, Schleife 2 arbeitet sich durch alle verbliebenen Textrahmen durch.

Ein weitere Einschränkung:
Der Wirkungsbereich von "allPageItems" des Dokuments beschränkt sich bei MultiStateObjects (MSO) auf den aktiven Status der MSOs. Leere Textrahmen außerhalb des "ActiveState" können so nicht gefunden werden. Dazu müßte jedes MSO einzeln untersucht werden und alle Stati nacheinander zum aktiven gemacht werden.

Erklärung: die Eigenschaft "allPageItems" fehlt dem Status-Objekt (state) eines MSOs; da hat das DOM eine Lücke, es gibt nur "pageItems". Über "myState.pageItems" können wir aber keine verankerten leeren Textrahmen finden.

Drei weitere, für mich sinnvolle Einschränkungen:
1. Gesperrte Textrahmen werden nicht geprüft.
2. Textrahmen mit Übersatz werden nicht geprüft, also auch nicht als "leer" definiert.
3. Es wird nicht geprüft, ob Tabellen "leer" sind.

Hier das Script zum Testen (bitte nur an Duplikaten von Produktionsdateien ausprobieren).
Lauffähig in CS3, CS4, CS5 und CS5.5 (CS2 kann ich nicht testen):

Code
//RemoveEmptyTextFrames_ACTIVE_DOC.jsx 
//Uwe Laubender

//Prove method and RegEx for "Emptiness" of contents by: Martin Fischer
//See discussion on HDS:
//http://www.hilfdirselbst.ch/gforum/gforum.cgi?post=382773#382773

//DESCRIPTION:Removes all empty text frames; except: text frames in MSOs not in activeState, locked text frames, overset text frames.

/**
* @@@BUILDINFO@@@ RemoveEmptyTextFrames_ACTIVE_DOC.jsx !Version! Fri Feb 24 2012 13:10:25 GMT+0100
*/

//doScript() with UndoModes is not available in InDesign CS3 or below, so:
if(parseFloat(app.version)>5){
app.doScript(_RemoveEmptyTextFrames, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, "Remove empty text frames");
}
else{_RemoveEmptyTextFrames()};

function _RemoveEmptyTextFrames(){

if(app.documents.length == 0){
alert("There is no open document. Open a document and try again!");
exit();
};

var d = app.documents[0];

var aPI1 = d.allPageItems; //This is an Array, not a collection!!

//Looking for empty anchored TextFrames that is not locked or overset:
for(var n=aPI1.length-1;n>=0;n--){
if(aPI1[n] instanceof TextFrame && aPI1[n].parent instanceof Character && aPI1[n].locked == false && aPI1[n].overflows == false){
//Care for threaded tables:
if(aPI1[n].parentStory.tables.length != 0){
var dup = aPI1[n].duplicate();
//If the duplicate still contains no contents (formerly part of a table, now a new table), remove it together with the original text frame:
if(dup.contents.replace(/\s+/g, "") == ""){
dup.remove();
aPI1[n].remove();
};
}
else{
if(aPI1[n].contents.replace(/\s+/g, "") == ""){
aPI1[n].remove();
};
};
}; //End first if
}; //End for-loop

var aPI2 = d.allPageItems;
//Now the rest of the text frames, that are not locked or overset:
for(var n=aPI2.length-1;n>=0;n--){
if(aPI2[n] instanceof TextFrame && aPI2[n].locked == false && aPI2[n].overflows == false){
//Care for threaded tables:
if(aPI2[n].parentStory.tables.length != 0){
var dup = aPI2[n].duplicate();
//If the duplicate still contains no contents (formerly part of a table, now a new table), remove it together with the original text frame:
if(dup.contents.replace(/\s+/g, "") == ""){
dup.remove();
aPI2[n].remove();
};
}
else{
if(aPI2[n].contents.replace(/\s+/g, "") == ""){
aPI2[n].remove();
};
};
};

};

}; //END function "_RemoveEmptyTextFrames()"



als Antwort auf: [#473263]

leere Textfelder/Bildrahmen suchen

Martin Fischer
  
Beiträge gesamt: 12783

24. Feb 2012, 13:56
Beitrag # 43 von 47
Beitrag ID: #490714
Bewertung:
(5344 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Antwort auf: es löscht auch Textrahmen, die Teile von Tabellen enthalten, die über mehrere Textrahmen verteilt sind (threaded text frames).


Gut beobachtet!
Das hatte ich bei der damaligen Entwicklung nicht mitbedacht.

Antwort auf: Ausserdem ist sein Scope (Wirkungsbereich) eingeschränkt, sodass verankerte Textrahmen nicht untersucht werden.


Ja, das stimmt auch.
Aber diese waren mir – für meine Zwecke – egal. ;-)
Dank für Deine Erweiterung.


Antwort auf: 1. Textrahmen werden nun dupliziert, wenn ihre ParentStory Tabellen enthalten. Das Duplikat wird der Untersuchung unterzogen.
Erklärung: wird eine Tabelle über mehrere Textrahmen fortgeführt, enthält bei einem Duplikat eines Teilstücks dieses Duplikat eine eigene Tabelle, wird also nicht fälschlicherweise als "leer" angesehen.


Das kommt mir etwas kompliziert vor.
Ich habe mal nachgesehen.

Ein Textrahmen mit einer überlaufenden Tabelle (und nur dieser) hat 0 Zeichen, aber 1 Absatz.
Ein leerer Textrahmen hat auch 0 Zeichen, aber auch 0 Absätze.

Könnte die Kombination 0 Zeichen und 0 Absätze eventuell als eindeutiges Kriterium für einen leeren, und daher zu löschenden Textrahmen gelten?
Eventuell reicht ja auch schon die Eigenschaft 0 Absätze allein.


als Antwort auf: [#490712]
(Dieser Beitrag wurde von Martin Fischer am 24. Feb 2012, 14:03 geändert)

leere Textfelder/Bildrahmen suchen

Uwe Laubender
Beiträge gesamt: 5319

24. Feb 2012, 14:34
Beitrag # 44 von 47
Beitrag ID: #490716
Bewertung:
(5326 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Ein Textrahmen mit einer überlaufenden Tabelle (und nur dieser) hat 0 Zeichen, aber 1 Absatz.
Ein leerer Textrahmen hat auch 0 Zeichen, aber auch 0 Absätze.


Hallo, Martin!
Toller Ansatz. Sehr gut diesmal von Dir beobachtet. Das ist ja ziemlich verrückt, bei den Absätzen nachzusehen. Darauf bin ich bisher noch nicht gekommen.

Ja, ich werde mein Script dahingegen mal ändern und testen…

Danke!


als Antwort auf: [#490714]

leere Textfelder/Bildrahmen suchen

Uwe Laubender
Beiträge gesamt: 5319

25. Feb 2012, 09:47
Beitrag # 45 von 47
Beitrag ID: #490732
Bewertung:
(5244 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Aber bevor ich mich mit Deiner Methode an die Arbeit mache, noch eine Korrektur am oben veröffentlichten Script:

1. Die duplizierten Textrahmen, sofern sie Tabellen enthielten, wurden nicht gelöscht, sondern blieben stehen. Zum Löschen des Duplikats hatte ich die falsche Script-Zeile erwischt. Peinlich.

2. In der Schleife durch die verankerten Textrahmen brauche ich nicht nach Tabellenteilen zu suchen, die in verketteten Textrahmen liegen. Dieser Fall kann schlichtweg nicht vorkommen, da ein verketteter Textrahmen, der verankert wird, aus der Kette gelöst wird.

Rückmeldungen würden mich freuen.

Hier das korrigierte Script:

Code
//RemoveEmptyTextFrames_ACTIVE_DOC.jsx 
//Uwe Laubender

//Corrected Sat Feb 25 2012:
//1. duplicated text frames are now removed after testing for "emptiness"
//2. Superfluent if-condition removed for anchored text frames

//Prove method and RegEx for "Emptiness" of contents by: Martin Fischer
//See discussion on HDS:
//http://www.hilfdirselbst.ch/gforum/gforum.cgi?post=382773#382773

//DESCRIPTION:Removes all empty text frames; except: text frames in MSOs not in activeState, locked text frames, overset text frames.

/**
* @@@BUILDINFO@@@ RemoveEmptyTextFrames_ACTIVE_DOC.jsx !Version! Sat Feb 25 2012 09:43:34 GMT+0100
*/

//doScript() with UndoModes is not available in InDesign CS3 or below, so:
if(parseFloat(app.version)>5){
app.doScript(_RemoveEmptyTextFrames, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, "Remove empty text frames");
}
else{_RemoveEmptyTextFrames()};

function _RemoveEmptyTextFrames(){

if(app.documents.length == 0){
alert("There is no open document. Open a document and try again!");
exit();
};

var d = app.documents[0];

var aPI1 = d.allPageItems; //This is an Array, not a collection!!

//Looking for empty anchored TextFrames that is not locked or overset:
for(var n=aPI1.length-1;n>=0;n--){
if(aPI1[n] instanceof TextFrame && aPI1[n].parent instanceof Character && aPI1[n].locked == false && aPI1[n].overflows == false){

//We don't need to care for threaded tables in anchored text frames.
//text frames cannot be directly anchored and part of a thread at the same time.
//So we only ask for "Emptiness" of the contents property:

if(aPI1[n].contents.replace(/\s+/g, "") == ""){
aPI1[n].remove();
};

};
};

var aPI2 = d.allPageItems;
//Now the rest of the text frames, that are not locked or overset:
for(var n=aPI2.length-1;n>=0;n--){
if(aPI2[n] instanceof TextFrame && aPI2[n].locked == false && aPI2[n].overflows == false){

//Care for threaded tables:
if(aPI2[n].parentStory.tables.length != 0){
var dup = aPI2[n].duplicate();

//If the duplicate still contains no contents
//(formerly part of a table, now a new table),
//remove the original text frame:

if(dup.contents.replace(/\s+/g, "") == ""){
aPI2[n].remove();
};
//Remove the duplicate in any case:
dup.remove();
}else{
if(aPI2[n].contents.replace(/\s+/g, "") == ""){
aPI2[n].remove();
};
};
};

};

}; //END function "_RemoveEmptyTextFrames()"



als Antwort auf: [#490716]
X