Word-XML nach HTML konvertierenBallast abwerfen

DeveloperIT-ProjekteSoftware

Text-Export

Word-XML nach HTML konvertieren

Was zum bequemen Bestücken eines Blogs oder CMS aus der Textverarbeitung heraus fehlt, ist eine Export-Variante, die leichtgewichtigen HTML-Code erzeugt ? am besten noch mit CSS-Unterstützung, um die Formate zentral zu verwalten.

Basierend auf der aktuellen Word-Version 2003 ist dies mit den Mitteln von PHP 5 einfach möglich. Denn die Dokumente lassen sich aus Word heraus im XML-Format speichern. Das kann dank der in PHP 5 integrierten Simple-XML-Funktionen einfach durchgekaut und entsprechend aufbereitet in HTML-Form wieder ausgegeben werden.

Ziel des hier vorgestellten Skripts ist die Unterstützung von CSS. Dazu werden die im Word-Text verwendeten Druckformatnamen herangezogen und zu class-Verweisen umgewandelt. Allerdings muss man selbst für die Erzeugung der CSS-Datei sorgen, damit jedes Word-Format eine Entsprechung in der CSS-Datei besitzt.

Das Skript ist so angelegt, dass man ihm per Parameter den Namen der Word-Datei sowie den Namen der CSS-Datei übergibt. Über optionale Zusatzparameter lassen sich sogar zusätzlich noch Formatnamen angeben, deren Ausgabe unterdrückt werden soll. Nützlich ist dies beispielsweise dann, wenn manche Elemente nur bei der Nutzung des Dokuments als Ausdruck sinnvoll sind. In unserem Beispielartikel ist das der Text, der mit dem Format Leserführung ausgezeichnet ist. Dies ist die Zeile ganz oben im Heft, die zur einfacheren Orientierung beim Durchblättern dient. Im Browser bringt das keinen Nutzen und kann daher entfallen.

Neben dem PHP-Skript finden Sie auf der Heft-CD als Beispieldokument einen Artikel aus einer vergangenen Heftausgabe zusammen mit einem beispielhaften CSS-File.

Umwandlungsfunktionen

Word-XML nach HTML konvertieren

Die Funktion extract_paragraphs() übernimmt die Hauptarbeit des Umwandlungsskripts. Der Rest des Skripts dient lediglich der Ermittlung übergebener Parameter und der Bildung des HTML-Grundgerüsts für die Ausgabe. Zu Beginn von extract_paragraphs() wird die als XML gespeicherte Word-Datei über diesen Aufruf eingelesen.

$objXml = @simplexml_load_file($strFilename);

Der Dateiname wurde im Hauptprogramm über den Aufrufparameter quelle ermittelt und an die Funktion übergeben. Im einfachsten Fall gibt man dabei eine lokal auf dem Server residierende Datei an. Dank der so genannten fopen-wrappers von PHP klappt das aber genauso mit einem HTTP- oder FTP-Quelldokument über die Verwendung der URL-Syntax. Das Programm muss sich um die Unterscheidung der Datenquellen nicht kümmern, weil dies völlig von PHP behandelt wird.

Außerdem erwähnenswert: Der Aufruf von simplexml_load_file() wird, wie gezeigt, von einem @ eingeleitet. Das bewirkt im Fehlerfall die Unterdrückung der Warnmeldung von PHP. Diese Meldung wird gegebenenfalls in den nächsten beiden Zeilen vom Skript selbst in einer besser verständlicher Form nachgeholt, als sie die hauseigene Warnung von PHP liefert.

Die nächsten beiden Zeilen finden alle Knoten im XML-File heraus, die einem Absatz im Word-Dokument entsprechen:

$path_para='//w:p';
foreach($objXml->xpath($path_para) as $para) {...}

Dabei wird in der ersten Zeile die Suchmaske für die gewünschten XML-Knoten festgelegt. Ein nützliches Tutorial zur dabei verwendeten Xpath-Syntax finden Sie auf www.zvon.org/xxl/XPathTutorial/General/examples.html.

Tatsächlich befinden sich die Tags der Form , die im Word-Dokument einen Absatz einleiten, tief eingebaut in der XML-Hierarchie. Der doppelte Schrägstrich bewirkt hier aber, dass die entsprechenden Knoten gefunden werden, ganz gleich wie die darüber liegenden XML-Äste lauten. Das foreach-Konstrukt durchläuft alle gefundenen Absätze, wobei der Inhalt der Variablen $para bei jedem Durchlauf dem aktuellen Absatz-Knoten entspricht.

Namensräume beachten

Word-XML nach HTML konvertieren

Um den nächsten Codeteil verstehen zu können, muss man sich ein wenig mit den namespaces beschäftigen. Dieses Konzept, das es in vielen Programmiersprachen gibt, sorgt dafür, dass gleich lautende Bezeichner aus verschiedenen Teilbereichen nicht zu Problemen führen, wenn sie in einem Projekt gemeinsam zum Einsatz kommen. Meist bekommen dazu die verwendeten Bezeichner einfach ein unterschiedliches Präfix verpasst ? wie auch hier bei den Word-Dateien: Alle Word-spezifischen Tags beginnen mit w: (die allgemein Microsoft-Office zugewiesenen Tags tragen übrigens ein o: im Namen). Jeder offizielle Namensraum wird in einer XML-Schema-Datei definiert. Für Word-Dateien ist das zum Beispiel das Dokument ‘http://schemas.microsoft.com/office/word/2003/wordml’ .

Das Präfix w: kam auch weiter oben schon zum Vorschein, bei der Xpath-Suchmaske. Während es dort allerdings einfach mit in den Suchstring aufgenommen werden konnte, klappt das bei den nun gewünschten Simple-XML-typischen Zugriffen in Objektmanier nicht mehr. Denn wenn man hier den Doppelpunkt mit angeben würde, bekäme man sofort von PHP einen Syntax-Error um die Ohren gehauen.

Mit einem Trick zum Ziel

Word-XML nach HTML konvertieren

Man kann das Namespace-Präfix allerdings mit einer Maßnahme loswerden, die im PHP-Manual so nicht zu finden ist. Angelpunkt dafür ist die Methode children(), mit der alle Unterknoten eines Simple-XML-Objekts zurückgeliefert werden. Gibt man hier als Parameter die Schemadatei an, unterdrückt Simple XML bei den Rückgabewerten automatisch den Präfix-Teil.

So kann man sich dann in der Variablen $para_children alle Tochterknoten eines Absatz-Objekts zurückliefern lassen und erhält über den folgenden Ausdruck den Namen des zu Grunde liegenden Formats:

$style = $para_children->pPr->pStyle['val'];

Dabei ist der letzte Teil in eckigen Klammern notwendig, weil der Name des Formats nicht als Inhalt der Tags ... zu finden ist, sondern als Attribut val des öffnenden Tags.

Brauchbares aussortieren

Word-XML nach HTML konvertieren

Nun durchläuft eine weitere foreach-Schleife die ermittelten Unterelemente des Absatzknotens und sortiert aus, was zur Ausgabe gelangen soll. Das sind einerseits alle einfachen Textteile, sowie die Hyperlinks, die im erzeugten HMTL gleich in Tags der Form eingebettet werden sollen.

foreach($para_children as $name=>$para_child)

Der Ausdruck hinter dem as ist in diesem Fall keine einfache Schleifenvariable, sondern die PHP-typische Kombination aus Schlüssel und Wert. Der Schlüssel entspricht hierbei dem ersten Tag des jeweiligen Unterelements, das dringend zur Fallunterscheidung gebraucht wird.

Lautet dieses Tag , dann handelt es sich beim Element um normalen Text, der dann im untergeordneten Tag zu finden ist. Ein hlink dagegen zeigt einen Hypertext-Link an. Dessen Zieladresse findet sich im Attribut dest und der dargestellte Link-Text wie beim normalen Text in der Tag-Hierarchie ... , nur eben hierbei dem Tag untergeordnet.

Je nach festgestelltem Element fügt der Rumpf der foreach-Schleife der Variablen $content entweder nur den Textteil oder der Hypertext-Link hinzu. Außerdem wird durch die Anwendung der PHP-Funktion utf8_decode() die im XML-File angewendete Kodierung von Umlauten und Sonderzeichen wieder zurückgenommen.

Ergebnisse ausgeben

Word-XML nach HTML konvertieren

Alternative XSL

Word-XML nach HTML konvertieren

Während die hier vorgestellte Lösung zur Konvertierung eines Word-Dokuments nach HTML per PHP-Programm den XML-Code durchwühlt, gibt es noch einen ganz anderen Ansatz: Eine XSL-Datei soll die XML-Vorlage durch die Anwendung von Transformationsregeln webfähig machen. Die Umsetzung ist nicht ganz einfach. Microsoft hat ein XSL-File mit Namen
word2xml.xsl
schon selbst geschaffen. Den originalen Download-URL von Microsoft kann man leider niemandem zumuten, darum hier die Adresse eines Redirectors:

www.wssdemo.com/redir.aspx?url=14
.

Alle Listings zum Workshop finden Sie auf der Heft-CD und unter
listings.internet-pro.de
.

Lesen Sie auch :