[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Tabellenzeilen als einzelne Textrahmen

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

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

13. Sep 2018, 10:12
Beitrag # 1 von 16
Bewertung:
(3164 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich bin auf der Suche nach einem Skript das mir jede Zeiel einer Tabelle in einen Textrahmen konvertiert.

Gibt es so ein Skript schon? Bei der Suche hier habe ich nur ein Skript gefunden, das alle Tabellen in Textrahmen konvertiert.

Code
var myDoc=app.activeDocument;    
tableList = myDoc.textFrames.everyItem().tables.everyItem();
tableList.convertToText("\t","\r");


Vielleicht brauche ich das Skript nur etwas abändern um mein Ziel zu erreichen?

Danke für eure Mithilfe.
X

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 09:00
Beitrag # 2 von 16
Beitrag ID: #566258
Bewertung:
(3123 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

das wurde vor gut vier Jahren schon einmal diskutiert:
https://www.hilfdirselbst.ch/..._P528336.html#528336

Habe es soeben mit einer einfachen Tabelle nochmals geprüft: Es funktioniert.

Gruss, Hans


als Antwort auf: [#566221]

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

14. Sep 2018, 11:34
Beitrag # 3 von 16
Beitrag ID: #566268
Bewertung:
(3108 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ja den Beitrag hatte ich schon gesehen. Aber ich möchte nicht Zellen zu Textrahmen sondern ZEILEN.

Also wenn ich eine Tabelle mit z.B. 15 Spalten und 30 Zeilen habe, dann möchte ich nach Anwendung des Skriptes 30 Textrahmen erhalten. ZEILEN zu Textrahmen nicht Zellen :-)

Wo diese Textrahmen auf der Seiten stehen oder wie groß diese sind ist mir egal.

Und ich dachte durch eine kleine Modifikation des Skriptes oben wäre das umsetzbar.

Vielleicht gibt es auch einen Trick?
Ich weiss dass JS zeilenweise auslesen kann, nur gilt das auch für in ID erstellte Tabellen?


DankeLG
faxinger


als Antwort auf: [#566258]

Tabellenzeilen als einzelne Textrahmen

Uwe Laubender
Beiträge gesamt: 5316

14. Sep 2018, 12:00
Beitrag # 4 von 16
Beitrag ID: #566270
Bewertung:
(3103 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,
was soll mit unterschiedlichen Absatzformatierungen in den Zellen einer Tabellenzeile geschehen? Soll diese der Formatierung des ersten Absatzes der ersten Zelle angepasst werden?

Also im Prinzip eine Konvertierung nach Text wie Du sie mit einer Tabelle mit einer Tabellenzeile bekommen würdest?


als Antwort auf: [#566268]

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

14. Sep 2018, 12:04
Beitrag # 5 von 16
Beitrag ID: #566271
Bewertung:
(3097 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

danke für den Hinweis,

aber die Absatzformate in den Tabellen müssen nicht berücksichtigt werden.

Hier geht es rein nur um eine zeilenweise Aufspaltung des Textes in der Tabelle.

LG
faxinger


als Antwort auf: [#566270]

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 12:24
Beitrag # 6 von 16
Beitrag ID: #566274
Bewertung:
(3091 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

ja, das hatte ich missverstanden. Doch mit convertToText() wird es nicht funktionieren.

Nachstehend das Script von 2014. So geändert, dass zuerst in jeder Reihe die Zellen vereint werden.

Code
//ZeilenZuRahmen_601d.js 
//© 14.09.2018 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
//DESCRIPTION:Tabellenzeilen in Textrahmen umwandeln

// 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");
exit();
}

// das aktuelle Dokument
var curDoc = app.documents[0];

// die Auswahl speichern und prüfen
curSel = app.selection;

if (curSel.length == 0) {
alert ("Eine Tabelle auswählen.", "Achtung");
exit();
}

var curType = curSel[0].constructor.name;

if (curType == "Table") {
var curTable = curSel[0];
}
else {
alert ("Eine Tabelle auswählen.", "Stop");
exit();
}

// in jeder Reihe die Zellen vereinen
var allRows = curTable.rows;
var nRows = allRows.length;
for (var r=nRows-1; r>-1; r--) {
allRows[r].cells[0].merge(allRows[r].cells.itemByRange(1,-1));
}

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;

// die Returns durch Tabs ersetzen
app.findTextPreferences.findWhat = "\r";
app.changeTextPreferences.changeTo = "\t";
curTable.changeText();

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;

// die Ebene "Zeilen" erzeugen
var cellsLayer = curDoc.layers.item("Zeilen");
try {
cellsLayer.locked = false;
}
catch (e){
cellsLayer = curDoc.layers.add({name:"Zeilen"});
}
app.activeWindow.activeLayer = cellsLayer;

// dis absolute Seitennummer
var p = curTable.parent.parentPage.documentOffset;

// alle Zellen
var allCells = curTable.cells;
// eine Schleife durch die Zellen
for (var c=0; c<allCells.length; c++) {
var cH = allCells[c].height; // Höhe
var cW = allCells[c].width; // Breite
var yO = allCells[c].topInset; // Zellversatz oben
var xO = allCells[c].leftInset; // Zellversatz links
// der obere Zellenrand
var y1 = (allCells[c].insertionPoints[0].baseline)-(yO*3)-0.25;
// der linke Zellenrand
var hP = (allCells[c].insertionPoints[0].horizontalOffset)-xO;
var y2 = y1+cH; // der untere Rand
var x2 = hP+cW; // der rechte Rand
// den Textrahmen erzeugen
var curFrame = curDoc.pages[p].textFrames.add({geometricBounds:[y1, hP, y2, x2], strokeColor:"None"});
// der Abstand des Textes zum Rahmen
curFrame.textFramePreferences.insetSpacing = [yO, xO, 0, 0];
// versuchen, den Inhalt der Zelle zu kopieren und einzusetzen
try {
app.select(allCells[c].texts[0]);
app.copy();
app.select(curFrame.insertionPoints[0]);
app.paste();
}
catch (e) {
}
}

// die Auswahl aufheben
app.selection = null;

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();

Dabei wird als Trenner zwischen den Zellen-Inhalten automatisch ein Return eingefügt. Damit die Höhe der Reihe erhalten bleibt, werden die Returns durch Tabs ersetzt.

Versuche es bitte mal mit dieser Lösung.

Gruss, Hans


als Antwort auf: [#566271]
(Dieser Beitrag wurde von Hans Haesler am 14. Sep 2018, 13:38 geändert)

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

14. Sep 2018, 12:57
Beitrag # 7 von 16
Beitrag ID: #566275
Bewertung:
(3077 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans, es funktioniert perfekt vielen Dank.

Ein paar Kleinigkeiten hätte ich jedoch gern anders.

1. Es soll keine neue Ebene erzeugt werden. Die aktive Ebene kann für die Textrahmen verwendet werden.
2. Es muss der Inhalt der Tabelle ausgewählt sein - da wäre es besser wenn man nur die Tabelle (den Textrahmen in dem die Tabelle steht) auswählen müsste.

Kannst du das leicht ändern?

Vielen Dank

LG
faxinger


als Antwort auf: [#566274]

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 13:30
Beitrag # 8 von 16
Beitrag ID: #566278
Bewertung:
(3069 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

Dein Wunsch ist mein Befehl :-).

Code
//ZeilenZuRahmen_602d.js 
//© 14.09.2018 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
//DESCRIPTION:Tabellenzeilen in Textrahmen umwandeln

// 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");
exit();
}

// das aktuelle Dokument
var curDoc = app.documents[0];

// die Auswahl speichern und prüfen
curSel = app.selection;

if (curSel.length == 0) {
alert ("Einen Textrahmen auswählen.", "Achtung");
exit();
}

var curType = curSel[0].constructor.name;

if (curType == "TextFrame") {
var targetFrame = curSel[0];
}
else {
if (curSel[0].hasOwnProperty("baseline")) {
targetFrame = curSel[0].parentTextFrames[0];
}
else {
alert ("Einen Textrahmen auswählen.", "Achtung");
exit();
}
}

// die im Rahmen enthalte(n) Tabelle(n)
var allTables = targetFrame.tables;
var nTables = allTables.length;

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;
// Suchen/Ersetzen-Strings
app.findTextPreferences.findWhat = "\r";
app.changeTextPreferences.changeTo = "\t";

// eine Schleife durch die Tabellen
for (var t=nTables-1; t>-1; t--) {
var curTable = allTables[t];
var allRows = curTable.rows;
var nRows = allRows.length;

// in jeder Reihe die Zellen vereinen
for (var r=nRows-1; r>-1; r--) {
allRows[r].cells[0].merge(allRows[r].cells.itemByRange(1,-1));
}

// die Returns durch Tabs ersetzen
curTable.changeText();

// dis absolute Seitennummer
var p = curTable.parent.parentPage.documentOffset;

// alle Zellen
var allCells = curTable.cells;
// eine Schleife durch die Zellen
for (var c=0; c<allCells.length; c++) {
var cH = allCells[c].height; // Höhe
var cW = allCells[c].width; // Breite
var yO = allCells[c].topInset; // Zellversatz oben
var xO = allCells[c].leftInset; // Zellversatz links
// der obere Zellenrand
var y1 = (allCells[c].insertionPoints[0].baseline)-(yO*3)-0.25;
// der linke Zellenrand
var hP = (allCells[c].insertionPoints[0].horizontalOffset)-xO;
var y2 = y1+cH; // der untere Rand
var x2 = hP+cW; // der rechte Rand
// den Textrahmen erzeugen
var curFrame = curDoc.pages[p].textFrames.add({geometricBounds:[y1, hP, y2, x2], strokeColor:"None"});
// der Abstand des Textes zum Rahmen
curFrame.textFramePreferences.insetSpacing = [yO, xO, 0, 0];
// versuchen, den Inhalt der Zelle zu kopieren und einzusetzen
try {
app.select(allCells[c].texts[0]);
app.copy();
app.select(curFrame.insertionPoints[0]);
app.paste();
}
catch (e) {
}
}
}

// die Auswahl aufheben
app.selection = null;

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();

Entweder den Textrahmen auswählen oder den Cursor in den Textrahmen setzen.

Gruss, Hans


als Antwort auf: [#566275]
(Dieser Beitrag wurde von Hans Haesler am 14. Sep 2018, 13:40 geändert)

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

14. Sep 2018, 14:08
Beitrag # 9 von 16
Beitrag ID: #566281
Bewertung:
(3044 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Super perfekt! vielen vielen Dank.

Jetzt werde ich glaube ich etwas unverschämt :-)
Aber wäre es werden die Textrahmen doppelt erstellt. Also einmal alle Textrahmen in einem Textrahmen und nur einzelne Textrahmen.

Mir würden die einzelnen genügen.
Wenns nicht geht ist das auch kein Ding. Das Skript so wie es jetzt ist, hilft mir schon seeeehr viel weiter.


LG
faxinger


als Antwort auf: [#566275]

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 14:33
Beitrag # 10 von 16
Beitrag ID: #566283
Bewertung:
(3036 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

bin gerade unterwegs. Werde im späteren Nachmittag versuchen, das Script zu ergänzen.

Gruss, Hans


als Antwort auf: [#566281]

Tabellenzeilen als einzelne Textrahmen

Uwe Laubender
Beiträge gesamt: 5316

14. Sep 2018, 14:56
Beitrag # 11 von 16
Beitrag ID: #566284
Bewertung:
(3032 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Super perfekt! vielen vielen Dank.

Jetzt werde ich glaube ich etwas unverschämt :-)


LG
faxinger


Und ich dachte, als nächstes kommt die Anforderung, dass ausschließlich Zellenreihen im ausgewählten Textrahmen konvertiert werden sollen ;-)

So kann man sich täuschen…


als Antwort auf: [#566281]

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 19:37
Beitrag # 12 von 16
Beitrag ID: #566293
Bewertung:
(2980 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxinger,

es war nicht so einfach, Deinen unverschämten Wunsch umzusetzen ...

Es ist zwar möglich, mehr als einen Textrahmen auszuwählen und zu kopieren. Aber das Einfügen in den Zielrahmen klappt nicht.

Neuer Versuch: Die Rahmen gruppieren, die Gruppe auswählen, kopieren und einfügen. Das funktioniert. Aber: Die Gruppe kann nicht mehr aufgelöst werden.

Deshalb kopiert das untenstehende Script die Rahmen einzeln, sobald sie erzeugt sind und fügt sie in den Zielrahmen ein.

Code
//ZeilenZuRahmen_603d.js 
//© 14.09.2018 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
//DESCRIPTION:Tabellenzeilen in Textrahmen umwandeln

// 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");
exit();
}

// das aktuelle Dokument
var curDoc = app.documents[0];

// die Auswahl speichern und prüfen
curSel = app.selection;

if (curSel.length == 0) {
alert ("Einen Textrahmen auswählen.", "Achtung");
exit();
}

var curType = curSel[0].constructor.name;

if (curType == "TextFrame") {
var targetFrame = curSel[0];
}
else {
if (curSel[0].hasOwnProperty("baseline")) {
targetFrame = curSel[0].parentTextFrames[0];
}
else {
alert ("Einen Textrahmen auswählen.", "Achtung");
exit();
}
}

// die im Rahmen enthalte(n) Tabelle(n)
var allTables = targetFrame.tables;
var nTables = allTables.length;

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;
// die Suchen/Ersetzen-Muster definieren
app.findTextPreferences.findWhat = "\r";
app.changeTextPreferences.changeTo = "\t";

// eine Schleife durch die Tabellen
for (var t=nTables-1; t>-1; t--) {
// die aktuelle Tabelle und ihre Reihen
var curTable = allTables[t];
var allRows = curTable.rows;
var nRows = allRows.length;

// die Abmessungen der Tabelle
var tW = curTable.width;
var tH = curTable.height;

// in jeder Reihe die Zellen vereinen
for (var r=nRows-1; r>-1; r--) {
allRows[r].cells[0].merge(allRows[r].cells.itemByRange(1,-1));
}

// die Returns durch Tabs ersetzen
curTable.changeText();

// dis absolute Seitennummer
var p = curTable.parent.parentPage.documentOffset;

// alle Zellen
var allCells = curTable.cells;
var nCells = allCells.length;
// eine Schleife durch die Zellen
for (var c=0; c<nCells; c++) {
var cH = allCells[c].height; // Höhe
var cW = allCells[c].width; // Breite
var yO = allCells[c].topInset; // Zellversatz oben
var xO = allCells[c].leftInset; // Zellversatz links
// der obere Zellenrand
var y1 = (allCells[c].insertionPoints[0].baseline)-(yO*3)-0.25;
// der linke Zellenrand
var hP = (allCells[c].insertionPoints[0].horizontalOffset)-xO;
var y2 = y1+cH; // der untere Rand
var x2 = hP+cW; // der rechte Rand
if (c == 0) {
yy1 = y1;
xx1 = hP;
// den separaten Ziel-Textrahmen erzeugen
var newFrame = curDoc.pages[p].textFrames.add({geometricBounds:[yy1, xx1, yy1+tH+1, xx1+tW+1], strokeColor:"None"});
}
// den aktuellen Textrahmen erzeugen
var curFrame = curDoc.pages[p].textFrames.add({geometricBounds:[y1, hP, y2, x2], strokeColor:"None"});
// der Abstand des Textes zum Rahmen
curFrame.textFramePreferences.insetSpacing = [yO, xO, 0, 0];
// versuchen, den Inhalt der Zelle zu kopieren und einzusetzen
try {
app.select(allCells[c].texts[0]);
app.copy();
app.select(curFrame.insertionPoints[0]);
app.paste();
}
catch (e) {
}
// den aktuellen Rahmen auswählen ...
app.select(curFrame);
// ... kopieren ...
app.copy();
// ... den Einfügepunkt auswählen ...
app.select(newFrame.insertionPoints[-1]);
// ... und die Kopie einsetzen
app.paste();
}
// den Zeilenabstand zuweisen
newFrame.parentStory.leading = (cH+"mm");
// den Rahmen nach links verschieben, damit er greifbar wird
newFrame.move(undefined, [-10,0]);
}

// die Auswahl aufheben
app.selection = null;

// die Suchen/Ersetzen-Preferences löschen
app.findTextPreferences = app.changeTextPreferences = null;

// das Ende der Aktion verkünden
var dlog = new Window("palette");
dlog.size = [320,100];
dlog.add("statictext", [80, 100, 320, 116], "Fertig.");
dlog.show();
// eine kleine Pause
$.sleep(999);
// das Fenster schliessen
dlog.close();

Der Textrahmen, welcher die einzelnen Rahmen enthält, wird am Schluss um 10 mm nach links verschoben, damit er besser greifbar ist.

Gruss, Hans


als Antwort auf: [#566281]

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

17. Sep 2018, 16:59
Beitrag # 13 von 16
Beitrag ID: #566317
Bewertung:
(2888 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

erstmal vielen vielen Dank für die tolle Umsetzung und deinen Einsatz. Leider komme ich erst jetzt dazu dir zu antworten.

Jedoch liegt hier glaub ich ein Missverständnis vor.

Das Ziel war aus jeder Zeile einer einzigen Tabelle je einen Textrahmen zu generieren. Dieser sollte jedoch nicht in einem weiteren Texrahmen enthalten sein. Bisher habe ich bei all deinen Skriptvarianten einmal die einzelnen Textrahmen (=ok) und einen weiteren Textrahmen in dem nochmal alle einzelnen Textrahmen enthalten sind. (das brauche ich nicht) :-)

Aber egal ich kann den zweiten Textrahmen auch händisch löschen.

Vielen vielen Dank für deinen Einsatz.

LG
faxinger


als Antwort auf: [#566293]

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

17. Sep 2018, 17:13
Beitrag # 14 von 16
Beitrag ID: #566318
Bewertung:
(2884 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Faxn,

bitter sehr. Ein Missverständnis? Ziemlich sicher.

Aber was meintest Du im Beitrag #9 mit ...

Zitat Jetzt werde ich glaube ich etwas unverschämt :-)
Aber wäre es werden die Textrahmen doppelt erstellt. Also einmal alle Textrahmen in einem Textrahmen und nur einzelne Textrahmen.

Gruss, Hans


als Antwort auf: [#566317]

Tabellenzeilen als einzelne Textrahmen

faxinger
Beiträge gesamt: 246

18. Sep 2018, 08:57
Beitrag # 15 von 16
Beitrag ID: #566325
Bewertung:
(2833 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ja zu diesem Zeitpunkt meinte ich schon dass eben die Textrahmen doppelt erstellt werden, was aber nicht so sein soll.
Wie gesagt im Prinzip soll es so sein dass jede Zeile der Tabelle in einen einzelnen Textrahmen umgewandelt werden soll. Und diese sollen nicht in einem weiteren Textrahmen zusammengefasst werden sondern für sich alleine stehen. Ich hoffe jetzt habe ich mich klarer ausgedrückt. :-)

LG
faxinger


als Antwort auf: [#566318]
X