[GastForen Programmierung/Entwicklung AppleScript Einzelne InDesign-Objekte kopieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Einzelne InDesign-Objekte kopieren

StefanK
Beiträge gesamt: 10

6. Aug 2010, 16:43
Beitrag # 1 von 18
Bewertung:
(10322 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich möchte per AppleScript einzelne Objekte innerhalb eines InDesign-CS4-Dokumentes auswählen, in ein neues Dokument kopieren und dort in anderer Zusammenstellung und Formatierung wieder platzieren.

Mein Problem ist nun, wie kennzeichne ich (manuell) die Objekte im Ursprungsdokument so, dass ich sie per Script auswählen und kopieren kann?

Auf eine Ebene legen geht nicht, da bereits Ebenen für Sprachwechsel definiert sind. Ich dachte zuerst an XML-Tags, schaffe es aber nicht die Objekte (Textrahmen) darüber auszuwählen. Geht das überhaupt oder hat jemand noch eine andere Idee, wie sich das bewerkstelligen lässt?
Ist es z. B. möglich jedem Rahmen eine definierte ID oder Namen zu geben?

Ich bin für jeden Lösungsansatz dankbar.

Gruß Stefan
X

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

6. Aug 2010, 22:07
Beitrag # 2 von 18
Beitrag ID: #448367
Bewertung:
(10295 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stefan,

es ist möglich, jedem Rahmen einen Namen zu verpassen. Manuell oder per Script (beim Erzeugen). Der englische Ausdruck ist label (= Etikette).
Und diese Labels können zum Adressieren der Objekte per Script benutzt werden.

Zu manuellen Benennen muss das Bedienfeld "Skriptbezeichnung" geöffnet werden: Menü "Fenster", Artikel "Automatisierung", Unterartikel "Skriptbezeichnung".

Dann geht man am besten so vor: Einen Rahmen mit einem Pfeilwerkzeug auswählen (schwarz oder weiss) und in die Fläche des Bedienfelds "Skriptbezeichnung" klicken. Der Cursor blinkt und man kann den Namen eintippen.

Zum Bestätigen nie die Return-Taste antippen. Sonst ist ein Return Teil des Namens und wenn im Script nur der sichtbare Teil verwendet wird, funktioniert es nicht. Mit "Enter" sollte es aber klappen. Ein Klick auf ein anderes Objekt (oder auf eine leere Stelle der Seite) ist auch möglich. Aber am sichersten ist das Benutzen der Tabulator-Taste.

Wenn alle Objekte gelabelt sind, können sie per Script ins zweite Dokument kopiert werden, ohne dass sie dazu ausgewählt werden. Es sei denn, man müsste die Schichtung beibehalten.

Gruss, Hans


als Antwort auf: [#448358]

Einzelne InDesign-Objekte kopieren

StefanK
Beiträge gesamt: 10

9. Aug 2010, 13:17
Beitrag # 3 von 18
Beitrag ID: #448451
Bewertung:
(10241 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Hans,

dass ist genau das, was ich vergeblich gesucht hatte.

Gruß Stefan


als Antwort auf: [#448367]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

21. Apr 2011, 07:59
Beitrag # 4 von 18
Beitrag ID: #469688
Bewertung:
(9719 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich häng' mich hier mal ran. :-)

Bei mir will das einfach nicht funktionieren ...

Ich habe dem Rahmen ein "Scriptetikett" gegeben - z.B. mybox und will diesen dann mit:

tell rectangle "mybox" of page 1 of document 1
do something
end tell

ansprechen.

Kennt jemand eine gute Übersicht für AS mit ID?

Dank und Gruß
Bernhard


als Antwort auf: [#448451]

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

21. Apr 2011, 08:57
Beitrag # 5 von 18
Beitrag ID: #469693
Bewertung:
(9705 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Bernhard,

also ... mit do something kann es nicht funktionieren. ;-)

Spass beiseite. Ich vermute, dass Du InDesign CS5 benutzest. Mit dieser Version wurden das Ebenenbedienfeld an jenes von Illustrator angepasst: Jedes Objekt hat eine eigene Unterebene.

Mit dem Pfeilwerkzeug Deinen Bildrahmen auswählen und im Bedienfeld "Ebenen" auf den Pfeil vor "Ebene 1" klicken. Jetzt erscheinen die Unterebenen aller Objekte des aktiven Druckbogens. Der ausgewählte Rahmen ist mit einem farbigen Quadrat gekennzeichnet. Und der Eintrag ist "<Rechteck>".

Wenn Du jetzt anstelle dieses Eintrages den Namen mybox eintippst, dann wird Dein Script funktionieren. Das Attribut name wurde den Objekten weggenommen und den Ebenen zugewiesen.

Das war ein grosses Problem, als CS5 erschien. Viele Scripts funktionierten nicht mehr. Als "Lösung" habe ich ein JavaScript veröffentlicht. Name statt Etikett kopiert die Labels aller Objekte ins Namens-Attribut der Ebenen. Dieses Script ist hier erhältlich: http://www.fachhefte.ch, Links "JavaScripts", Mac OS X deutsch", "InDesign CS5". Klick auf "weiter", zur Seite 2.

Nach dem Ausführen dieses Scripts konnten die alten Scripts unverändert benutzt werden. Bedingung: Es dürfen nicht zwei Objekte denselben Namen haben. Sonst wird nur das oberste gefunden.

Mit JavaScript gibt es in diesem Fall nur eine Lösung: Wieder das Etikett (= label) benutzen. Und eine Schleife durch alle Objekte machen.

Mit AppleScript ist es einfacher. Dank every können alle Objekte mit demselben Label gefunden werden. Funktioniert auch mit nur einem Rahmen.

Code
tell application "Adobe InDesign CS5" 
tell document 1
tell page 1
tell (every rectangle whose label is "mybox")
set gB to geometric bounds
end tell
end tell
end tell
end tell

Gruss, Hans


als Antwort auf: [#469688]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

25. Apr 2011, 17:47
Beitrag # 6 von 18
Beitrag ID: #469842
Bewertung:
(9640 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

herzlichen Dank für deine informativen Ausführungen!

Bei mir will das einfach nicht. :-(

Das Script läuft sonst aus FileMaker heraus. Um es davon zu lösen, hier eine Variante, die auch ab Script-Editor läuft - oder auch nicht ...:
Code
set theFile to choose file with prompt "Bitte Datei auswählen:" without invisibles 
tell application "Adobe InDesign CS5"
tell document 1
tell page 1
tell (every rectangle whose label is "mybox")
place theFile
end tell
end tell
end tell
end tell

Ändere ich:
Code
			tell (every rectangle whose label is "mybox") 

nach:
Code
			tell rectangle 1 


funktionierts ...

Im Anhang die ID-Datei. Mac OS 10.5.8 und ID 7.0.3

Was mach' ich falsch?

Dank und Gruß
Bernhard


als Antwort auf: [#469693]
Anhang:
mybox-dok.indd.zip (36.2 KB)

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

25. Apr 2011, 19:37
Beitrag # 7 von 18
Beitrag ID: #469844
Bewertung:
(9623 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

bitteschön.

Gut, dass Du das Testdokument bereitgestellt hast. Wenn der leere Bildrahmen ausgewählt ist, sieht man dass die Öffnung "Skriptetikett" leer ist. Das ist der Grund, weshalb es mit label nicht funktioniert.

Mit "rectangle 1" wird der in der Z-Achse zuvorderst liegende Bildrahmen adressiert. Dazu wird aber weder eine Etikette noch ein Name benutzt.

Im Bedienfeld "Ebenen", hingegen, ist "mybox" eingetragen. Wenn im Script das label durch name ersetzt wird, dann funktioniert es mit dem Importieren des Bildes.

Gruss, Hans


als Antwort auf: [#469842]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

26. Apr 2011, 07:03
Beitrag # 8 von 18
Beitrag ID: #469847
Bewertung:
(9579 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nochmals vielen Dank, Hans!

Mit name funktioniert's. *freu*

Wenn wir schon beim Thema sind: Wie kann ich denn einen aktivierten Rahmen ansprechen?

Dank und Gruß
Bernhard


als Antwort auf: [#469844]

Einzelne InDesign-Objekte kopieren

-hans-
Beiträge gesamt: 748

26. Apr 2011, 08:27
Beitrag # 9 von 18
Beitrag ID: #469848
Bewertung:
(9563 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen,

Code
tell application "Adobe InDesign CS5"  
--selection ist eine Liste, daher item 1 of ...
set theSel to item 1 of selection
end tell


Tschöle

Hans-Gerd Claßen


als Antwort auf: [#469847]

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

26. Apr 2011, 09:08
Beitrag # 10 von 18
Beitrag ID: #469851
Bewertung:
(9554 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

der Hans-Gerd ist mir zuvorgekommen. Ich postet dennoch meine etwas ausführlichere Antwort.

Ein Bildrahmen ist ausgewählt. Das Ergebnis von ...

Code
tell application "Adobe InDesign CS5" 
selection
end tell

... ist eine Objektreferenz in Form einer Liste (erkennbar an den Akkoladen):

Code
{rectangle id 204 of spread id 183 of document id 1 of application "Adobe InDesign CS5"} 

Sind aber zwei Bildrahmen ausgewählt, dann enthält die Liste zwei Elemente:

Code
{rectangle id 198 of spread id 183 of document id 3 of application "Adobe InDesign CS5", rectangle id 205 of spread id 183 of document id 3 of application "Adobe InDesign CS5"} 

Und wenn kein Rahmen ausgewählt ist, würde bei einem Ladeversuch ... nichts geschehen.

Deshalb kann man die Auswahl in eine Variable geben, die Anzahl Elemente feststellen, mit einem "if/else if"-Test die entsprechende Aktion auslösen.

Zusätzlich wird hier der Inhalts-Typ des Rahmens geprüft. Und so kann – z.B. bei der Auswahl einer Gruppe – eine verständlichere Fehlermeldung gezeigt werden, als es InDesign tun würde.

Code
tell application "Adobe InDesign CS5" 
activate
set curSel to selection
set nRect to (count of curSel)
if nRect is 1 then
try
if content type of selection is graphic type then
set theFile to choose file with prompt "Bitte Datei auswählen:" without invisibles
tell selection
place theFile
end tell
else
display dialog "Nur einen *Bildrahmen* auswählen." buttons "OK" default button 1 with icon 2
end if
on error
display dialog "Es ist kein *Bildrahmen* ausgewählt." buttons "OK" default button 1 with icon 0
end try
else if nRect is greater than 1 then
display dialog "Nur *einen* Rahmen auswählen." buttons "OK" default button 1 with icon 0
else
display dialog "Bitte einen Bildrahmen auswählen." buttons "OK" default button 1 with icon 2
end if
end tell

Gruss, Hans


als Antwort auf: [#469848]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

26. Apr 2011, 19:09
Beitrag # 11 von 18
Beitrag ID: #469898
Bewertung:
(9511 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Habt vielen Dank für eure Antworten! Prima!

Nochmal zu:
tell (every rectangle whose name is "mybox")

Ganz gemein, wenn man auf Fehlersuche ist ("Eben hat's doch noch funktioniert!"): Sobald "mybox" Teil einer Gruppe ist, funktioniert's nicht mehr. Elemente innerhalb einer Gruppe müssen wohl über den Gruppen-Namen angesprochen werden ... :-(

Dank und Gruß
Bernhard


als Antwort auf: [#469851]

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

26. Apr 2011, 20:11
Beitrag # 12 von 18
Beitrag ID: #469901
Bewertung:
(9503 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Bernhard,

normalerweise werden Gruppen nicht benannt. Aber das Gruppieren verhindert den direkten Zugang zu einem benannten Rahmen.

Abhilfe: Mit all page items alle Objekte verlangen. Damit wird die Gruppe "auseinandergenommen", ohne sie zu entgruppieren.

Im Ergebnis sind die Objektreferenzen von allen Objekten einzeln aufgelistet: Nichtgruppierte Rahmen, aber auch Gruppen und deren Rahmen. Zusätzlich noch eventuelle Bilder (die "images", nicht die Bildrahmen, welche separat in der Liste sind).

Dann macht man eine Schleife durch die Liste und holt vom aktuellen Element den Namen. Stimmt der mit dem gewünschten überein, lässt man das Bild laden.

Code
set theFile to choose file with prompt "Bitte Datei auswählen:" without invisibles 
tell application "Adobe InDesign CS5"
activate
tell document 1
tell page 1
set allFrames to all page items
repeat with i from 1 to count of allFrames
if name of item i of allFrames is "mybox" then
place theFile on item i of allFrames
exit repeat
end if
end repeat
end tell
end tell
end tell

Mit "exit repeat" wird die Schleife verlassen, nachdem das Bild geladen ist. Dadurch wird bei einer grösseren Anzahl von Rahmen die Ausführungszeit abgekürzt.

Gruss, Hans


als Antwort auf: [#469898]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

2. Mai 2011, 10:06
Beitrag # 13 von 18
Beitrag ID: #470347
Bewertung:
(9360 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

WOW - vielen lieben Dank! :-)

Nun versuche ich gleiches mit Text, was auch gut funktioniert:
Code
tell application "Adobe InDesign CS5" 
tell document 1
tell page 1
tell (every text frame whose name is "mytext")
tell parent story
set contents to "Lorem ipsum"
end tell
end tell
end tell
end tell
end tell

Da ich jedoch eine (1) Text-Box an zwei Stellen mit zwei verschiedenen Inhalten füllen will, soll nun nach vorhandenem Text gesucht und dieser dann erstetzt werden. Laut Adobes Scripting-Guide funktioniert das mittels:
Code
set find what of find text preferences to "x" 
set change to of change text preferences to "y"

Das klappt an sich auch, jedoch nicht mit einem benannten Text-Rahmen:
Code
tell application "Adobe InDesign CS5" 
tell document 1
tell page 1
tell (every text frame whose name is "mytext")
tell parent story
set find what of find text preferences to "pos"
set change to of change text preferences to "text"
end tell
end tell
end tell
end tell
end tell

Meldung: Kann nicht als "pos" gesetzt werden.

Die Problematik mit den Gruppen will auch bei set contents to "Lorem ipsum" in Verbindung mit der repeat-Schleife nicht funktioniert ...

Weisst du, woran das liegt?

Dank und Gruß
Bernhard


als Antwort auf: [#469901]

Einzelne InDesign-Objekte kopieren

Hans Haesler
  
Beiträge gesamt: 5822

2. Mai 2011, 10:39
Beitrag # 14 von 18
Beitrag ID: #470355
Bewertung:
(9351 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Bernhard,

mit find text preferences und change text preferences werden die Suchen/Ersetzen-Vorgaben vorbereitet. Diese Befehle sind auszuführen, bevor der Text adressiert wird.

Zum eigentlichen Ersetzen wird nur change text verwendet.

Nachstehend werden zum Schluss die Vorgaben wieder geleert, damit sie nicht im Suchen/Ersetzen-Dialog erhalten bleiben. Doch gibt es Scripter, welches dieses Zurücksetzen bewusst unterlassen.

Code
tell application "Adobe InDesign CS5" 
activate
set find what of find text preferences to "pos"
set change to of change text preferences to "text"
tell document 1
tell page 1
tell (every text frame whose name is "mybox")
tell parent story
change text
end tell
end tell
end tell
end tell
set find what of find text preferences to nothing
set change to of change text preferences to nothing
end tell

Gruss, Hans


als Antwort auf: [#470347]

Einzelne InDesign-Objekte kopieren

Bernhard Werner
Beiträge gesamt: 5122

2. Mai 2011, 10:50
Beitrag # 15 von 18
Beitrag ID: #470360
Bewertung:
(9345 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Hans! Hab' mich schon gefragt, was das "text preferences" soll.

Ist dir ein Weg bekannt, Text zu suchen und zu ersetzten ohne ihn zuvor als Vorgabe zu definieren?

Dank und Gruß
Bernhard


als Antwort auf: [#470355]
X