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:
- IDMLlib Webseite (englisch) : http://idmllib.com
- IDMLlib Blog (englisch): http://blog.idmllib.com
- FHCon Webseite: http://www.fhcon.de
- FHCon Blog: http://www.fhcon.de/blog/
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.