Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Zwischenablage per JavaScript auslesen

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

20. Sep 2024, 10:12
Bewertung:

gelesen: 60248

Beitrag als Lesezeichen
Hallo Leute,

ich suche eine Möglichkeit in InDesign mit JavaScript die Zwischenablage auszulesen.
Konkret habe ich den Pfad einer Bilddatei in der Zwischenablage und möchte diese (also das Bild) in InDesign platzieren.

Habe bis jetzt nur die Möglichkeit per Apple Script gefunden.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

20. Sep 2024, 11:06
Bewertung:

gelesen: 60179

Beitrag als Lesezeichen
Moin tsOne,

erzeuge einen Textrahmen und selektiere diesen Rahmen.
speichere diesen Textrahmen:
Code
var /*TextFrame*/tF = app.selection[0]; 

Fülle die Zwischablage
dann:
Code
app.paste() 

lese den Inhalt des Textrakens in eine Variable;
Code
var /*String*/ contentClipBoard = tF.contents 

Lösche anschließend den Inhalt des Textrahmens für den nächsten Durchgang;
Code
tF.texts[0].remove(); 

Es gibt auch noch die folgenden Paste Alternativen:
undefined paste ()

Pastes data from the clipboard into the active document window.

undefined pasteInPlace ()

Pastes data from the clipboard into the active document window at the same position that the data held in its original document.

undefined pasteInto ()

Pastes data from the clipboard into the selected object in the active document window.

undefined pasteWithoutFormatting ()

Pastes data (minus formatting) from the clipboard into the active document window.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

20. Sep 2024, 11:19
Bewertung:

gelesen: 60175

Beitrag als Lesezeichen
Hallo Werner,

das mit app.paste() habe ich auch gefunden.
Was ich vergessen hatte zu schreiben, ich habe bereits den Rahmen ausgewählt, in dem das Bild platziert werden soll.
Im Moment mache ich das über promt() und kopiere den Pfad dort rein.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

20. Sep 2024, 12:01
Bewertung:

gelesen: 60158

Beitrag als Lesezeichen
Hallo Tsone,

Zitat Im Moment mache ich das über promt() und kopiere den Pfad dort rein.

????

Dann sollte das funtkionieren:

contentClipBoard aus dem obigen Beispiel, dann
Rahmen ausgewählt:
Zitat app.selection[0].place(File(contentClipBoard));


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

20. Sep 2024, 13:06
Bewertung:

gelesen: 60132

Beitrag als Lesezeichen
Im Moment sieht mein Skript so aus:
Code
var Gruppenname = app.selection[0].name; 
var url = prompt("Pfad eingeben",Gruppenname);
app.selection[0].name = url;

var _auswahl = app.selection[0];
var url = url.replace(/%20/g, " ");
if (_auswahl != undefined) {
_auswahl.place(url);
_auswahl.fit(FitOptions.FILL_PROPORTIONALLY);
_auswahl.fit(FitOptions.CENTER_CONTENT);
} else {
var myDoc = app.activeDocument;
var myFrame = myDoc.textFrames.add();
myFrame.place(url);
myFrame.fit (FitOptions.FRAME_TO_CONTENT);
}


Ich hätte dann gerne die Zeile var url = prompt("Pfad eingeben",Gruppenname); so ersetzt, dass "url" direkt aus der Zwischenablage kopiert wird.

Zwischenablage per JavaScript auslesen

Gerald Singelmann
  
Beiträge gesamt: 6290

20. Sep 2024, 13:24
Bewertung:

gelesen: 60120

Beitrag als Lesezeichen
AppleScript und VisualBasic können die Zwischenablage direkt auslesen.

Man könnte also zwei Zeilen AppleScript schreiben und diese per app.doScript() aufrufen.

Laut websearch wäre das
Code
set clipboardContent to the clipboard 


Es ist zu lange her, dass ich mir die Rückgabe von Werten aus einem doScript angeschaut habe, aber das finden Sie bestimmt mit etwas googeln raus.

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

20. Sep 2024, 14:23
Bewertung:

gelesen: 60106

Beitrag als Lesezeichen
Hallo Gerald,

dann könnte ich das auch gleich mit Apple Script machen.
Ich möchte das aber nativ als JS, damit es sowohl unter macOS als auch unter Windows funktioniert.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

20. Sep 2024, 14:36
Bewertung:

gelesen: 60102

Beitrag als Lesezeichen
Hallo Tsone,

Zitat dann könnte ich das auch gleich mit Apple Script machen.
Ich möchte das aber nativ als JS, damit es sowohl unter macOS als auch unter Windows funktioniert.

Das sehe ich genauso.
Die Sache war jetzt doch etwas schwieriger, aber so sollte es funktionieren:
Code
  main(); 

/*Void*/function main(){
try{
var /*Document*/doc = undefined,
/*Rectangle*/r = undefined,
/*TextFrame*/tF = undefined,
/*File*/f = undefined;

if (app.documents.length > 0){
doc = app.documents[0];
if (app.selection.length > 0){
if ((app.selection[0].constructor.name === "Rectangle") || (app.selection[0].constructor.name === "TextFrame")){
r = app.selection[0];
tF = doc.textFrames.add();
tF.texts[0].insertionPoints[-1].select();
app.paste();
file = File(tF.texts[0].parent.contents);
tF.remove();
if (file.exists ){
r.place(file);
}
}
}
}
}
catch (error){
alert("Fehler: " + error.message + "\n" + "in Zeile: " + error.line + "\n");

}
}


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

(Dieser Beitrag wurde von WernerPerplies am 20. Sep 2024, 14:37 geändert)

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

20. Sep 2024, 14:48
Bewertung:

gelesen: 60094

Beitrag als Lesezeichen
Hallo Werner,

das funktioniert wirklich super!
Besten Dank dafür!!!

Zwischenablage per JavaScript auslesen

Gerald Singelmann
  
Beiträge gesamt: 6290

20. Sep 2024, 18:20
Bewertung:

gelesen: 60021

Beitrag als Lesezeichen
Für die stillen Mitleser noch die saubere Lösung per doScript, mit der das Dokument nicht geändert werden muss...

Den AppleScript-Teil hatte ich fertig, als ich beim Googlen nach dem VBA Teil fand, dass das jemand längst gelöst hatte.

Code
alert(GetClipboard());   
function GetClipboard(){
var clipboard;
if(File.fs == "Macintosh"){
var script = 'tell application "Finder"\nset clip to the clipboard\nend tell\nreturn clip';
clipboard = app.doScript (script,ScriptLanguage.APPLESCRIPT_LANGUAGE);
} else {
var script = 'Set objHTML = CreateObject("htmlfile")\r'+
'returnValue = objHTML.ParentWindow.ClipboardData.GetData("text")';
clipboard = app.doScript(script,ScriptLanguage.VISUAL_BASIC);
}
return clipboard;
}


Code von Harbs, gefunden von Gregor Fellenz.
https://gist.github.com/...f1424c3a73f34e75b789

Interessante Idee, in VBA über ein HTML-Objekt zu gehen :)

Zwischenablage per JavaScript auslesen

Gerald Singelmann
  
Beiträge gesamt: 6290

20. Sep 2024, 18:25
Bewertung:

gelesen: 60019

Beitrag als Lesezeichen
PS. Hier auch noch mein AppleScript-Ansatz, der dem Scripting-SDK folgt und die ScriptArgs nimmt. Etwas komplizierter, aber so kann man auch beliebig viele Werte aus einem doScript zurückgeben.

Code
function get_clipboard(){ 
//![Script args from do script.]
if(File.fs == "Windows") {
// Siehe oben
} else {
//Create a string to be run as a AppleScript.
p1 = "tell application \"Adobe InDesign 2021\"\r";
p2 = "tell script args" +"\r";
p3 = "set value name \"clipboard\" value ";
p4 = "(the clipboard as text)\r";
p7 = "end tell" + "\r"
p8 = "end tell" + "\r"
var myAppleScript = p1 + p2 + p3 + p4 + p7 + p8;
app.doScript(myAppleScript, ScriptLanguage.applescriptLanguage);
}
var myScriptArgumentA = app.scriptArgs.getValue("clipboard");
return myScriptArgumentA;
}
alert( get_clipboard() );


Ein Nachteil dieser Lösung ist natürlich, dass der String ""tell application \"Adobe InDesign 2021\"" die aktuelle Versionsnummer von InDesign braucht. Kann man sich natürlich aus app.version herleiten...

Zwischenablage per JavaScript auslesen

gfellenz
Beiträge gesamt: 122

21. Sep 2024, 14:14
Bewertung:

gelesen: 59790

Beitrag als Lesezeichen
Zitat Code von Harbs, gefunden von Gregor Fellenz.
https://gist.github.com/...f1424c3a73f34e75b789


Haha. 9 Jahre später lerne ich meinen Code via Hilfdirselbst erneut kennen :)
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

22. Sep 2024, 09:11
Bewertung:

gelesen: 59541

Beitrag als Lesezeichen
Hallo Gerald,

vielen Dank für deine Ergänzungen.

Mit den Apple-Script-/VBA-Ansatz kann man natürlich noch viel weiter gehen und mehr automatisieren.

Auf alle Fälle nochmals vielen Dank an alle und an das Forum. Das hat mir in der Vergangenheit schon oft sehr weitergeholfen.

Zwischenablage per JavaScript auslesen

Beobachter
Beiträge gesamt: 140

4. Okt 2024, 18:12
Bewertung:

gelesen: 55437

Beitrag als Lesezeichen
Das Script interessiert mich, ich weiss aber nicht, wie ich es in InDesign, CC22, 17.4.1 zum Laufen bringe. Danke für eure Hilfe. Liebe Gruess und es schöns Wucheend, Michel

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

7. Nov 2024, 10:41
Bewertung:

gelesen: 46944

Beitrag als Lesezeichen
Antwort auf: Das Script interessiert mich, ich weiss aber nicht, wie ich es in InDesign, CC22, 17.4.1 zum Laufen bringe. Danke für eure Hilfe. Liebe Gruess und es schöns Wucheend, Michel


Hallo Michel,

welches Script meinst du konkret?

Zwischenablage per JavaScript auslesen

Beobachter
Beiträge gesamt: 140

2. Dez 2024, 15:12
Bewertung:

gelesen: 20211

Beitrag als Lesezeichen
Es interessiert mich die Möglichkeit, ein Bild in InDesign zu platzieren, dessen Pfad sich aktuell in der Zwischenablage befindet.
Gruess, Michel

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

2. Dez 2024, 15:42
Bewertung:

gelesen: 20196

Beitrag als Lesezeichen
Hallo Michel,

hast du dieses Script mal bei dir getestet?

Code
main();  

/*Void*/function main(){
try{
var /*Document*/doc = undefined,
/*Rectangle*/r = undefined,
/*TextFrame*/tF = undefined,
/*File*/f = undefined;

if (app.documents.length > 0){
doc = app.documents[0];
if (app.selection.length > 0){
if ((app.selection[0].constructor.name === "Rectangle") || (app.selection[0].constructor.name === "TextFrame")){
r = app.selection[0];
tF = doc.textFrames.add();
tF.texts[0].insertionPoints[-1].select();
app.paste();
file = File(tF.texts[0].parent.contents);
tF.remove();
if (file.exists ){
r.place(file);
}
}
}
}
}
catch (error){
alert("Fehler: " + error.message + "\n" + "in Zeile: " + error.line + "\n");

}
}

Zwischenablage per JavaScript auslesen

Beobachter
Beiträge gesamt: 140

5. Dez 2024, 10:07
Bewertung:

gelesen: 19894

Beitrag als Lesezeichen
Der Code funktioniert leider nicht

Mein Vorgehen:
URL ist im Zwischenspeicher > Bildrahmen in InDesign ausgewählt > Starte Skript > nichts passiert …

… vielleicht auch, weil die kopierte URL auf ein GoogleDrive verweist?

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

5. Dez 2024, 10:38
Bewertung:

gelesen: 19885

Beitrag als Lesezeichen
Bei mir funktioniert das Script auf dem Mac und die Bilddateien liegen auf OneDrive. Mit Google Drive habe ich es nicht getestet.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

5. Dez 2024, 10:58
Bewertung:

gelesen: 19864

Beitrag als Lesezeichen
Moin,

es gibt keine Fehlermeldung, weil Du die Existenz der Datei prüfst und das Skript gar nicht r.place ausführt.

Place erwartet wohl einen lokalen Pfad.

Lass Dir Mal den Pfad anzeigen:
--> alert(file.fullName);

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

5. Dez 2024, 11:02
Bewertung:

gelesen: 19862

Beitrag als Lesezeichen
Moin,

bist Du Sicher, dass Du nicht die lokale Kopie benutzt?

Kopiere doch mal einen erzeigten Link von OneDrive in die Zwischenablage.

Lass Dir mal den Pfad anzeigen:
--> alert(file.fullName);

Ein OneDrive-Link sieht so aus:
https://wernerperplies-my.sharepoint.com/:i:/g/personal/werner_perplies_weepee_eu/ERGZH6cYKDhAlMVp4cOFNGcBgrHpdlrCq6YbvxkCJopr9A?e=hGxJBX

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

5. Dez 2024, 11:30
Bewertung:

gelesen: 19849

Beitrag als Lesezeichen
Hallo Werner,

bei mir sehen die Links so aus:
Code
/Users/BENUTZERNAME/Library/CloudStorage/OneDrive-FreigegebeneBibliotheken–FIRMENNAME/Team WerbungGrafik - Dokumente/4_Bilddaten/DATEINAME.ai 


Das ist im Prinzip der Dateipfad in Finder. Sobald eine Datei aus OneDrive angefordert wird, läd die OneDrive-App die Datei lokal herunter.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

5. Dez 2024, 11:42
Bewertung:

gelesen: 19842

Beitrag als Lesezeichen
Genau,

Du verwendest einen lokalen Pfad, deswegen funktioniert das Skript.
Und ich vermute mal, das Beobachter einen Pfad verwendet, der auf eine Webadresse verweist.

Ich denke aber, dass auch GoogleDrive eine lokale Kopie kennt.

Das gilt aber nur für das eigene Konto und nicht für freigegebene Links.

Wenn also mehrere Anwender mit gleichen lokalen Kopien arbeiten wollen, müssen Sie ein gemeinsames Konto verwenden.

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

Zwischenablage per JavaScript auslesen

tsone
Beiträge gesamt: 98

5. Dez 2024, 12:04
Bewertung:

gelesen: 19823

Beitrag als Lesezeichen
Genau. OneDrive oder Google Drive müssen ins Dateisystem des jeweiligen Betriebssystem integriert sein. Also entweder über den Finder oder Windows Explorer aufrufbar sein.

Zwischenablage per JavaScript auslesen

WernerPerplies
Beiträge gesamt: 2817

5. Dez 2024, 12:25
Bewertung:

gelesen: 19808

Beitrag als Lesezeichen
Ich würde das Skript noch etwas gesprächiger machen:

Code
    main();   

/*Void*/function main(){
try{
var /*Document*/doc = undefined,
/*Rectangle*/r = undefined,
/*TextFrame*/tF = undefined,
/*File*/f = undefined;

if (app.documents.length > 0){
doc = app.documents[0];
if (app.selection.length > 0){
if ((app.selection[0].constructor.name === "Rectangle") || (app.selection[0].constructor.name === "TextFrame")){
r = app.selection[0];
tF = doc.textFrames.add();
tF.texts[0].insertionPoints[-1].select();
app.paste();
file = File(tF.texts[0].parent.contents);
tF.remove();
if (file.exists ){
r.place(file);
} else {
throw Error("Datei\n" + file.fullName + "\nnicht gefunden!");
}
} else {
alert("Fehler: " + error.message + "\n" + "in Zeile: " + error.line + "\n");
}
} else {
throw Error("Kein Zielabjekt selektiert!");
}
}
}
catch (error){
alert("Fehler: " + error.message + "\n" + "in Zeile: " + error.line + "\n");

}
}


Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen