Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Perl-Snapshot 05/2011<br />
Programmieren<br />
www.linux-magazin.de<br />
103<br />
Abbildung 1: Laser-taugliche Etiketten, 30 pro Blatt, 4200 pro Karton. Der<br />
einzelne Aufkleber ist billig und dabei praktisch.<br />
Abbildung 2: Im Open Office Writer öffnet der Labels-Eintrag aus dem »Datei |<br />
Neu«-Menü eine reiche Auswahl von Aufkleber-Formaten.<br />
So zeigt sich in Abbildung 5, dass im<br />
Dokument unter dem Tag »office:body«<br />
ein Tag namens »office:text« hängt, das<br />
nach einigen Sequence-Deklarationen<br />
wiederum einen Textabsatz vom Typ<br />
»text:p« (Paragraph) enthält. Dieser<br />
stellt sich als eine Tabellenzeile mit drei<br />
Spalten heraus, für deren Rahmen jeweils<br />
Elemente vom Typ »draw:frame«<br />
verantwortlich zeichnen, die wiederum<br />
ein »draw:text-box«-Element mit einem<br />
»text:p«-Element mitbringen, in denen<br />
sich endlich die eingegebenen Test-Texte<br />
(»test1«, …) wiederfinden.<br />
Somit fördert ein Xpath-Query vom Format<br />
//office:body/office:text/text:p<br />
alle Tabellenzeilen zutage (die ihrerseits<br />
wieder Spaltenrahmen enthalten),<br />
während sich die Tabellenelemente (drei<br />
in jeder Zeile) relativ dazu unter ».../<br />
draw:frame/drawtext-box/text:p« finden.<br />
Das Skript in Listing 2 bedient sich des<br />
ersten Xpath-Query, um zunächst das<br />
Dokument um so viele Tabellenzeilen zu<br />
erweitern, wie nötig sind, damit alle auszudruckenden<br />
Adressdaten darin Platz<br />
finden. Mit dem zweiten Query stöbert<br />
es durch alle Labels und stopft jeweils die<br />
dafür bestimmten Textdaten hinein.<br />
Zum Öffnen der ODT-Datei bedient es<br />
sich wieder des Konstruktors »ooDocument()«,<br />
der auf die Datei »ready.odt«<br />
zugreift, die ihrerseits zuvor die Funktion<br />
»cp« aus dem Modul Sysadm::<strong>In</strong>stall in<br />
Zeile 21 aus dem Template »template.odt«<br />
erzeugt hat.<br />
Die gegenwärtige Version von OpenOffice::OODoc<br />
weist einen Bug auf, der sie<br />
UTF-8-kodierte Daten inkorrekt verarbeiten<br />
lässt, falls diese Umlaute enthalten.<br />
Abbildung 3: Der User tippt Beispieltexte in die Tabellenfelder des Open-Office-Dokuments ein.<br />
Die gewählte Einstellung »local_encoding<br />
=>»"""« behebt das Problem vorläufig,<br />
sollte aber eigentlich auf den Wert »utf8«<br />
gesetzt sein.<br />
Adressbuch einpflegen<br />
Die Rohdaten legt der User in der Datei<br />
»address-book.csv« (Abbildung 6)<br />
ab, von wo sie das Skript aus Listing<br />
2 mit dem CPAN-Modul Text::CSV_XS<br />
zeilenweise mit »getline()« ausliest. Die<br />
ab Zeile 60 definierte Funktion »addresses_scan«<br />
öffnet dazu die Datei mit dem<br />
Pragma »:encoding(utf8)«, damit Perl<br />
dort stehende und in UTF-8 kodierte Umlaute<br />
auch korrekt einliest und gleichzeitig<br />
intern in den dafür vorgesehenen<br />
Datenstrukturen das UTF-8-Flag setzt. E<br />
Listing 1: »oo-dumper«<br />
01 #!/usr/local/bin/perl ‐w<br />
02 use strict;<br />
03 use OpenOffice::OODoc;<br />
04<br />
05 (my $file) = @ARGV;<br />
06<br />
07 die "usage: $0 file" unless defined $file;<br />
08<br />
09 my $doc = ooDocument(<br />
10 file => $file,<br />
11 member => "content",<br />
12 );<br />
13<br />
14 (my $element) = $doc‐>selectElements(<br />
15 '//office:body');<br />
16<br />
17 print $element‐>_dump();