# Monday, October 29, 2007

Nach einer kleinen Einleitung, möchte ich nun einen Überblick geben, wie unsere 3D Ersatzteilkatalog-Lösung interaktive PDFs mit 3D Objekten erzeugt. SPCat3D selbst besteht aus mehreren Komponenten, die wiederum mit externen Programmen zusammenarbeiten:

SPCat3D - Ablauf

Auf der linken, oberen Seite sehen wir unsere klassische Katalog-Software SPCat. Dieser Ersatzteilkatalog bietet uns sehr viele Möglichkeiten hierarchische Teilelisten zu importieren und zu bearbeiten. Wir verwenden diese erprobte Technologie als Stücklisten-Datenbasis weiter.

SPCat3D PDF Creator greift bei der PDF Produktion auf die SPCat Datenbank zu. Die Schnittstelle ist aber so ausgelegt, dass auch andere Datenquellen möglich sind. Unser eigener SPCat ist nur die nächstliegende und einfachste Anbindung. Andere Katalog-Systeme oder direkter Zugriff auf ERP Daten (SAP) sind auch denkbar.

Parallel müssen die 3D-CAD Daten aufbereitet werden. Wir verwenden dazu von Right Hemisphere die Deep Exploration CAD Edition. Mit diesem Tool können wir alle relevanten CAD Formate öffnen und bearbeiten. Unter anderem können wir damit die CAD Daten reduzieren und mit einer animierten Explosionsdarstellung versehen.

Der nächste Schritt ist die Zuordnung der Stückliste zu den CAD Grafiken und den einzelnen Objekten innerhalb einer Grafik. Dabei hilft es, dass Deep Exploration die Metadaten aus den meisten CAD Formaten übernehmen kann. Die genaue Vorgehensweise in dieser Stelle hängt sehr stark von den Ausgangsdaten ab.

Deep Exploration enthält ein PDF Publishing Module das es ermöglicht 3D Illustrationen in eine PDF Vorlage (Template) einzufügen. Von Right Hemisphere gibt es bereits einige fertige Templates die interaktive PDFs ermöglichen. Wir benötigen aber eine sehr viel weitergehende Funktionalität. Deswegen arbeiten wir mit unseren eigenen SPCat Templates.

Die Ausgabe des PDF Publishing Modules sind PDF Dateien mit eingebetteten 3D Objekten in unserem Template. Aber noch ohne die Möglichkeit zur Interaktion, denn dafür wir benötigen wir die Informationen aus der Stückliste.

Das ist dann die eigentlich Aufgabe unseres SPCat3D PDF Creators. Dieses Tool führt alle Informationen und Dateien zusammen. In die vorher erzeugten, statischen PDF Dateien wird die Stücklisten Information eingebettet. Es werden zusätzliche PDF Dateien erzeugt, die den Zusammenhang der einzelnen Baugruppen darstellen und die entsprechenden PDF Dateien miteinander verknüpfen.

Im Ergebnis erhält man ein Verzeichnis mit PDF Dateien, die die komplette Stückliste wiedergeben und die einzelnen 3D Illustrationen hierarchisch korrekt miteinander verbinden. Zusätzlich gibt es einen PDF Datei die einem Bestellformular entspricht und wie ein Warenkorb interaktiv aus den anderen PDF Dateien heraus gefüllt werden kann.

PDF | SPCat | TD
Monday, October 29, 2007 11:59:07 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Thursday, October 25, 2007

Wir bieten seit langem einen elektronischen Ersatzteilkatalog an, unseren Spare Part Catalog SPCat. Diese Software kommt sehr gut mit Stücklisten und 2D Zeichnungen klar. Bei 3D CAD Daten hatten wir bisher keine Lösung. Genau diese Funktionalität wird aber immer häufiger nachgefragt.

Die Visualisierung dreidimensionaler CAD Objekte ist aber ein Problem, das eine kleine Entwicklergruppe nicht mal eben lösen kann. Man muss zum einen die Dateien aus verschiedensten CAD Programmen verarbeiten können. Zum anderen braucht es einen Viewer, der die erstellten 3D Illustrationen darstellen kann sich gut in die restliche Ersatzteilkatalog-Software integrieren lässt.

Alle mir bekannten Anbieter von elektronischen Ersatzteilkatalogen haben sich entschlossen, dieses Know-How einzukaufen. Die meisten verwenden die Produkte von Lattice3D und binden deren freien XVL Player in Ihre Kataloge ein.

Es gibt auch eine interne SPCat Demo Version mit XVL Player die ganz gut funktioniert. Aber irgendwie fand ich es langweilig, wenn am Ende alle Kataloge den gleichen 3D Viewer verwenden und habe weiter gesucht. Dabei bin ich auf die Firma Right Hemisphere gestoßen. Auch von diesem Anbieter gibt es einen Betrachter (Deep View) der sich in eigene Anwendungen einbinden lässt. Deren Produkte können über 80 CAD Formate importieren und alle von uns getesteten Dateien wurden problemlos eingelesen.

Besonders spannend wurde es aber, als ich die Zusammenarbeit von Adobe und Right Hemisphere verstanden hatte: Right Hemisphere ist der Anbieter, der die Ausschreibung von Adobe gewonnen hatte, das PDF Format um einen 3D Viewer zu erweitern. Entsprechend gut ist in deren Produkten die Erzeugung von PDF Dateien mit eingebetteten 3D Objekten realisiert.

Bisher hatten wir in Richtung einer Software mit integrierten Viewer gedacht, jetzt gibt es eine weitere Möglichkeit: Die 3D Illustrationen werden in PDF Dateien eingebetteten und die Verknüpfung zur Stückliste und die Interaktion mit dem Anwender erfolgt komplett innerhalb das Acrobat Readers. Das bedeutet die Auslieferung des fertigen Katalogs vereinfacht sich enorm. Man muss lediglich einige PDF Dateien verteilen. Der Endanwender benötigt lediglich einen installierten Acrobat Reader 8.1. Die weite Verbreitung des Readers führt dazu, dass in aller Regel gar keine Vorbereitungen oder Installationen beim Endanwender nötig sind. Er öffnet nur eine PDF Datei.

Aktuell gibt es den Acrobat Reader in der Version 8.1 für folgende Betriebssysteme: Windows, Mac, Linux und Solaris. Das heißt ein SPCat 3D PDF-Ersatzteilkatalog funktioniert plattformübergreifend.

Zum Beispiel ein Pumpstand, dargestellt mit Linux Ubuntu 6.1 und dem Acrobat Reader 8.1.1 für Linux:

SPCat3D Ubuntu 6.1 Adobe Reader 8.1.1

Der Testrechner ist nach heutigen Maßstäben wirklich langsam mit seinem Athlon 900. Ich habe eine nackte Ubuntu Installation verwendet, lediglich den Acrobat Reader 8.1.1 habe ich installiert. Es war von Seiten der Grafikkarte keinerlei 3D Unterstützung vorhanden. Trotzdem wurde das PDF mit dem 3D Objekt problemlos dargestellt und alle Interaktionen haben funktioniert. Lediglich bei Veränderung der 3D Ansicht kam das System ins Stocken und fiel auf eine Drahtgitter-Darstellung zurück.

Bei der eigentlichen Darstellung von 3D Illustrationen hat uns Adobe eine Menge Arbeit abgenommen. Wir können uns also ganz auf die Interaktivität und die Integration mit den Stücklisten und Ersatzteilinformationen konzentrieren.

Weiter geht es mit einem kleinen Überblick.

PDF | SPCat | TD
Thursday, October 25, 2007 3:34:21 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, October 16, 2007

(Deutsche Version)

In my article Acrobat PDF Form Felder auf Ebenen I have explained the problem in detail: I want to create layers in a PDF file and put Form Fields or Annotations into these layers or Optional Content Groups (OCG).

Back then, I solved the problem by means of Acrobat SDK Snippet Runner. An architecture that enables you to run individual Snippets as a plug-in in Acrobat. Quite nice for a first try, but in the end not a solution that should be distributed. Developery only.

For this reason, I took a closer look at the SDK and built a proper plug-in:

Acrobat CPTec Layer Plugin Menu

The plug-in links into the Advanced menu of Acrobat and is only active when a document is loaded. When called, it asks for a text file. This file determines which annotations are put into which layers. Layers that are not present will be created.

The structure of the text file is very simple. Each line contains the name of an annotation, the | character, and then the name of the related layer:

TestAnnotation1|TestLayer1
TestAnnotation2|TestLayer2

When editing in Acrobat, it is possible that the layer information for the Annotations gets lost. In this case, simply run the same text file again. Assigning fields that are already present does not have any negative effect.

Disclaimer:

  • I am not much of a C++ programmer.
  • This is my first Adobe Acrobat plug-in.
  • The plug-in has only been tested with Acrobat 8.1 Professional.
  • I do not assume responsibility for anything: If Acrobat crashes or all PDF files are destroyed, it is not my fault.
  • Use at your own risk.
  • Please pay attention to the MIT/X11 License in the Zip file.

Have fun with the plug-in, and maybe you want to send me a feedback:

CPTecLayerPlugin.zip (180 KB)

Tuesday, October 16, 2007 5:25:09 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [1]  | 

(English version)

In meinem Beitrag Acrobat PDF Form Felder auf Ebenen habe ich das Problem ausführlich erklärt: Ich möchte in einem PDF Ebenen erzeugen und Form Fields bzw. Annotations auf diese Ebenen oder Optional Content Groups (OCG) legen.

Damals kam ich zu einer Lösung über den Acrobat SDK Snippet Runner. Einer Architektur, die es ermöglicht einzelne Snippets als Plug-in im Acrobat laufen zu lassen. Für erste Schritte ist das ganz nett, aber man hat am Ende leider keine verteilbare Lösung. Ein Entwickler Tool eben.

Also habe ich mich noch weiter in die SDK gestürzt und ein richtiges Plug-in gebastelt:

Acrobat CPTec Layer Plugin Menu 

Das Plug-in bindet sich in das Advanced Menü von Acrobat ein und ist nur aktiv, wenn ein Dokument geladen ist. Beim Aufruf verlangt es nach einer Textdatei. Diese Datei steuert, welche Annotations auf welche Ebene gelegt werden sollen. Nicht vorhandene Ebenen werden erzeugt.

Die Struktur der Datei ist sehr einfach. Pro Zeile wird der Name einer Annotation und durch ein | getrennt der Name der zugehörigen Ebene angegeben:

TestAnnotation1|TestLayer1
TestAnnotation2|TestLayer2

Beim Editieren in Acrobat kann eventuell die Ebenen-Information der Annotations verloren gehen. Dann hilft einfach ein erneuter Lauf mit der gleichen Textdatei. Eine erneute Zuordnung vorhandener Felder hat keine nachteiligen Effekte.

Disclaimer / Haftungsausschluss:

  • Ich kann eigentlich nicht in C++ programmieren.
  • Das ist mein erstes Adobe Acrobat Plug-in.
  • Das Plug-in wurde nur mit Acrobat 8.1 Professional getestet.
  • Ich übernehme keine Verantwortung für Irgendwas: Ob Acrobat abstürzt oder alle PDFs zerstört werden ist nicht meine Schuld.
  • Benutzung auf eigene Gefahr.
  • Bitte die MIT/X11 Lizenz in der Zip-Datei beachten.

Dann viel Spaß damit und vielleicht gibt es ja Rückmeldungen:

CPTecLayerPlugin.zip (180 KB)

Tuesday, October 16, 2007 4:23:01 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Monday, October 15, 2007

Der Acrobat Reader kann PDF Dateien nicht nur als normale Applikation darstellen, er bindet sich auch als Plug-In in den Webbrowser ein. Gerade dieser Integration in den Browser und damit in das Internet hat viel zur Beliebtheit von PDF beigetragen.

Aus der Sicht von JavaScript verhält sich aber Acrobat eingebettet im Browser ein bisschen anders, als im eigenständigen Modus. Um auf diese Unterschiede reagieren zu können, gibt es am Doc Objekt, das einem PDF Dokument entspricht, die Eigenschaft external. Im Kontext eines Dokuments kann dieser Zustand einfach mit this.external abgefragt werden. Aus der JavaScript Referenz:

Specifies whether the current document is being viewed in the Acrobat application or in an external window (such as a web browser).

Ich möchte diesen Wert beim Laden des Dokuments abfragen. Da ich aber zur Erzeugung der PDF Dateien Acrobat automatisiere, werden in diesem Prozess auch die Dokumente einmal geladen. Ein automatisierter Acrobat mag aber offensichtlich diesen Wert nicht verraten und hängt sich auf.

Alternative frage ich jetzt einfach die path Eigenschaft ab. Damit erhält man den Pfad zum PDF Dokument. Fängt der mit http an, dann kam die Datei vom Webserver und man ist damit im Webbrowser:

// Mag Acrobat nicht immer
var external1 = this.external;
// Workaround
var external2 = (this.path.substr(0, 4) == "http");
Monday, October 15, 2007 6:20:57 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Friday, October 12, 2007

Software Entwicklung ist ein sehr kreativer Prozess. Nur wenn der Strom weg ist, bleibt selten etwas Sichtbares zurück. Papier ist immer noch gefragt um Daten für Anwender zu zugänglich zu machen.

Der Weg von einer Datenbank zu einem Produkt Katalog wird gerne Database Publishing genannt. Vor ca. 9 Jahren haben wir begonnen für den Automobilzulieferer FTE einen Aftermarket Produkt Katalog in Papierform zu erstellen. Dieser Katalog wird seitdem alle 2 Jahre neu aufgelegt.

Der Prozess sollte vollständig automatisiert sein und die Daten mussten stark verdichtet werden. Die Verdichtung der Datenfülle war notwendig, da für jeden PKW Typ alle verfügbaren FTE Produkte ausgegeben werden sollten. Die Ausgabe redundanter Information musste vermieden werden.

Dennoch sind wir inzwischen an die Grenzen der Buchbinderei gestoßen:

fte_katalog

Ein Telefonbuch wirkt wie ein Flyer daneben. Der FTE Ersatzteil-Katalog ist 5,5 cm dick und der letzte PKW Typ, der WARTBURG 353 Tourist (10.1967-05.1991) ist auf Seite 1824 zu finden. Nur mit Spezial-Papier und einem fähigen Buchbinder konnte das Werk überhaupt noch produziert werden.

FTE PKW PDF

Die ausgelieferte PDF Datei wirkt mit 145 MB Dateigröße noch gar nicht so mächtig. Stecken doch so viele kleine Icons und Detailinformationen in Ihr:

FTE Katalog - offen

Ich freue mich jedes Mal auf den fertigen Katalog in Papierform. Da hat man wirklich etwas in der Hand. Inzwischen ist der Ablauf eingespielt und auch die Rechner sind so leistungsfähig, dass die Abwicklung nicht mehr klemmt. Aber vor 8 Jahren, war der Weg schon spürbar steinig. Auch die Wahl der Tools ist historisch begründet.

Ausgangspunkt sind die TecDoc Stammdaten zusammen mit den FTE Einspeiser Daten. Das sind standardisierte Textdateien die wir über ein Visual FoxPro Import Tool in den MS SQL Server 7 eingelesen haben. Inzwischen verwenden wir natürlich den MS SQL Server 2005 :)

Auf diese Datenbank greift ein weiteres FoxPro Programm zu. In diesem Katalog Programm werden alle Verdichtungen der Daten durchgeführt und schließlich über OLE Automatisierung in Word Dokumente ausgegeben. Richtig gelesen: Wir waren kühn genug, mit Word 97 automatisiert 1500 Seiten Dokumente zu erzeugen! Damals waren es nur 1500 Seiten.

Heute kann man darüber nur schmunzeln. Damals habe ich geschwitzt. Es hat einiger Workarounds und Tricks bedurft, um diese Dokumente zu erstellen. Die Rechenzeiten waren enorm, jeder Fehlversuch hat viel Zeit gekostet. Es liefen diverse Rechner parallel um den Vorgang zu beschleunigen. War endlich das Word Dokument erstellt, musste noch ein PDF über den Acrobat Distiller Druckertreiber erstellt werden. Das dauert noch mal und auch dabei konnte Word abstürzen.

* Word starten und die Vorlage laden
oWord=CreateObject("Word.Application")
oWord.Options.CheckSpellingAsYouType=.F.
oWord.Options.CheckGrammarAsYouType=.F.
oWord.Documents.Add(out_name,.F.)
oDoc=oWord.ActiveDocument
oDoc.Windows(1).View.ShowFieldCodes=.F.
oDoc.SaveAs(out_name)
oWord.ActiveWindow.View.Type = 1

* dann ganz viele Elemente hinzufügen
oDoc.Tables.Add()
oDoc.Paragraphs.Add()

* Fertig
oDoc.Save()
oWord.Quit(0)

So lässt sich der FoxPro Code zusammenfassen :)

Wer übrigens FTE Ersatzteile ohne diesen Katalog finden möchte, für den haben wir auch einen kleinen Web-Katalog gebastelt: FTE Katalog. Da schwitzt nur die PHP Engine und nicht der Buchbinder.

Friday, October 12, 2007 4:06:47 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, October 09, 2007

In einem PDF können verschiedene Ebenen definiert werden. Ebenen heißen auf Englisch Layers. Diese Layers gibt es in vielen Zeichen- und Designprogrammen. So auch im Adobe Illustrator oder im Adobe Photoshop. Auf diesen Layern können Objekte gruppiert werden, die irgendwie zusammengehören. Man kann diese Ebenen sperren oder unsichtbar machen. Das hilft beim Arbeiten, man behält die Übersicht.

Acrobat PDF Layers

Mit den PDF Annotations / Form Fields hat man in einem PDF die Möglichkeit mit dem Benutzer zu interagieren. Da wäre es sehr praktisch, diese UI-Elemente auf Layern anzuordnen und in Abhängigkeit des Zustandes des Formulars sichtbar zu machen. In Windows Forms gibt es dazu das beispielsweise das TabControl.

Leider fehlt im Adobe Acrobat die Möglichkeit Ebenen zu erzeugen! Wie? Da oben ist doch ein Screenshot mit dem Layers Dialog? Tja, der kann aber nur Ebenen umschalten oder zusammenfassen.

Schade, Ebenen erzeugt man in der Adobe Welt mit dem Illustrator oder InDesign. Beide Tools können die internen Ebenen in ein PDF exportieren. Das geht auch mit einem ansonsten leeren Dokument. Sehr umständlich, aber wenn es den sein muss.

Das leere, aber mit Ebenen versehene PDF (Layered PDF) kann man in Acrobat laden und die Ebenen selektieren. Also wähle ich die gewünschte Ebene aus und erzeuge eine List Box. Ups, die landet nicht in der Ebene sondern im Dokument selbst. Was mache ich falsch? Wo kann man Objekte den Ebenen zuweisen? Irgendwann rückt die Acrobat Hilfe damit raus:

You can add content, such as review comments, stamps, or form fields, to layered documents just as you would to any other PDF document. However, the content is not added to a specific layer, even if that layer is selected when the content is added. Rather, the content is added to the entire document.

An der Stelle würde ich normalerweise aufgeben. Acrobat kann einfach mit Ebenen nicht umgehen. Fertig!

Ich habe aber bereits ein PDF mit Form Objekten auf Ebenen gesehen. Das PDF habe ich noch mal in Acrobat geladen. Keine Täuschung, es stimmt. Wie haben die das nur gemacht? Vielleicht mit JavaScript?

In der JavaScript SDK finden sich tatsächlich einige Methoden zur Manipulation von Layern. Nur dauert das ein bisschen. Außer in der Benutzeroberfläche heißen die Layers bei Acrobat nämlich Optional Content Groups (OCG). Aber auch in JavaScript kann man keine Objekte gezielt diesen OCGs zuweisen.

Mit diesem Terminus findet Google aber jetzt auch mehr technische Beiträge. Zum Beispiel diesen Trick: Buttons on Adobe PDF Layers. Es werden per InDesign CS3 Buttons auf Ebenen erzeugt, die beim PDF Export zu PDF Form Buttons werden. Die Ebeneninformation bleibt dabei erhalten. Leider schließt der Beitrag mit:

What about Text fields? Unfortunately we don’t yet have an option in InDesign to convert a text frame to an Acrobat text form field. Any fields you create in Acrobat will be visible on all layers.

Ich will aber meine List Box! Es geht, ich habe den Beweis! In der Adobe Acrobat User Community gibt es die Rubrik Ask an expert. Die Antwort zum Thema Move an object to an existing layer:

Unfortunately, you can't change layer data in Acrobat. You can neither add new layers to a PDF, move data between layers, or introduce new data on a given layer. You need to return to Illustrator and recreate the PDF if you want to change the layer data.

Jetzt kommt der finale C++ Hammer: In der Acrobat API Referenz findet sich die Methode PDAnnotSetOCMD. Damit kann man eine Annotation (Form Field) einem optional-content membership dictionary (OCMD) zuweisen. Dieses Dictionary stellt die Verbindung von OCG und Annotation dar. Genau was ich brauche. Nebenbei findet sich dann noch die Methode PDOCGCreate um Ebenen zu erzeugen.

Diese API steht aber nur einem C++ Acrobat Plug-In zur Verfügung. Aber auch hier hilft die SDK weiter: Adobe hat einen Snippet Runner beigelegt. Zusammen mit einer Visual Studio Solution und einigen Beispiel Snippets. Der Snippet Runner kompiliert zu einem Acrobat Plug-In, das man in das Acrobat Verzeichnis kopiert. Beim nächsten Start von Acrobat, startet das Plug-In mit und startet dient als Server. Auf diesen Server wiederum greift das Snippet Runner Common Interface 2.0 zu. Witzigerweise eine Adobe Flex 2 Applikation. Also quasi eine getarnte Flash Applikation:

SnippetRunner

Über dieses Interface kann man gezielt sein eigenen Snippets im Acrobat Plug-In Kontext laufen lassen. Der Code der Snippets ist dabei mit in den Server kompiliert. Das Frontend liefert den Auswahl Mechanismus und die Konsolen-Ausgabe.

Ich kann mich nicht erinnern, wann ich zuletzt in C++ unterwegs war. Es ist sehr lange her und war auch damals nur sehr kurz. Sprich, ich habe eigentlich keine Ahnung. Aber irgendwie hat es für diese Funktionalität gereicht und ich kann jetzt mit zwei Methoden meine Ebenen erzeugen und Form Objekte anhand deren Namen in diese Ebenen verschieben:

PDOCG ocgSubparts = CPTecCreateOCG("Subparts", true);
PDOCG ocgAssembly = CPTecCreateOCG("Assembly", false);
CPTecMoveAnnot("TestSubparts", ocgSubparts);
CPTecMoveAnnot("TestAssembly", ocgAssembly);

Der zweite Parameter bei CPTecCreateOCG gibt an, ob die Ebene beim Laden das PDFs sichtbar sein soll. Falls bereits eine Ebene mit dem gewünschten Namen vorhanden ist, wird diese zurückgegeben. Die zweite Methode CPTecMoveAnnot weist der Annotation mit dem übergebenenNamen die entsprechende Ebene zu. Damit ist ein mehrfacher Lauf des Snippets problemlos möglich.

Und so sieht das Ergebnis im PDF aus. Zwei List Boxen, die auf Ebenen liegen, die man später auch programmatisch umschalten kann.

PDF Layers On

PDF Layers Subparts

PDF Layers Assembly

Ist das Ergebnis den Aufwand wert? Ja klar. Ärgerlich wäre nur, wenn Acrobat 8.2 den Layer Dialog um diese Funktionen erweitern würde. Bis dahin kann ich ja noch grübeln, ob ich meine beiden C++ Plug-In Methoden vielleicht veröffentliche :)

Update:
Ich habe nicht den Code, sondern gleich ein fertiges Plug-in veröffentlicht: CPTec Layer Plugin für Acrobat

Tuesday, October 09, 2007 7:00:13 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [1]  | 
# Wednesday, September 05, 2007

Gehört hatte ich schon öfters von dem Foxit Reader: Einem kleinen, schnellen Ersatz für den Adobe Acrobat Reader. Aber in einigen Applikation verwende ich den Acrobat Reader als Komponente zur PDF Darstellung. Das heißt der Acrobat Reader ist ohnehin notwendig auf meinem Rechner installiert. Auch selbst erzeugte PDFs sollen in erster Linie im Acrobat Reader funktionieren. Da hilft Foxit nicht viel.

Und so schlimm empfand ich das Original von Adobe dann auch nicht, dass der mentale Aufwand für einen weiteren PDF Reader gerechtfertigt war. Jetzt beschäftige ich mich bei einem aktuellen Projekt intensiver mit der Adobe Acrobat Linie und der zugehörigen SDK. Auf einmal benötige ich einen zusätzlichen PDF Reader. Wieso kann man nicht mit den Adobe Tools alleine die Aufgabe lösen?

Das Problem liegt in der Architektur von Adobe Acrobat Professional und dem Adobe Reader. Es ist vielleicht schon aufgefallen, dass wenn man einmal ein PDF mit einem der beiden geöffnet hat, das andere Tool nicht mehr funktioniert. War der Reader offen, geht kein Acrobat Professional mehr und umgekehrt. Klemmt irgendwie eine (scheinbare) Instanz der Tools, geht gar nichts mehr. Auch wenn mehrere Acrobat Fenster offen sind und eines einen modalen Dialog darstellt, geht im anderen Fenster nichts mehr.

Das fällt vielleicht normalerweise nicht auf, aber wer die SDK Dokumentation noch nicht auswendig kann, wird sich wundern: Man öffnet den JavaScript Editor in Acrobat und möchte seinen Code bearbeiten. Natürlich ließt man parallel die API Dokumentation. Nur was macht der arme Entwickler mit einer PDF Dokumentation, während er in einem PDF arbeitet? Gar nichts, zumindest nicht mit Adobe-Mitteln. Erst wenn man den Editor beendet, erwacht Acrobat wieder und die Dokumentation steht zur Verfügung. Nur wer vorher die richtige Seite in der SDK geöffnet hat, kann Code und Erklärung gleichzeitig studieren.

Die einfachste Lösung war für mich, den Foxit Reader für die Adobe Acrobat SDK zu verwenden. Ironie des großen Softwarehauses.

  Foxit Reader
Wednesday, September 05, 2007 1:18:51 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Monday, August 20, 2007

Innerhalb der Acrobat Welt gibt es einige Integrations-Technologien von Adobe: Für die PDF Erzeugung ist die teure, exklusive PDF Library sicher am Besten geeignet und Plug-Ins schreibt man eher mit der Acrobat SDK in C. Für Interaktionen und einfache Automatisierungen im PDF Dokument ist JavaScript gedacht.

Eine standardisierte Skriptsprache (ECMA) auf dem Niveau von JavaScript ist sicher besser als zum Beispiel VBA (Visual Basic for Applications), mit dem man in Microsoft Office seit Jahrzehnten (ab 1995) seine Makros bastelt. Adobe hat eine dynamische, objektorientierte und modernere Sprache gewählt. Aber manches ist bei VBA besser gewesen.

Ich weiß jetzt nicht mehr, wann ich das erste mal den Microsoft VBA Editor geöffnet hatte. Es ist sehr lange her,  aber IntelliSense war damals schon vorhanden. Auch war der Code in Abhängigkeit von seiner Eigenschaft farbig markiert. Syntax highlighting nennt man das im Englischen. Was hat Adobe da zu bieten?

Acrobat JavaScript Editor

So sieht also der JavaScript Edit in Acrobat aus. Ganze 3 Buttons, farbloser Text, keinerlei Code Unterstützung und auch keine kontextsensitiven Menüs. Zum Glück kann man in den Eigenschaften einen externen Editor angeben. Am Besten einen, der JavaScript kennt.

Ohne externen Editor geht es bei längerem Code auch gar nicht mehr:

Adobe Acrobat Error

Nun quält der Microsoft Visual Studio verwöhnte Entwickler sein JavaScript irgendwie in die PDF Datei und macht dabei einen Fehler. Fehler machen gehört dazu, der Debugger hoffentlich auch.

Acrobat JavaScript Debugger

Das ist im Vergleich zum Editor jetzt fast schon eine überladene Benutzeroberfläche. Oben links finden sich die Buttons zur Ablaufsteuerung: Resume Execution, Interrupt, Quit, Step over, Step into, Step out

Dazu gibt es keine mir bekannten Hotkeys. Also fleißig mit der Maus die kleinen Knöpfchen angepeilt. Ist man an einer interessanten Stelle im Code angelangt, will man natürlich in das Code Fenster wechseln. Wer versucht mit Tabulator-Taste das aktive Steuerelement zu wechseln ist natürlich zu sehr von einem Windows Standard geblendet. Dieser Dialog will die Maus bewegt sehen!

Aber jetzt kommt der Clou! Zwischen dem aktuellen Skript und den obigen Buttons liegt ein Fenster mit der Skript Hierarchie:

Adobe_JavaScript_Debugger

Na gut, so ist das nun mal, irgendwo muss die Maus ja immer drüber. Denkste! Das Steuerelement im rot markierten Bereich hat Hot Tracking aktiviert. Die bloße Berührung mit dem Mauszeiger lässt den Code an die entsprechende Stelle springen. Weg ist der Kontext. Also die Übung wiederholen und diesmal die Maus im weiten Bogen bewegen. Na also geht doch!

Acrobat_Debugger_LineColumn

Im unteren Teil werden zwei Textboxen und einmal die aktuelle Zeile und Spalte angezeigt. Aber Vorsicht, die Anzeige gehört nur zur unteren Textbox, zur Console. Die aktuelle Zeile im Script-Fenster muss man selber zählen. Wer gut im Raten ist, kann auch das kleine Gitter # anklicken und zu einer Zeilennummer springen.

Puh! Diese kleine Lästerei musste jetzt sein. Das Nervenkostüm und die Produktivität leidet in der Adobe Welt aus meiner Sicht sehr. Ich erwarte ja keine Visual Studio oder Eclipse Umgebung, aber diesen Dialog verwendet Adobe-Intern sicher niemand. Heute will man doch eigentlich in der eigenen Infrastruktur externe Entwickler fördern. Das ist gut für das Hauptprodukt. Microsoft ist da meines Erachtens ein paar Schritte weiter.

Monday, August 20, 2007 10:42:57 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  |