IDMLlib 1.1 Release Notes

Go to the english version of this article.

Wir freuen uns über das bevorstehende Release der IDMLlib® 1.1

Die IDMLlib® ist eine Java Library, mit der das Verarbeiten von InDesign® IDML Dokumenten einfacher ist als jemals zuvor.

Mit einer einfachen aber leistungsstarken Schnittstelle zu allen Informationen innerhalb eines IDML Dokuments ist es Softwareentwicklern möglich, Inhalte zu extrahieren, zu modifizieren und neue Inhalte zu erstellen, ohne die komplette IDML Spezifikation zu lesen. Dabei bleibt die Kompatibilität zu InDesign vollständig erhalten.

Entwickler sind mit der IDMLlib in der Lage, aus vorhandenen Inhalten neue IDML Dokumente zu erstellen oder zu entwerfen – und das nur mit Hilfe von Java Befehlen und ohne direkt in die XML Dateien eingreifen zu müssen.

Egal, ob Sie InDesign kompatible Snippets aus Ihrem Content Management System exportieren, ein auf IDML basierendes Marketing Portal erstellen oder einen webbasierten Übersetzungsworkflow entwickeln möchten – mit der IDML Technologie reduzieren Sie Ihre Ausgaben und verkürzen die Zeit bis zur Markteinführung Ihrer Lösung.

Weitere Informationen über die IDMLlib erhalten Sie unter den folgenden Links:

Die IDMLlib 1.1 ist ab dem 25. Juni 2010 verfügbar.

Wenn Sie bereits Kunde der IDMLlib 1.0 sind, werden wir Sie rechtzeitig darüber informieren, wo Sie das neue Release herunterladen können. Weiterhin haben Sie als Interessent die Möglichkeit, die IDMLlib 30 Tage lang kostenlos zu testen. Fordern Sie dazu einfach Ihre Testversion über unser Kontaktformular an.

Neue Funktionen der Version 1.1

Laden, Modifizieren und Speichern von IDML Dokumenten

Die IDMLlib 1.1 unterstützt das Modifizieren und Schreiben von IDML Dokumenten. Das folgende einfache Beispiel läd ein Dokument mit vier Seiten (1, 2/3, 4), erstellt zwei Kopien der Seiten 2/3, die nach der Seite 2/3 im Dokument angehangen werden, und sichert ein neues Dokument mit acht Seiten (1, 2/3, 4/5, 6/7, 8).

// Create an 8-pager from a 4-pager
Idml idml = new Idml("4pager.idml");
Spread spread = DocumentUtil.getSpread(idml.getAbstractDocument(), 1);
for(int i=0;i<2;i++) {
  DocumentUtil.addSpread(idml.getAbstractDocument().getAsDocument(),spread,2);
}
idml.saveAs("8pager.idml");

Unterstützung von IDML Snippets

Die IDMLlib 1.1 unterstützt die Verarbeitung von IDML Snippet Dateien. Snippets können auf dem gleichen Weg geladen werden wie ein IDML Container. Es ist möglich, Teile aus dem IDML Dokument oder den ganzen Spread mit allen PageItems von einem Snippet in ein Container Dokument zu kopieren:

Idml idml = new Idml("Catalog.idml");
Idml idms = new Idml("ProductSnippet.idms");
SpreadIterator spreadIterator = DocumentUtil.getSpreadIterator(idms);
Spread firstSpread = spreadIterator.next();
DocumentUtil.addSpread(idml.getAbstractDocument().getAsDocument(),firstSpread);
idml.saveAs("NewCatalog.idml");

Es ist sogar möglich, neue Snippets von Grund auf zu erzeugen:

Idml idml = new Idml("Catalog.idml");
Spread spread = DocumentUtil.getSpreadIterator(idml).next();
Idml snippet = Idml.createEmptySnippet("FirstPage.idms", DocumentPreset.CS4_605_PAGEITEM);
snippet.getAbstractDocument().getAsSnippetDocument().setSpreadList(ListUtil.getAsGenericList(spread));
snippet.save();

Der schnellste Weg, ein Snippet in den ersten Spread zu importieren (index 0):

Idml idml = new Idml("DemoDocuments/EmptyA4.idml");
Idml idms = new Idml("DemoDocuments/ProductSnippet.idms");
DocumentUtil.importSnippet(idml, idms, 0);

Erstellen von neuen IDML Objekten von Grund auf

Mit der IDMLlib 1.1 ist es möglich, alle IDML Objekte von Grund auf zu erzeugen, zum Beispiel eine Ebene (Layer):

Layer layer = new Layer();
layer.setSelf("ILJ11");
layer.setName("My new Layer");
layer.setLayerColor(new InDesignUIColorType(UIColors.Red));
layer.setExpendable(true);
layer.setIgnoreWrap(false);
layer.setLockGuides(false);
layer.setPrintable(true);
layer.setLocked(false);
layer.setShowGuides(true);
layer.setUI(true);

Oder vielleicht ein mehr alltäglicher Fall wie die Erstellung von PageItems, wie zum Beispiel ein Rechteck (Rectangle):

Rectangle rectangle = new Rectangle();
rectangle.setSelf("ILJ1");
rectangle.setFillColor("Color/Magenta");
rectangle.setStrokeWeight(0d);
rectangle.setItemTransform(TransformationMatrixType.getIdentityMatrix());
 
List geometryPathTypeList = PageItemUtil.createPathGeometryList(idml,
    new PathPointType(0, 0), //upperleft point
    new PathPointType(0, 40), //lowerleft point
    new PathPointType(40, 40), //lowerright point
    new PathPointType(40, 0) //upperright point
);
rectangle.setPathGeometryList(geometryPathTypeList);

Der Utility Framework

Der IDMLlib Utility Framework ist aus dem Wunsch unserer Kunden heraus entstanden, die Komplexität aus wiederkehrenden Tätigkeiten wie dem Hinzufügen, Anhängen und Bewegen von PageItems, dem Klonen von Spreads oder dem Importieren von Snippets in Dokumente herauszunehmen. Das Resultat dieses Ansatzes ist im de.fhcon.idmllib.api.util Paket zu finden, welches zur Zeit folgende Utility Klassen enthält:

  • DocumentUtil
  • GraphicUtil
  • GroupUtil
  • IdmlLibUtil
  • LabelUtil
  • ListUtil
  • PageItemUtil
  • SpreadUtil
  • StoryUtil
  • TransformationMatrixUtil
  • UnitConverterUtil

Der IDMLlib Utility Framework ist ein “work in progress” und wird mit neuen Anforderungen weiter wachsen.

Hier ein paar kleine Beispiele dafür, wie diese Klassen dabei helfen können, den Javacode deutlich zu verkürzen:

Den ersten Spread aus einem Dokument holen

Idml idml = new Idml("DemoDocuments/RectanglesAndTextFrames.idml");
Spread spread = DocumentUtil.getSpreadIterator(idml).next();

Das erste PageItem holen

AbstractIdmlPageItem pageItem = SpreadUtil.getPageItemIterator(spread).next();

Ein Label überprüfen und setzen

if(PageItemUtil.hasLabel(pageItem, "Marked")){
   KeyValuePair label = PageItemUtil.getLabel(pageItem, "Marked");
}

Ein PageItem verschieben und das UnitConverterUtil nutzen, um Millimeter Werte in Points zu konvertieren

PageItemUtil.movePageItem(pageItem,100,100);
double pointValue = UnitConverterUtil.mmToPoint(100);
PageItemUtil.movePageItem(pageItem,pointValue,pointValue);

Alle PageItems einer Gruppe in einen Spread einfügen und alle eingefügten PageItems um 200 Points nach rechts unten verschieben.
Diese Methode erstellt automatisch neue Story Dateien, wenn ein Textrahmen eingefügt wird.

if(pageItem.isGroup()){
   PageItemIterator pageItemIterator = GroupUtil.getPageItemIterator(pageItem.getAsGroup());
   SpreadUtil.appendPageItems(spread,pageItemIterator,200,200);
}

Den kompletten Inhalt eines Dokumentes per Durchlauf über alle ParagraphStyleRanges/CharacterStyleRanges/Content in allen Stories extrahieren.

Idml idml = new Idml("DocWithContent.idml");
StoryIterator storyIterator = DocumentUtil.getStoryIterator(idml);
while (storyIterator.hasNext()) {
   String content = StoryUtil.getContent(storyIterator.next());
   System.out.println(content);
}

Durchlaufen und Filtern von PageItems

Einfaches Durchlaufen aller Top Level PageItems

Idml idml = new Idml("DocWithPageItems.idml");
Spread spread = DocumentUtil.getSpreadIterator(idml).next();
PageItemIterator pageItemIterator = SpreadUtil.getPageItemIterator(spread);
while(pageItemIterator.hasNext()){
  AbstractIdmlPageItem pageItem = pageItemIterator.next();
  //do something with the pageitem
}

Durchlaufen mit einem LabelFilter

Idml idml = new Idml("DocWithPageItems.idml");
Spread spread = DocumentUtil.getSpreadIterator(idml).next();
 
LabelFilter labelFilter = new LabelFilter("Marked","true");
 
PageItemIterator pageItemIterator = SpreadUtil.getPageItemIterator(spread,labelFilter);
//the iterator only contains PageItems with a Label of: Key "Marked" with value "true"
while(pageItemIterator.hasNext()){
  AbstractIdmlPageItem pageItem = pageItemIterator.next();
  //do something with the pageitem
}

Durchlaufen mit Hilfe eines eigenen Filters, der als innere Klasse implemetiert wurde und nur Textrahmen zulässt

Idml idml = new Idml("DocWithPageItems.idml");
Spread spread = DocumentUtil.getSpreadIterator(idml).next();    
 
PageItemIterator pageItemIterator = SpreadUtil.getPageItemIterator(spread,new IPageItemFilter(){
  public boolean accept(AbstractIdmlPageItem pageItem) {
    return pageItem.isTextFrame();
  }
});
 
//the iterator only contains TextFrames
while(pageItemIterator.hasNext()){
  AbstractIdmlPageItem pageItem = pageItemIterator.next();
  assert(pageItem.isTextFrame());
}

Arbeiten mit verschiedenen PageItem Typen

switch (pageItem.getPageItemType()) {
 
  case Button:
    Button button = pageItem.getAsButton();
  break;
 
  case EPSText:
    EPSText epsText = pageItem.getAsEPSText();
  break;
 
  case FormField:
    FormField formField = pageItem.getAsFormField();
  break;
 
  case GraphicLine:
    GraphicLine graphicLine = pageItem.getAsGraphicLine();
  break;
 
  case Group:
    Group group = pageItem.getAsGroup();
  break;
 
  case Oval:
    Oval oval = pageItem.getAsOval();
  break;
 
  case Polygon:
    Polygon polygon = pageItem.getAsPolygon();
  break;
 
  case Rectangle:
    Rectangle rectangle = pageItem.getAsRectangle();
  break;
 
  case TextFrame:
    TextFrame textFrame = pageItem.getAsTextFrame();
  break;
}

Ein austauschbarer IdGenerator zur Erstellung eigener Self ids

Es ist sehr wichtig zu wissen, dass die Self Attribute von IDML Objekten wie z.B. PageItems eindeutig bleiben müssen, damit sie identifiziert werden können. Weil ein großer Teil der Utility Klassen neue PageItems oder andere IDML Objekte mit Self Attributen erzeugt, müssen beim Hinzufügen zu einem Dokument eindeutige Self Zeichenketten erstellt werden.

Da wir wissen, dass unser Ansatz, diese Self ids zu erzeugen, von dem anderer Entwickler abweichen wird, haben wir den IdGenerator austauschbar gemacht.

Sie können also den DefaultIdGenerator nutzen, müssen es aber nicht. Dazu haben wir ein IdGenerator Interface definiert, welches Sie implementieren können, um einen eigenen ID Generator zu erstellen.

public class MyCustomIdGenerator implements IdGenerator {
  public String getSequence(String existingId) {
    //implement your code here
   }
}

Wie Sie sehen können, bekommt die IdGenerator#getSequence() Methode immer die Self reference des gerade verarbeiteten PageItems als Parameter zurück. Unsere Klassen geben immer die Self reference zurück, so lange sie existiert. So können die alten IDs in anderer Form genutzt werden.

Damit unsere Klassen Ihren eigenen IdGenerator nutzen, müssen Sie die Implementierung verfügbar machen:

Idml idml = new Idml("MyDoc.idml");
idml.setIdGenerator(new MyCustomIdGenerator());

Wenn Sie selber Self ids erstellen müssen, können Sie den gerade aktiven IdGenerator der Idml Instanz, mit der Sie gerade arbeiten, beziehen:

Idml idml = new Idml("MyDoc.idml");
IdGenerator generator = idml.getIdGenerator();

15 dokumentierte Beispiele

Wir haben 15 dokumentierte Beispiele erstellt die Ihnen zeigen, wie Sie die IDMLlib erfolgreich nutzen können. Fast alle Beispiele sind aus Kundenanfragen heraus entstanden oder zeigen alltägliche Fallbeispiele für die IDMLlib. Diese Beispiel-Bibliothek ist ein “work in progress” und wird mit neuen Anforderungen und Fragen weiter wachsen.

Liste von Beispielen, die Teil des 1.1 Releases sind:

  • CopyTextFramesAndManipulatePSR
  • CreateNewStory
  • CreateRectangles
  • CreateRectangleWithImage
  • CreateSimpleTable
  • CreateSpreadsFromScratch
  • CreateTextFrameCopiesOnNewLayers
  • GetStoryContent
  • IdmlLoader
  • ImportSnippet
  • InsertSpread
  • LoadModifySaveIdml
  • PageItemExamples
  • PutPageItemOnDifferentLayers
  • SimpleDatabasePublishing

Alle Beispiele wurden getestet und werden mit vorbereiteten IDML Dokumenten geliefert, mit denen das Beispiel veranschaulicht wird.

Tags: ,

Hinterlasse eine Antwort