Open Source im professionellen Einsatz
Linux-Magazin 10/2004

Open-Office-Dokumente erstellen mit Perl

Ab die Post!

Um nur schnell einen Brief am Computer zu schreiben, lohnt sich der Start von Open Office kaum. Wer nicht zum Kugelschreiber greifen will, wirft den Perl-Interpreter an. Ein Modul hilft auf Open-Office-Dokumente zuzugreifen. So sind sauber formatierte Briefe in Windeseile erstellt und ausgedruckt.

837

Open Office ist eine echte Alternative zu reinen Windows-Lösungen wie Microsoft Office. Die Installation gelingt mit wenigen Schritten und Open-Office-Dokumente lassen sich - anders als ihre proprietären Kollegen - hervorragend von anderen Programmen aus manipulieren. So ist es nicht mal nötig, Open Office zu starten.

Natürlich bietet auch Perl ein Modul für den Zugriff auf Open-Office-Daten. Das Programm Mailit (siehe Listing 1) hilft dabei, schnell und unkompliziert Briefe zu erstellen. Dazu arbeitet es mit einer Vorlage wie in Abbildung 1. In diese baut es Adressaten, Betreff, Text und das aktuelle Datum ein. Für alle Felder finden sich in der Vorlage Platzhalter:

  • »[% date %]«: Datum
  • »[% recipient %]«: Empfänger-Adresse
  • »[% subject %]«: Betreff
  • »[% text %]«: Brieftext

Abbildung 1: Das Office-Dokument »letter.sxw« enthält Platzhalter für dynamisch eingesetzte Textpassagen. Mailit ersetzt sie durch die eigentlichen Daten.

Mailit erzeugt aus einer reinen Textdatei wie in Abbildung 3 unter Verwendung der Vorlage einen sauber gesetzten Brief (siehe Abbildung 2). Die Textdatei folgt einem einfachen Format: Der erste Absatz enthält die Betreffzeile des späteren Briefs, alle folgenden geben den Brieftext an. Mailit generiert das Datum rechts oben und formatiert es entsprechend der eingestellten Landessprache.

Abbildung 2: Mailit hat die Textpassage aus Abbildung 2 sowie Adressaten und Datum in die Vorlage aus Abbildung 1 eingebaut.

Abbildung 3: Die Textversion des Briefs im Editor Vi. Der erste Absatz gibt den Betreff an, der Rest den Brieftext.

Auf den Schultern von Riesen

Bei der Implementierung von Mailit kamen sage und schreibe fünf CPAN-Module zum Einsatz, deren Möglichkeiten üblicherweise weiter reichen als nur für kurze Skript-Eskapaden. Das erste ist »OpenOffice::OODoc«, es bietet eine objektorientierte Schnittstelle zu Inhalt und Struktur von Open-Office-Dokumenten. Für die Aufgabe von Mailit (reine Textersetzung) genügt die Unterklasse »OpenOffice::OODoc::Text«.

Der Konstruktor »new« öffnet in Zeile 24 von Mailit zuerst die angegebene Open-Office-Datei, die, wie Abbildung 1 zeigt, ein Template-Dokument im gewünschten Format mit den Platzhaltern enthält. Die Methode »getTextElementList()« extrahiert später eine Liste aller Textelemente im Dokument. Die zurückgegebenen Werte sind Referenzen auf Objekte vom Typ »XML::XPath::Node::Element«, da »OpenOffice::OODoc« unter der Haube »XML::XPath« für die interne Darstellung der XML-basierten Open-Office-Dateien nutzt.

Um den Text des von der List-Funktion zurückgelieferten Elements » zu extrahieren, ruft der Programmierer die Methode »getText()« des »OpenOffice::OODoc::Text«-Objekts auf und übergibt dann die Elementreferenz: »->getText()«. Den so erhaltenen Text, der typischerweise einen ganzen Absatz im Open-Office-Dokument repräsentiert, untersucht Mailit auf vorkommende Platzhalter im Format »[% xxx %]« und ersetzt deren Werte entsprechend den Vorgaben.

Das Ergebnis schreibt das Programm anschließend mit Hilfe der »setText()«-Methode (Zeile 66) wieder zurück ins Dokument, ebenfalls unter Angabe der entsprechenden Elementreferenz: »->setText(, )«

Textersetzung leicht gemacht

Die eigentliche Textersetzung nimmt das zweite Modul, das mächtige Template Toolkit vor. Es ist das neue In-Modul für Webapplikationen, die von Designern gestaltete HTML-Templates mit dynamischen Daten füllen. Mailit erzeugt in Zeile 50 ein Objekt der Klasse »Template«. Der ab Zeile 52 definierte Hash »%vars« ordnet den Platzhaltern im Dokument ihre dynamisch zugewiesenen Werte zu. Die danach aufgerufene »process()«-Methode des »Template«-Moduls übernimmt in Mailit drei Parameter:

  • Eine Referenz auf den Template-String,
  • eine Referenz auf den Hash »%vars«,
  • eine Referenz auf eine Funktion, der »process()«
    nach erfolgreicher Textersetzung den Ergebnisstring
    übergibt.

Letzterer ist optional, eignet sich aber in Mailit gut dafür, den bearbeiteten Text gleich per »setText()« an das Open-Office-Dokument weiterzureichen. Das so modifizierte Dokument landet in Zeile 76 per »save« in einer neuen temporären Datei, die das Modul »File::Temp« in Zeile 69 angelegt hat.

»File::Temp« ist der Cadillac unter den Tempfile-Modulen. Die Stärke dieser Module ist es, temporäre Dateien anzulegen, ohne mit bereits bestehenden zu kollidieren. Der Programmierer wählt, in welchem Verzeichnis die Datei landen soll (»DIR => \'/tmp\'«), welche Endung sie aufweist (»SUFFIX => \'.sxw\'«) und nach welcher Vorlage das Modul den Namen generiert. Der Parameter »TEMPLATE => \'ooXXXXX\'« gibt an, dass nach einem einleitenden »oo« fünf zufällige Zeichen stehen sollen. Der komplette Name einer Temp-Datei sieht etwa so aus: »/tmp/oo2hkss.sxw«

Der »UNLINK«-Parameter des »File::Temp«-Konstruktors bestimmt, ob das Modul die Datei wegputzt, wenn das zugehörige Objekt erlischt. Das zurückgelieferte Handle lässt sich als File-Handle verwenden und expandiert innerhalb eines Strings (»""«) zum Namen der temporären Datei.

Das vierte Modul - »Date::Calc« - hilft Mailit das heutige Datum zu bestimmen und es landestypisch ins Format » XX. Monat Jahr« umzuwandeln. Es setzt zunächst die Locale mit »Language(Decode_Language("Deutsch"))« und ruft weiter unten »Month_to_Text()« auf, um die von der Funktion »Today()« zurückgegebene Monatsnummer in den deutschen Namen umzuwandeln.

Für die Bestimmung der mehrzeiligen Empfängeradresse, die den Platzhalter »[% recipient %]« im Dokument ersetzt, zieht Mailit eine Adressdatenbank heran. Eine der wichtigen Fragen beim Programmieren von Mailit war es daher, welches Format sich am besten für eine einfache Adressdatenbank eignet. Die exzessiven Triangel von XML führen bei einem menschlichen Leser schnell zu dreieckigen Augen und Kopfschmerzen.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Open Office hilft mit einer Vielzahl vorkonfigurierter Formate beim Ausdrucken von selbstklebenden Etiketten. Perl speist die dazu erforderlichen Adressdaten ins Dokument ein.

  • Schön eingefasst

    Open Office 2 sitzt in den Startlöchern und alle Welt wartet gespannt - auf Features wie die Access-ähnliche Datenbankanwendung. Auch unter der Haube hat sich viel getan: Das SDK bietet eine Basisklasse für Java- Beans, um die Office-Suite in eigene Programme einzubinden.

  • Libre Office importiert erstmals Corel-Draw-Text

    Der Libre-Office-Entwickler Fridrich Strba meldet, er habe erstmals Text aus Corel-Draw-Dokumenten in die freie Bürosuite importiert.

  • Freie Java-Bibliothek verarbeitet ODF-Dokumente

    Die französische Firma ILM Informatique hat JOpendocument in Version 1.0 unter GPL freigegeben. Die Java-Bibliothek stellt Funktionen für die Verarbeitung des Open-Document-Formats (ODF) zur Verfügung.

  • Bitparade

    Niemand mag sie schreiben, doch sind sie geradezu ein Wundermittel gegen das Scheitern von Softwareprojekten, gegen überzogene Kundenwünsche und Verständnisprobleme zwischen Auftraggebern und Dienstleistern: Pflichtenhefte. Textverarbeitungen und Templates bieten eine solide Arbeitsgrundlage.

comments powered by Disqus

Ausgabe 04/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.