coverNach einem Jahr Arbeit und Stress ist es geschaft: Mein Buch InDesign automatisieren – Keine Angst vor Skripting, GREP & Co. erscheint heute in der 2. Auflage.

Ich freue mich, viele Erweiterungen und Neuerungen ankündigen zu können: http://www.indesignjs.de/auflage2/was-ist-neu/

Die Webseite zum Buch mit allen Infos: http://www.indesignjs.de/auflage2/

Für Fragen stehe ich natürlich gerne zur Verfügung.


Kommentar hinzufügen (0)

Lange und gerne habe ich die HTML DOM Dokumentation von Theunis de Jong (Jongware) für die InDesign Skriptentwicklung verwendet. Die von Adobe mitgelieferte Hilfe im Object Model Viewer halte ich für völlig unbrauchbar.

Da jongware seine Dokumentation nur bis InDesign CS6 zur Verfügung stellt, habe ich mich die Tage daran gemacht diese selber aus Adobes XML-Quelldaten zu transformieren. Diese XSLT-Transformation findet ihr auf github.

Interssanter ist vermutlich die Dokumentation. Sie enthält alle ExtendScript und ScriptUI Objekte und natürlich das InDesign Objekt Modell. Ihr könnt sie auch als ZIP für den Offline Zugriff herunterladen (Leider funktioniert die Offline Suche nicht mit Chrome).

 2014-10-13_105021

Zum Abschluss nochmals vielen Dank an jongware, der mit seinen Vorarbeiten dieses Projekt überhaupt erst möglich gemacht hat!


Kommentar hinzufügen (0)

Ich habe für den schweizer Publisher ein kleines Video-Interview zum Skripting gegeben. Im Rahmen der Zeit waren natürlich nur ein paar grundsätzliche Überlegungen möglich, Spaß gemacht hat es aber auf jeden Fall.


Kommentar hinzufügen (0)

Kein neues Design für meinen Blog (ja es kommt bestimmt noch dieses Jahr) aber dafür mal wieder ein richtig produktives Skript. Ein immer wiederkehrendes Problem beim EPUB-Export von InDesign sind Leerräume und Umlaute in Dateinamen von Bildern. Auch in der aktuellen InDesign CC Version 9.1 werden diese exportiert und können zu Problemen bei der Validierung des EPUBs führen. Abhilfe naht wie zu erwarten per Skript. Abgesehen von der Vorbereitung für den EPUB-Export kann das Skript natürlich auch eingesetzt werden, um den alltäglichen Kundendatenwust auf die Schnelle zu bereinigen.

Kurz zusammengefasst: Das Skript kann entweder fehlerträchtigen Zeichen aus Dateinamen entfernen oder die Verknüpfungen individuell neu nummerieren. Die neuen Dateien werden dann ähnlich der Funktion Verpacken in einem neuen Ordner gespeichert – die Variante für vorsichtige Menschen – oder die Originaldatei wird umbenannt.

Für ungeduldige geht es hier zum Download.

Die lange Version mit Bildern und Erklärung: Zum Testen baut man sich am besten ein Dokument und platziert einige obskur benannten Bilder. Die Verknüpfungspalette sollte dann ungefähr so aussehen.

links_01

Das Skript ist hoffentlich schon installiert und kann gestartet werden. Falls das aktuelle Dokument nicht gespeichert ist, wird das Skript meckern, und die Möglichkeit geben das Dokument zu speichern – so kann man elegant zur zurück letzten Version wechseln, wenn einem das Ergebnis nicht behagt. Der danach folgende Dialog sieht so aus:

gui_1

Im ersten Panel kann gewählt werden, ob die Dateien umbenannt oder in einen neuen Ordner kopiert werden sollen. Wenn kopieren gewählt wird, werden die neuen Dateien werden in einem neuen Ordner neben der InDesign-Datei gespeichert. Der Name ist newLinksFolder –  falls bereits ein Ordner mit demselben Namen besteht wird mit Hilfe von newLinksFolder_0, newLinksFolder_1, … solange inkrementiert, bis ein neuer Ordner erstellt werden kann. Das ganz kann in Zeile 108 des Skripts angepasst werden.
Vorsicht: Wenn umbenennen gewählt wird, werden die Dateien am Originalspeicherort umbenannt, das kann nicht rückgängig gemacht werden!

Spannender ist aber die Namensbildung. Im Modus Dateien umbenennen werden alle Zeichen die nicht einem lateinischen Buchstaben oder einer Zahl entsprechen umbenannt. Im Hintergrund werkelt ein recht einfacher Regulärer Ausdruck: /[^a-z\d]./gi wird ersetzt durch ein Ersatzzeichen. Bonus: Das oder die Ersatzzeichen können vom Benutzer frei festgelegt werden, wenn gar kein Zeichen eingetragen wird, werden die Zeichen entfernt.

Im Code befindet sich die entsprechende Zeile in der Funktion getNewName() in Zeile 179. Das Ganze ist dort noch etwas komplexer, weil man ggf. berücksichtigen muss, dass zwei gleich benannte Bilder aus verschiedenen Ursprungspfaden im neuen Ordner zusammengeführt werden und sich dann gegenseitig überschreiben würden. Für diesen Fall wird eine vierstellige UID gebildet und an den Dateinamen angehangen.

fileNameObject.fileName.replace(/[^a-z\d.]/gi, config.replaeChar) + (((1+Math.random())*0x10000)|0).toString(16).substring(1) + fileNameObject.fileEnding;

Vermutlich ein eher selten auftretendes Phänomen, das aber zu hässlichen Fehlern führen könnte. Danach meldet sich das Skript noch mit einem Hinweis wie viele Verknüpfungen umbenannt wurden. Die Verknüpfungspalette sollte bei der Verwendung der Standardeinstellung in etwa so aussehen:

links_02

Alternativ kann man die Verknüpfungen im Modus Verknüpfungen neu nummerieren auch aufsteigend sortiert nummerieren.

gui_2

Hier kann der Startwert, ab dem die Zählung beginnt, die Anzahl der Stellen, es werden dann ggf. führende ‘0’ hinzugefügt und ein Präfix bzw. Suffix festgelegt werden. Letztlich kann man in das Textfeld eintragen was man will nur sollte irgendwo mithilfe des #-Zeichens die Position und Anzahl der Stellen definiert werden. Der Eintrag Prä##fix würde die folgenden Dateinamen generieren Prä01fix.jpg, Prä02fix.jpg, Prä03fix.jpg und so fort. Das ganze wird ab Zeile mit ein paar String-Funktionen realisiert:

var ziffernLaenge = config.newName.lastIndexOf("#") - config.newName.indexOf("#") + 1;
var prefix = config.newName.substr(0, config.newName.indexOf ("#"));
var suffix = config.newName.substr(config.newName.lastIndexOf ("#")+1);
newFileName = prefix + pad(config.startNumber, ziffernLaenge) + suffix + getFileNameObject (relinkObjects[0].newName).fileEnding;

Die Dateinamen in der Verknüpfungpalette mit den Standardeinstellungen sind schlicht nummeriert –  vermutlich die meist gebrauchte Anforderung:

links_03

Insgesamt ist die Programmierung des Skripts recht einfach, die Herausforderung war das Handling von mehrmals platzierten Dateien und gleichen Dateinamen ab Zeile 74.

Wer das Skript verändern oder analysieren möchte, schaut sich den Quellcode an. Über Feedback freue ich mich!


Kommentar hinzufügen (2)

Über InDesign CS6 ist inzwischen viel berichtet worden, die aus meiner Sicht beste Zusammenfassung kommt mal wieder von InDesign Secrets.

Ich wurde mit der neuen Version bis jetzt noch nicht so richtig warm, es fehlten mir einerseits maßgebliche Verbesserungen beim EPUB-Export und andererseits sind viele neue Funktionen noch nicht ganz zuende gedacht. So hätte ich beispielsweise erwartet, dass man Alternate Layouts auch mit verschiedenen Document Intents (Einstellung Zielmedium) erstellen kann. Sinnvoll wäre das z.B. für die gleichzeitige Gestaltung von Print und EPUB. Aus Sicht von Adobe scheinen aber Alternate Layouts nur innerhalb eines Zielmediums (wahrscheinlich dem Tablet) sinnvoll. Auch das viel besprochene Liquid Layout hat im Praxiseinsatz noch nicht überzeugen können – so sind die notwendigen Einstellungen für ein akzeptables Ergebnis so aufwändig, dass sich der Zeitgewinn eher in Grenzen hält. Um ein Nachkontrolle kommt man sowieso nicht umhin.

Trotzdem ist CS6 hier täglich im Gebrauch und ich habe inzwischen auch meine Lieblingsfunktion gefunden: Intelligente Texteinpassung von Textrahmen.Die Einstellungen können in den Textrahmenoptionen vorgenommen werden.

In Verbindung mit der Funktionen Spaltenspanne und Konturenführung, die schon länger vorhanden sind, kann man nun endlich flexible Mustervorlagenseiten bauen. Die Kombination hat sich in der Praxis bewährt und ich kann sie nur jedem professionellen Anwender ans Herz legen.

Auch wenn sie mich als Scripter eher arbeitslos macht und ich sie meist per Hand im InDesign-Template einstelle, ein kurzer Blick auf die Programmierung:

var textFrame = app.selection[0]; 
with (textFrame.textFramePreferences) {
  autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY;
  autoSizingReferencePoint = AutoSizingReferenceEnum.TOP_CENTER_POINT;
  useMinimumHeightForAutoSizing = true;
  minimumHeightForAutoSizing  = 15;
}

Wie üblich ist die grafische Benutzeroberfläche in einer Preferences-Klasse abgebildet, die einzelnen Eigenschaften befinden sich in im konkreten Fall in textFramePreferences. Mit autoSizingType wird  festgelegt, welche Parameter des Textrahmens angepasst werden. Entsprechend sind dann auch nicht immer alle Eigenschaften bei den folgenden Einstellungen gültig. Im Falle der automatischen Höhenanpassung kann bspw. der Referenzpunkt nur auf TOP_CENTER_POINT, CENTER_POINT bzw. BOTTOM_CENTER_POINT gesetzt werden.
Übrigens könne die Einstellungen auch in den Objektformaten und beim Suchen/Ersetzen von Objekten verwendet werden.


Kommentar hinzufügen (2)

swiss-publishing-days logoNach der DPK freue ich mich auf spannende swiss publishing days vom 12. bis 13. September in Winterthur. Meine Vorträge zu medienübergreifenden Publizieren und GREP werden am Mittwoch den 12. September stattfinden. Der erste Tag steht unter dem Motto Layout, Workflow und Innovation.

Weitere Infos und das vollständige Programm finden sie auf der Website des Veranstalters!


Kommentar hinzufügen (0)

Die erste Deutsche Publishing-Konferenz startet Ende April in München. Ich werde den Vortrag InDesign Scripting Einführung halten. Mein Beitrag wird einen Schnelleinstieg ohne großes Theorie Brimborium bieten – aus der Praxis für Praktiker.

Das restliche Programm liest sich extrem spannend. Ganz besonders freue ich mich auf den Beitrag Scripting für Fortgeschrittene von Gerald Singelmann.


Kommentar hinzufügen (0)

Für die Leser des Ende Februar erscheinenden Buchs ePub für (In)Designer habe ich das Kapitel 4.8.1 Adobe-Skript FindChangeByList online gestellt.

Im Beitrag finden Sie auch eine nützliche Tabelle mit den wichtigsten Eigenschaften für das Suchen&Ersetzen!


Kommentar hinzufügen (0)

Generell ist es kein großes Problem, Skripte für vorhergehende Versionen in InDesign zum laufen zu kriegen. Auch wenn sich gerne einige Details im Document Object Model verändern, bringt jede neue InDesign Version einen abwärtskompatiblen Interpreter mit.
Entweder man stellt die Eigenschaft app.scriptPreferences.version = "#.0" am Anfang des Skripte auf die passende Version, oder verwendet eine target-Direktive #target "InDesign-#.0". Wer das ESTK nicht öffnen will verschiebt das Skript einfach in einen Ordner mit der Namenskonvention Version #.0 Scripts.

Bei den Versionen kann man nur noch über die nicht direkt intuitiven Versionsnummern stolpern – die sich aus dem Versionssprung InDesign 2.0 auf InDesign CS erklären.

Skript für … Ordner app.scriptPreferences.version #target
InDesign 2.0 Version 2.0 Scripts 2.0 “InDesign-2.0″
InDesign CS Version 3.0 Scripts 3.0 “InDesign 3.0″
InDesign CS2 Version 4.0 Scripts 4.0 “InDesign-4.0″
InDesign CS3 Version 5.0 Scripts 5.0 “InDesign 5.0″
InDesign CS4 Version 6.0 Scripts 6.0 “InDesign-6.0
InDesign CS5 Version 7.0 Scripts 7.0 “InDesign 7.0″
InDesign CS5.5 Version 7.5 Scripts 7.5 “InDesign-7.5

Wer lieber eine Benutzeroberfläche haben möchte, kann sich auch das Skript Make it Run von Martinho da Gloria herunterladen. Ich denke das folgende Bild erklärt es ganz gut.

Ich hoffe damit hat sich die ein oder andere Support-Anfrage erledigt :-/


Kommentar hinzufügen (0)

Beim EPUB- bzw. HTML-Export (Seit CS5.5 Datei → Export) stellt sich oft die Frage, welche Seitenobjekte und welche Formateinstellungen wie exportiert werden. Die folgende Tabelle gibt eine Übersicht über die Umsetzung in HTML-Elemente bzw. CSS-Regeln. Auffallend ist, dass der HTML und EPUB-Export manchmal zu verschiedenen Ergebnissen führen. Ich vermute, dass es noch weitere Unstimmigkeiten gibt – prinzipiell sollte meiner Ansicht das gleiche Ergebnis generiert werden. Einen entsprechenden Bug-Report habe ich bei Adobe eingereicht.

In den grau hinterlegten Zeilen finden Sie Seitenobjekte/Absätze bzw. Tabellen und deren xhtml-Umsetzung. InDesign schreibt übrigens xhtml mit ein paar HTML5 Einsprengseln – aber eigentlich kein HTML wie man anhand dem Namen der Funktion vermuten würde. In den weißen Zellen folgen dann immer die CSS-Eigenschaften für das vorhergehende Element.

Alternativ kann man sich auch die inhaltlich gleiche PDF Aufbereitung herunterladen und ausdrucken.

Ergänzungen und Korrekturen sind willkommen! Hinterlassen Sie einen Kommentar oder schicken Sie mir eine Mail!

Objekt/
InDesign-Eigenschaft
Element/
CSS-Deklarationen
Anmerkung
Dokument <body>
<div id="DokumentName.html">
</div>
</body>
Ggf. Sprachattribut
xml:lang="en-US"
Ränder HTML:
body { margin: 0.5em; }
EPUB:
@page { margin : 0.5em; }
Einstellung im Export-Dialog
Gruppen <div class="ObjectStyle"></div> Bei Gruppen ohne Objektformat class="group"
Rahmen von Bildern <div class="ObjectStyle"></div>
Bilder <img class="ObjectStyle"
width="#" height="#"
alt="file.jpg"
src="images/file.jpeg"/>
Format wie in Objekt­exportoptionen oder Export-Dialog JPG, GIF oder PNGBei Bildrahmen ohne Objektformat class="image"
Bildausrichtung und -abstände display: block;
margin: 1em 0 2em auto;
Bei Objektexportoptionen
Klasse img.media-#
Verankerte Bilder
mit Konturenführung
<img class="leftFloat".../>
<img class="rightFloat".../>
Feste CSS-Regel:.leftFloat {
float : left;
}
Links/Rechts Aufteilung: Position von der Zeilenmitte.
Textabschnitte/Textrahmen <div class="ObjectStyle"></div> Objektformat des ersten Textrahmens, bei Textrahmen ohne Objektformat class="story"
Absätze <p class="ParagraphStyle"></p>Lokale Abweichungen mit
class="para-style-override-#"
Zuweisung von <p>, <h1>,…<h6>
und/oder Klasse möglich.
Ggf. Sprachattribut xml:lang="en-US"
Ausrichtung text-align: left;
Einzug erste Zeile text-indent: 1px;
Abstände margin: 4px 5px 6px 7x; Kein Abstand: margin: 0;
Verschachteltes Zeichenformat CSS-Pseudoelement p.ParagraphStyle:first-line {} Wird nicht von allen Readern dargestellt
Weitere Formatierungen bei den Inline-Formaten
Nummerierte Liste <ol>
<li class="Absatzformat"></li>
</ol>
Statische Listen mit
<li value"#">
Ggf. Sprachattribut xml:lang="en-US"
Einzug Links
<ol class="List-#">
Aufzählungsliste <ul>  <li class="Absatzformat"></li>
</ul>
Ggf. Sprachattribut xml:lang="en-US"
Einzug Links
<ul class="List-#">
Abstand links <ol>/<ul> margin-left: 9px;
Abstand oben <li> margin-top: 0;
Abstand unten <li> margin-bottom: 10px;
Abstand rechts <li> margin-right: 10px;
Weitere Formatierungen wie bei Absatz oder Inline-Formaten
Inline-Formatierung <span class="CharacterStyle">
</span>
Lokale Abweichungen mit
class="char-style-override-#"
Zuweisung von <em>, <strong>, <span> und/oder Klasse möglich.
Ggf. Sprachattribut xml:lang="en-US"
Schriftart font-family: "Schriftname"; EPUB CSS: Schriftdeklaration über
@font-face {...}
Schriftgröße font-size: 0.83em;
Fett font-weight: bold;
Kursiv font-style: italic;
Kapitälchen font-variant: small-caps;
Farbe color:#000000;
Hoch/Tiefstellung vertical-align: super;
Unterstrichen text-decoration: underline;
Durchgestrichen text-decoration: line-through;
Kapitälchen font-variant: small-caps;
Versalien text-transform: uppercase;
Harter Zeilenumbruch <br/>
Hyperlinkziele/Textanker <a id="Name des Ankers"/>  Einige Reader erwarten <a id=”Name des Ankers”></a>
Hyperlink <a href="#Name des Ankers"></a>
Tabellen <table id="table-#" class="Tabellenformat"> Feste CSS-Regel:table.Tabellenformat {
border-collapse: collapse;
border-color: #000000;
border-style: solid;
border-width: 1px;
margin-bottom: -4px;
margin-top: 4px;
}
Kopf-,
Körper-,
Fußbereich
<thead></thead>,
<tbody></tbody>,
<tfoot></tfoot>
Feste CSS-Regel:tbody, thead, tfoot, tr, td, th {
border-color: inherit;
border-style: inherit;
border-width: inherit;
}
Tabellenzeilen <tr></tr> Bei angewählter Option
Abwechselndes Muster Zeile
<tr class="Row-Column-#">
Flächenfarbe background-color: #D90000;
Tabellenspalten <col class="Row-Column-#" /> Erstellung nur bei angewählter Option abwechselndes Muster Spalte
Flächenfarbe background-color: #D90000;
Tabellenzellen <td>
Lokale Abweichungen mit
class="cell-style-override-#"
Feste CSS-Regel:td {
height: 5px;
width: 10px;
}
Flächenfarbe background-color: #D90000;
Zellenversatz padding-bottom : 9px;padding-left : 6px;padding-right : 9px;padding-top : 9px; Unklare/fehlerhafte Umsetzung
Video <div class="image">  <video id="FileName.mp4" width="#" height="#" tabindex="0">    <source type="video/mp4" src="File.mp4"> </source>  </video></div>
Audio <div class="image">
<audio id="FileName.mp3" height="#" width="#" controls="controls" tabindex="0">
<source type="audio/mpeg" src="FileName.mp3"> </source>
</audio>
</div>

Kommentar hinzufügen (6)