Quickstart UXP Scripting

Mit InDesign CC 2023 bekommen wir das lang ersehnte moderne JavaScript. Mit UXP (Unified Extensibility Platform) ist Adobe der nächste große Wurf für die Automatisierung seiner Applikationen gelungen. Nach XD und Photoshop wurde die Technologie in InDesign implementiert.
Auch wenn es zunächst nur die reine Script-Variante ist, lässt sich schon die vollständige UXP-Unterstützung mit grafischen Benutzeroberflächen und Bedienfeldern im nächsten großen Release voraussehen.

Genug Zeit also, diesen Blog zu reaktivieren und sich mit der Technologie auseinanderzusetzen. Als Einstieg werde ich ohne ExtendScript Ballast ein kleines Skript in UXP erstellen. Später folgen dann Beiträge zum Entwicklungsworkflow, den erweiterten Möglichkeiten wie z.B. den Netzwerkzugriff und den Unterschieden zur abgelösten ExtendScript-Technologie – maßgebend für die Konvertierung von alten Skripten.

Wichtig an dieser Stelle: ExtendScript wird auch in Zukunft unterstützt! Alte Skripte müssen also nicht konvertiert werden. Es empfiehlt sich viel mehr zunächst kleinere neue Projekte mit UXP zu starten!

Los geht’s

Wir brauchen das aktuellste InDesign CC 2023 (v. 18) und einen Texteditor z.B. Visual Studio Code. Nach dem Start von InDesign siehst du im Skripte-Bedienfeld bei den Beispielskripten bereits die UXPScripts. In meinem Screenshot sind auch die beiden Benutzer-Skripte alt.jsx und neu.idjs installiert;

Bedienfeld Skripte (Fenster → Hilfsprogramme → Skripte)

Entscheidend ist die Dateiendung der Skripte: Mit .idjs startet InDesign das Skript in der UXP-Umgebung, mit .jsx wird die ExtendScript-Engine angeworfen.

Wenn du nicht weißt, wie die Skripte dahinkommen, zur Installationsanleitung hier entlang.

Hello, World!

Okay, ich bin über 40: Ich starte meine Reise immer mit einem Hello, World! Skript.

In Visual Studio Code lege ich eine neue Datei helloWord.idjs an. Rechts unten in der Statusleiste empfehle ich den Language Mode JavaScript für eine korrekte Syntaxhervorhebung:

In der ersten Zeile

let doc = app.documents.add();

erstelle ich ein neues Dokument. Leider gibt es noch keine API-Dokumentation, sodass ich aktuell nur auf die ExtendScript-Dokumentation verweisen kann, die aber fast identisch ist. Die Unterschiede werde ich in einem eigenen Beitrag beschreiben.

Für mein Beispielskript möchte ich nun auf der ersten Seite des Dokuments einen Textrahmen erstellen und diesen mit dem Text Hello, World! befüllen.

let dok = app.documents.add();
let page = dok.pages.item(0);
let textFrame = page.textFrames.add();
textFrame.geometricBounds = [15, 15, 100, 100];
textFrame.contents = "Hello, World!";

In der zweiten Zeile wird die erste Seite des Dokuments referenziert (ein InDesign-Dokument hat immer mindestens eine Seite). Auf dieser Seite erstelle ich dann in Zeile 3 einen neuen Textrahmen mit der Methode add(). Der Textrahmen in der Variablen textFrame wird mit der Eigenschaft geometricBounds die Position und Größe zugewiesen. Dazu werden die Koordinaten als Array mit den Werten [y1,x1,y2,x2] übergeben. Schlussendlich wird der Eigenschaft contents der Hallo-Welt-String zugewiesen.

Dieses einfache Programm ist fast identisch mit dem ExtendScript-Pendant. Beachte allerdings die Verwendung von let zur Deklaration der Variablen und die Adressierung der Seite über die Methode ipages.item(0) anstatt über die eckigen Klammern. Auch wenn ich die Abkürzung über die eckigen Klammern immer sehr praktisch fand, waren Sie doch nur ein ExtendScript-Hack der viele Teilnehmer:innen in meinen Schulungen immer auf die falsche Array-Fährte geführt hat.

Nach der Installation im Skripte-Bedienfeld kannst du das Skript wie gewohnt per Doppelklick starten. Das Ergebnis sieht das so aus:

Solltest du dich irgendwo vertippt haben, erscheint ein Warnfenster mit der Zeilennummer und der Fehlermeldung:

Wie man hier auf die Suche geht, zeige ich im nächsten Beitrag zum Entwicklungsworkflow mit dem Adobe UXP Developer Tool.

Wer nicht bis zum nächsten Beitrag warten kann, dem sei die InDesign UXP Scripting Übersicht von Adobe empfohlen. Leider ist diese noch stark verbesserungswürdig!