Die Variable »$row« zeigt auf ein Array, dessen Elemente die in der CSV-Datei durch Kommata getrennten Zeileneinträge repräsentieren. Um auf der linken Seite des Labels, auf dem der Texteintrag später landet, etwas Platz zu lassen, fügt das Ersetzungskommando in der For-Schleife ab Zeile 77 vor jeder Labelzeile ein Leerzeichen ein. Zeile 82 setzt die Adresszeilen zu einem String zusammen und schiebt ihn ans Ende des Array »@addresses«, den die Funktion ans Hauptprogramm zurückreicht.
Nichts verschwenden
Um nicht unnötig Etiketten zu verschwenden, füllt das Skript eine A4-Seite immer vollständig aus, notfalls durch Wiederholen der ersten Adressen in der CSV-Datei. Andererseits muss Listing 2 bei einer Adressdatenbank, die mehr als 30 Einträge hat, zusätzliche Seiten am Ende des Dokuments einfügen. Auch in diesem Fall füllt es eine eventuell nicht ganz ausgenutzte Seite durch die Wiederholunge von Datensätzen am Ende so auf, dass keine Etiketten leer bleiben.
Zeile 16 ermittelt aus der Zahl der Adressen in der CSV-Datei und der vordefinierten Anzahl von Labels pro Seite die nötige Seitenzahl des Etikettendokuments. Die Funktion »ceil()« aus dem POSIX-Modul rundet bei gebrochenen Werten auf die nächste ganze Zahl auf. Die Anzahl der zusätzlich gebrauchten Seiten in »$addtl_pages« ist dann um eins kleiner, da bereits der User das Template-Dokument mit einer Seite angelegt hat.
Alle Tabellenzeilen der Testseite liegen nach dem ersten Xpath-Query in Zeile 30 des Listings 2 im Array »@rows« und für jede zusätzlich zu erzeugende Seite iteriert die For-Schleife ab Zeile 34 über diese Zeileneinträge, dupliziert sie mit »replicateElement()« und weist die Funktion mit dem Parameter »body« an, die Dublette am Ende des Dokumentkörpers einzufügen. Die neu erzeugten Zeilen sind exakte Kopien der Zeilen der ersten Seite, enthalten also auch teilweise Elemente mit Testdaten oder sind schlicht und einfach leer.
Der zweite Xpath-Query in Zeile 41 fördert alle Tabellenelemente (drei pro Zeile, inklusive aller Elemente auf neu erzeugten Seiten) des Dokuments hervor und legt sie im Array »@labels« ab. Die For-Schleife ab Zeile 48 klappert sie ab und weist ihnen den Style »P1« zu. Ein Dump zeigt, dass dies daher rührt, dass der User vorher beim Eingeben der Testdaten den Verana-Font eingestellt hat.
Der anschließende Aufruf von »setText()« nimmt den nächsten Datensatz aus der Adressdatei und legt den zugehörigen Textstring im gerade bearbeiteten Tabellenelement ab. Die Schleife zählt die Indexvariable »$addr_idx« des Adress-Array von Null ausgehend stetig hoch und setzt sie auf Null zurück, falls sie das Ende der Adressdatenbank erreicht, um wieder mit der ersten Adresse zu beginnen.
Label im Papierschacht richtig einlegen
Die abschließend ausgeführte Methode »save()« sichert die bislang nur im flüchtigen Speicher ausgeführten Veränderungen in der Zieldatei »ready.odt« auf der Festplatte. Ruft der User sie mit Open Office auf (getestet mit Version 3.2), zeigt sich das Dokument wie in Abbildung 8 zu sehen.

Abbildung 8: Jetzt in Open Office Write auf »Drucken« klicken, schon kommen die Etiketten aus dem Drucker.
Nun gilt es nur noch, eine Seite mit den Selbstklebe-Etiketten in den Drucker einzulegen und in Open Office Writer den Menü-Eintrag »Drucken« anzuklicken. Um keine Etiketten zu verschwenden, empfiehlt sich ein Probelauf mit einem Blatt Papier, dessen Aufdruck man anschließend durch ein frisches Etikettenblatt durchscheinen lässt.





