[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

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

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

11. Mai 2012, 15:36
Beitrag # 1 von 21
Bewertung:
(5390 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe Alle,

da die Funktion "Lebender Kolumnentitel" nicht ganz das bietet, was ich möchte, suche ich nach einer Lösung per Skript.

Ich möchte alle auf einer Seite vorkommenden Überschriften (zu erkennen am entsprechenden Absatzformat) auslesen und automatisch in eine Kopfzeile schreiben lassen. Und das ganze dann für alle Seiten.

Mit dem Lebenden Kolumnentitel bekomme ich nur entweder das erste oder das letzte Vorkommen aber eben nicht eventuelle weitere dazwischen.

Vielen Dank für Eure Hilfe und viele Grüße

Gamurke
X

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

Martin Fischer
  
Beiträge gesamt: 12783

11. Mai 2012, 16:38
Beitrag # 2 von 21
Beitrag ID: #494868
Bewertung:
(5366 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gamurke,

Antwort auf: Mit dem Lebenden Kolumnentitel bekomme ich nur entweder das erste oder das letzte Vorkommen aber eben nicht eventuelle weitere dazwischen.


Aus reiner Neugierde: Um was für eine Textgattung handelt es sich?
Ist genug Platz für den Text von mehreren Überschriften im Kolumnentitel vorhanden?
Ein Kolumnentitel ist kein Inhaltsverzeichnis und wirkt um so besser, je kürzer er ist!

Per Skript sollte sich aber auch für diese Aufgabe eine Lösung finden lassen.


als Antwort auf: [#494864]
(Dieser Beitrag wurde von Martin Fischer am 11. Mai 2012, 16:49 geändert)

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

mx
Beiträge gesamt: 161

11. Mai 2012, 16:59
Beitrag # 3 von 21
Beitrag ID: #494872
Bewertung:
(5350 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gamurke,

nur mal so als Ansatz:

Mit
Code
		app.changeTextPreferences = NothingEnum.nothing; 
app.findTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.properties = {includeFootnotes:false, includeMasterPages:false};
app.findTextPreferences.properties = {appliedParagraphStyle:"MeinAbsatzformatfürdieÜberschrift"};
var searchResults = app.activeDocument.findText();

bekommst Du ein Array mit den Vorkommen eines Absatzformates.

Das musst Du noch um die anderen gewünschten Absatzformate erweitern.

Schließlich gehst du Seite für Seite durch, suchst in dem Array nach den für diese Seite passenden Stellen (z.B. mit
Code
searchResults[i].insertionPoints[0].parentTextFrames[0].parent.documentOffset 

[i läuft hier durch das Array] kommst du an die absolute Seitenzahl, passen zu app.activeDocument.pages) und fügst das dann in den Rahmen ein, den du wie auch immer (z.B mit einem Label) als Kopfzeile für diese Seite markiert hast.

Viele Grüße
Jo


als Antwort auf: [#494864]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

11. Mai 2012, 20:13
Beitrag # 4 von 21
Beitrag ID: #494890
Bewertung:
(5298 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

es ist ein zweispaltiges Programmheft mit recht kleiner Schrift und man soll sich in der Kopfzeile sofort orientieren können, welche Bereiche auf der Seite zu finden sind.

Das sind i.d.R maximal drei Überschriften. Platz ist also genug.

Drei kommt aber öfter mal vor und mit dem running header fehlt immer was. Und wenn nur eine Überschrift da ist, dann ist sie gleichzeitig erste und letzte und würde zweimal zu sehen sein.

Die Überschriften folgen auch keiner alphabetischen Sortierung, so dass man lexikonartig auf den linken Seiten die erste und auf den rechten Seiten nur die letzte Überschrift anführt.


Gruß, gamurke


als Antwort auf: [#494868]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

11. Mai 2012, 20:17
Beitrag # 5 von 21
Beitrag ID: #494891
Bewertung:
(5298 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

danke. Das werde ich mal ausprobieren.

Gruß, gamurke


als Antwort auf: [#494872]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

-hans-
Beiträge gesamt: 748

14. Mai 2012, 20:55
Beitrag # 6 von 21
Beitrag ID: #495004
Bewertung:
(5201 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

schau mal ob's klappt; ID CS 5.5.

Auf jeder Seite muss ein Textrahmen mit dem im Script angegebenen Scriptetikett vorhanden sein.

Code
var customLabel = 'columnTitleSpecial';//Scriptetikett für Textbox Kolumnentitel; muss im Dokument gesetzt sein 

var theDoc = app.activeDocument;
var pStyles = theDoc.allParagraphStyles;
var pStyleStringList = [];// listbox
var foundPStyleList = [];//objects -> word, paragraph
var foundAndOffset = [];//[[offset, object], ...]



main();

function main(){
fillPstyleStringList();
var getPstylesIndexinpStyles = selPStyle(pStyleStringList);//[1,2,3,4,5]
findPstylesInDoc(getPstylesIndexinpStyles);
sortFoundToPages();
foundAndOffset.sort(Numsort)
setColumnContent(foundAndOffset)
}




function fillPstyleStringList(){
for(var i = 0 ; i < pStyles.length; i++)
{

if(pStyles[i].parent.toString() === '[object ParagraphStyleGroup]')
{
pStyleStringList.push('Gruppe: ' + pStyles[i].parent.name + ', Name: ' + pStyles[i].name);
}else{
pStyleStringList.push('Name: ' + pStyles[i].name);
}
}
}





function selPStyle (array)
{
var myWindow = new Window ("dialog", "Absatzformate");
var myInputGroup = myWindow.add ("group");
var sel = myInputGroup.add ("listbox", [0, 0, 300, 300], array, {scrolling: true, multiselect: true});

var myButtonGroup = myWindow.add ("group");
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");

if (myWindow.show() == 1){
var theSel = sel.selection;
var tmpList = [];
for(var g = 0; g < theSel.length; g++)
{
tmpList.push(theSel[g].index)
}
return tmpList;
myWindow.close();
}else{
exit ();
}

}



function findPstylesInDoc(aArray){
for(var p = 0; p < aArray.length; p++){
var toSearch = pStyles[aArray[p]];
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.properties = {includeFootnotes:false, includeMasterPages:false};
app.findTextPreferences.properties = {appliedParagraphStyle:toSearch};
var searchResults = theDoc.findText();
for(var s = 0; s < searchResults.length; s++){
foundPStyleList.push(searchResults[s])
}
}

}


function sortFoundToPages() {

for(var x = 0; x < foundPStyleList.length; x++){
var myOffset = foundPStyleList[x].insertionPoints[0].parentTextFrames[0].parentPage.documentOffset;

foundAndOffset.push([myOffset, foundPStyleList[x]])

}

}



function setColumnContent(foundAndOffset){

for(var q = 0; q < foundAndOffset.length; q++){
var myItem = foundAndOffset[q];

var toDelete = false;
if(foundAndOffset[q-1] != undefined && foundAndOffset[q][0] > foundAndOffset[q-1][0]){toDelete = true}

var pageTextFrames = theDoc.pages[myItem[0]].textFrames;
for(var t = 0; t < pageTextFrames.length; t++){
if(pageTextFrames[t].label === customLabel) {
if(toDelete || q === 0){pageTextFrames[t].contents = ''; var delimiter = '' }else{var delimiter = ' // '} //Trenner für Überschriften
var theContentArray = (myItem[1].contents).split('\r');
var theContentString = theContentArray.join(' ');
var theContentArray = theContentString.split('\n');
var theContentString = theContentArray.join(' ');

pageTextFrames[t].insertionPoints[-1].contents = delimiter + theContentString; break;
}
}

}
}

function Numsort (a, b) {
return a[0] - b[0];
}



als Antwort auf: [#494891]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

mx
Beiträge gesamt: 161

15. Mai 2012, 11:51
Beitrag # 7 von 21
Beitrag ID: #495025
Bewertung:
(5150 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

Kompliment, schickes Ding und klappt tadellos!

Danke, dass Du das mit dem parentPage noch korrigiert hast.

Bis CS4 ist die Seite zu einem InsertionPoint so zu finden:

parentTextFrames[0].parent ergibt ein Page-Objekt

Ab CS5 gibt es eine eigene Eigenschaft parentPage also:

parentTextFrames[0].parentPage ergibt ein Page-Objekt

Viele Grüße
Jo


als Antwort auf: [#495004]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

-hans-
Beiträge gesamt: 748

15. Mai 2012, 18:19
Beitrag # 8 von 21
Beitrag ID: #495066
Bewertung:
(5111 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
thx :),

ja, ich hab' Deinen Ansatz verwendet, schien mir sinnig ;-)

Tschöle

Hans


als Antwort auf: [#495025]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

16. Mai 2012, 09:25
Beitrag # 9 von 21
Beitrag ID: #495086
Bewertung:
(5058 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebe Alle,

vielen Dank für Eure Hilfe. Das ist ja mehr als man erwarten kann. Sogar einen Auswahldialog für das Absatzformat habt Ihr spendiert.

Bei mir funktioniert es bisher auch.

Allerdings muss man wirklich auf jeder Seite die Textbox mit dem entsprechenden Label haben. Wenn man die Box einmalig in der Mustervorlage mit dem Label definiert, funktioniert es nicht.

Oder gibt es da noch einen Weg?

Gruß, Gamurke


als Antwort auf: [#495066]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

mx
Beiträge gesamt: 161

16. Mai 2012, 10:34
Beitrag # 10 von 21
Beitrag ID: #495102
Bewertung:
(5037 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Strg + Shift + Klick ;)


als Antwort auf: [#495086]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

16. Mai 2012, 10:54
Beitrag # 11 von 21
Beitrag ID: #495104
Bewertung:
(5024 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ah! Prima. Dankesehr.


als Antwort auf: [#495102]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

16. Mai 2012, 11:02
Beitrag # 12 von 21
Beitrag ID: #495106
Bewertung:
(5017 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Noch ein kleiner Tweak:

Wenn sich im Text die Überschriften nochmal ändern und ich das Skript erneut ausführe, dann wird der Text im Moment an den bestehenden angehangen.

Wenn nun in der Schleife, die die Kopfzeilen füllt, zunächst erstmal wieder jede Kopfzeile gelöscht werden soll - wie müsste das aussehen?

Danke und Gruß,
Gamurke


als Antwort auf: [#495104]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

16. Mai 2012, 11:18
Beitrag # 13 von 21
Beitrag ID: #495108
Bewertung:
(5001 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Was mir auch noch aufgefallen ist: Die Überschriften werden in der Kopfzeile in umgekehrter Reihenfolge eingetragen, als sie im Text stehen.

Wir kehrt man das um?


als Antwort auf: [#495106]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

-hans-
Beiträge gesamt: 748

16. Mai 2012, 14:41
Beitrag # 14 von 21
Beitrag ID: #495135
Bewertung:
(4936 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

eigentlich sollte der Textrahmeninhalt vor Neubefüllung entfernt werden, was bei mir auch klappt (ID CS 5.5). Habe jetzt keine Zeit zum Suchen, daher habe ich einfach einen separaten Löschlauf vornan gestellt.

Die Reihenfolge von gleichen AF im Textlauf sollte richtig sein, aber für die Suche nach mehreren AF's (und dann vllt. auch noch nicht im selben Textfluss) ist die "richtige" Reihenfolge schwer zu bestimmen. Man müsste dann wohl zu den Treffern auch noch die Koordinaten ausfiltern und nach einem Regelsatz vergleichen und erneut wegsortieren ...



Code
var customLabel = 'columnTitleSpecial';//Scriptetikett für Textbox Kolumnentitel; muss im Dokument gesetzt sein  

var theDoc = app.activeDocument;
var pStyles = theDoc.allParagraphStyles;
var pStyleStringList = [];// listbox
var foundPStyleList = [];//objects -> word, paragraph
var foundAndOffset = [];//[[offset, object], ...]



main();

function main(){
emptyTextFrames()
fillPstyleStringList();
var getPstylesIndexinpStyles = selPStyle(pStyleStringList);//[1,2,3,4, 5]
findPstylesInDoc(getPstylesIndexinpStyles);
sortFoundToPages();
//foundAndOffset.sort(Numsort)
setColumnContent(foundAndOffset)
}


function emptyTextFrames(){
var allTextFrames = theDoc.textFrames;
for(var tf = 0; tf < allTextFrames.length; tf++){
if(allTextFrames[tf].label == customLabel){allTextFrames[tf].contents = ''}
}
}

function fillPstyleStringList(){
for(var i = 0 ; i < pStyles.length; i++)
{

if(pStyles[i].parent.toString() === '[object ParagraphStyleGroup]')
{
pStyleStringList.push('Gruppe: ' + pStyles[i].parent.name + ', Name: ' + pStyles[i].name);
}else{
pStyleStringList.push('Name: ' + pStyles[i].name);
}
}
}





function selPStyle (array)
{
var myWindow = new Window ("dialog", "Absatzformate");
var myInputGroup = myWindow.add ("group");
var sel = myInputGroup.add ("listbox", [0, 0, 300, 300], array, {scrolling: true, multiselect: true});

var myButtonGroup = myWindow.add ("group");
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");

if (myWindow.show() == 1){
var theSel = sel.selection;
var tmpList = [];
for(var g = 0; g < theSel.length; g++)
{
tmpList.push(theSel[g].index)
}
return tmpList;
myWindow.close();
}else{
exit ();
}

}



function findPstylesInDoc(aArray){
for(var p = 0; p < aArray.length; p++){
var toSearch = pStyles[aArray[p]];
app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.properties = {includeFootnotes:false, includeMasterPages:false};
app.findTextPreferences.properties = {appliedParagraphStyle:toSearch};
var searchResults = theDoc.findText();
for(var s = 0; s < searchResults.length; s++){
foundPStyleList.push(searchResults[s])
}
}

}


function sortFoundToPages() {

for(var x = 0; x < foundPStyleList.length; x++){
var myOffset = foundPStyleList[x].insertionPoints[0].parentTextFrames[0].parentPage.documentOffset;

foundAndOffset.push([myOffset, foundPStyleList[x]])

}

}



function setColumnContent(foundAndOffset){

for(var q = 0; q < foundAndOffset.length; q++){
var myItem = foundAndOffset[q];

var toDelete = false;
if(foundAndOffset[q-1] != undefined && foundAndOffset[q][0] > foundAndOffset[q-1][0]){toDelete = true}

var pageTextFrames = theDoc.pages[myItem[0]].textFrames;
for(var t = 0; t < pageTextFrames.length; t++){
if(pageTextFrames[t].label === customLabel) {
if(toDelete || q === 0){pageTextFrames[t].contents = ''; var delimiter = '' }else{var delimiter = ' // '} //Trenner für Überschriften
var theContentArray = (myItem[1].contents).split('\r');
var theContentString = theContentArray.join(' ');
var theContentArray = theContentString.split('\n');
var theContentString = theContentArray.join(' ');

pageTextFrames[t].insertionPoints[-1].contents = delimiter + theContentString; break;
}
}

}
}

function Numsort (a, b) {
return a[0] - b[0];
}



als Antwort auf: [#495108]

Alle Überschriften einer Seite auslesen und in die Kopfzeile schreiben

gamurke
Beiträge gesamt: 17

25. Mai 2012, 12:16
Beitrag # 15 von 21
Beitrag ID: #495603
Bewertung:
(4784 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

diese Version funktioniert bisher prima. Die Felder werden nun zunächst gelöscht, bevor sie wieder befüllt werden.

Außerdem stimmt jetzt auch die Reihenfolge.
Hattest Du da überhaupt was verändert? Im vorherigen Script war sie genau umgekehrt (nicht chaotisch durcheinander sondern exakt umgekehrt).

Nun ist es so wie es soll.

Vielen Dank!


als Antwort auf: [#495135]
X