[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste

Tabellenzeilen als einzelne Textrahmen

Hans Haesler
  
Beiträge gesamt: 5826

14. Sep 2018, 12:24
Bewertung:

gelesen: 3093

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

(Dieser Beitrag wurde von Hans Haesler am 14. Sep 2018, 13:38 geändert)
Änderungsverlauf:
Beitrag geändert von Hans Haesler (Veteran) am 14. Sep 2018, 13:38