IDML-Creator 5.7: Tags, konsequent Enums und ein schnellerer Generator.

Geschrieben von Tobias Köngeter am 14. September 2026.

Der Bit&Black IDML-Creator erzeugt InDesign-Dokumente (.idml-Dateien) direkt aus PHP. Version 5.7 ist eine dieser Versionen, die sich wie ein Meilenstein anfühlt: Sie fügt die XML-Ebene eines InDesign-Dokumentes hinzu, führt Enums für fast jeden Stilwert ein, vereinfacht das gesamte Paket rund um die Factory, sortiert Ihre Stile so, wie InDesign es tut, und macht den Generator deutlich schneller.

Tags – die XML-Struktur eines InDesign-Dokumentes

Adobe-InDesign-Dokumente tragen zwei parallele Strukturen. Auf der einen Seite liegt das Layout: Seiten, Rahmen, Tabellen, Stile. Auf der anderen Seite liegt die XML-Struktur: der Inhalt, den InDesign nach XML exportieren oder aus XML importieren kann, während die Zuordnung von Tag und Stil die Formatierung intakt hält. Bislang beherrschte der IDML-Creator nur die Sprache des Layouts. Mit Version 5.7 spricht er nun auch die XML-Sprache.

Ein Tag wird mit der neuen Klasse XMLTag definiert und an der Factory registriert:

<?php

use BitAndBlack\IdmlCreator\Content\Enum\Color;
use BitAndBlack\IdmlCreator\Factory;

$factory = new Factory();

$xmlTag = $factory->createXmlTag('Body');
$xmlTag->setTagColor(Color::ORANGE);

Jedes Tag erhält eine Farbe, damit es in InDesign von anderen Tags unterschieden werden kann. Ein Standard-Root-Tag wird automatisch erzeugt; jedes benutzerdefinierte Tag wird darunter in der XML-Struktur einsortiert.

Ein Tag ist für sich genommen leer – es wird erst dann bedeutungsvoll, wenn es mit Inhalt kombiniert wird. Die neue Klasse XMLElement verbindet ein Tag mit dem entsprechend getaggten Teil des Dokumentes:

<?php

use BitAndBlack\IdmlCreator\Content\Xml\XMLElement;

$xmlElement = new XMLElement($xmlTag, $paragraphStyleRange);

Ein XMLElement akzeptiert Absätze, Textabschnitte, Tabellen und Zellen, weitere XMLElement – die Tags lassen sich also zu einer Hierarchie verschachteln – sowie weitere Seitenelemente wie Textrahmen. Da die XML-Elemente in derselben Reihenfolge bleiben müssen wie der gesetzte Inhalt, kann ein XMLElement auch direkt in den Inhalt eines Absatz- oder Zeichenformatbereichs eingefügt werden. Das macht Inline-Tags möglich, um beispielsweise ein einzelnes Wort innerhalb eines Absatzes zu taggen:

<?php

use BitAndBlack\IdmlCreator\Content\Story\CharacterStyleRange;
use BitAndBlack\IdmlCreator\Content\Story\Text;

new CharacterStyleRange(
    null,
    new XMLElement(
        $xmlTagInline,
        new CharacterStyleRange(
            $boldRed,
            new Text('IDML-Creator'),
        ),
    ),
);

Die Elemente können mit XML-Attributen, Kommentaren und Processing Instructions ausgestattet werden:

<?php

use BitAndBlack\IdmlCreator\Content\Xml\XMLAttribute;
use BitAndBlack\IdmlCreator\Content\Xml\XMLComment;
use BitAndBlack\IdmlCreator\Content\Xml\XMLInstruction;

$xmlElement
    ->addXmlAttribute(new XMLAttribute('Class', 'headline'))
    ->addXmlComment(new XMLComment('Generated by IDML-Creator'))
    ->addXmlInstruction(new XMLInstruction('xml-stylesheet', 'type="text/xsl" href="structure.xsl"'))
;

Auch Tabellen, Zellen und Seitenelemente (Rechtecke, Ovale, Polygone, Grafiklinien, Textrahmen) können getaggt werden. Tabellen und Zellen haben im gesetzten Dokument keine Markierungszeichen, daher setzt ihr XMLElement das Attribut NoTextMarker automatisch. Und da jedes Tag, das seinen Namen mit einem Absatz- oder Zeichenformat teilt, ihm automatisch zugeordnet wird, werden die XMLExportMap und die passende Import-Map für Sie in die optionale Datei XML/Mapping.xml geschrieben.

Die XML-Struktur wird in XML/BackingStory.xml geschrieben – und Sie müssen weder die BackingStory noch den Container mehr manuell erzeugen, das übernimmt das Content-Objekt.

Um jede Situation im Kontext zu sehen, schauen Sie sich das neue Beispiel using-xml-tags.php an.

Enums statt magischer Zeichenketten

Die Attributwerte der Content-Klassen werden jetzt durch Enums abgedeckt: Farben, Verläufe, Inhaltstypen, Rahmentypen, Konturen, die Seiteneinrichtung sowie die Zeichen-, Absatz-, Objekt- und Tabellenformate leben alle im Namespace \BitAndBlack\IdmlCreator\Content\Enum.

<?php

use BitAndBlack\IdmlCreator\Content\Enum\Color\Model;
use BitAndBlack\IdmlCreator\Content\Enum\Styles\Capitalization;

$color->setModel(Model::PROCESS);
$characterStyle->setCapitalization(Capitalization::SMALL_CAPS);

Die Setter akzeptieren sowohl den Enum als auch den bisherigen String-Wert, sodass bestehender Code weiterhin funktioniert – ein Aufruf eines Setters mit einem String löst nun eine E_USER_DEPRECATED-Notiz aus und wird in v6.0 entfernt. Das neue InDesignVersionAwareInterface markiert jedes Objekt, das die InDesign-Version trägt, für die es erstellt wurde.

Die Factory übernimmt die schwere Arbeit

Mit der automatischen Erzeugung von BackingStory und Container sowie den neuen Gettern getDesignMap() und getPreference() ist die Singletons-Einrichtung des Dokumentes Geschichte – Sie sprechen nur noch mit der Factory. Auch Objektformate werden über sie erzeugt:

<?php

$objectStyle = $factory->createObjectStyle('Fancy Frame');

Alle Beispiele wurden umgestaltet, um dieses Muster zu verwenden, und die Dokumentation wurde mit neuen Kapiteln über die Enums, den Schnellstart, Formen, Textrahmen, Tabellen, das Gestalten von Text und das Gestalten von Objekten neu gegliedert.

Die Reihenfolge, in der Ihre Stile in InDesign erscheinen

Bislang wurden die Stile in der Reihenfolge an InDesign übergeben, in der Sie sie erstellt haben. Version 5.7 sortiert so, wie InDesign es selbst tut: Stile, Farben, Tönungen, Mischfarben und die grafischen XML-Einträge werden nun ohne Berücksichtigung der Groß- und Kleinschreibung alphabetisch sortiert. Akzentuierte Zeichen wie Umlaute sortieren zusammen mit ihren Basisbuchstaben, sodass „Öffnungszeiten" zwischen dem „N" und dem „P" erscheint statt am Ende der Liste, und Zahlen behalten ihre natürliche Reihenfolge – „Body 2" kommt vor „Body 10". Tönungen werden direkt nach ihrer Basisfarbe einsortiert, von dunkel nach hell: „Red", „Red 80 %", „Red 20 %".

Unter der Haube wird die sprachbezogene Unicode-Kollation von ICU verwendet, sofern die intl-Erweiterung verfügbar ist; andernfalls greift ein gleichwertiger Pure-PHP-Vergleich als Fallback, sodass das Ergebnis auf jeder Umgebung identisch ist.

Schnellere Generierung, vor allem bei Tabellen

Der Generator ist schneller, und tabellenlastige Dokumente profitieren am meisten. Das Eigenschaftsschema einer Klasse – ihre Eigenschaftsnamen und deren Annotationen – wird nur einmal pro Klasse geparst und anschließend gecacht, statt bei jedem gerenderten Objekt von Neuem.

Im Test-Benchmark rendert eine Story mit 5.000 Tabellenzellen etwa 3,7× schneller und 100 Absatzformate etwa 5,2× schneller (die Messwerte sind in benchmarks/performance.md festgehalten, sodass der Effekt reproduziert und verglichen werden kann).

Was Sie beim Upgrade wissen sollten

Die Version räumt auch auf. Die bisherige Klasse Tag und Factory::createTag() gelten zugunsten von XMLTag und Factory::createXmlTag() als veraltet; Content::setTag() weicht Content::addXmlTag(). Das manuelle Erzeugen von Preference, DesignMap und BackingStory ist veraltet – nutzen Sie die Getter der Factory oder lassen Sie das Content-Objekt sie einfach erzeugen. Die Stil-Enums wurden in den gemeinsamen Namespace \BitAndBlack\IdmlCreator\Content\Enum\Styles verschoben, wobei die alten Pfade bis v6.0 als Aliase erhalten bleiben.

Die meisten der als veraltet markierten Elemente lassen sich auflösen, indem Sie die nun überflüssigen Aufrufe einfach löschen: Ein vorhandenes Tag „kann einfach entfernt werden", und auch die manuelle Einrichtung von BackingStory und Container kann gelöscht werden.

Zusammenfassung

Version 5.7 bereitet die Library in dreierlei Hinsicht auf die Zukunft vor: Sie spricht die XML-Seite von InDesign, ersetzt überall Zeichenketten durch Enums und macht das gesamte Paket bequemer und schneller. Alles ist rund um eine einzige Factory aufgebaut, sodass der Einstieg mit Tags noch nie einfacher war.