Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Programmieren<br />
www.linux-magazin.de Perl-Snapshot 05/2011<br />
104<br />
G Abbildung 4: Ein Unzip-Aufruf fördert die XML-Dateien des Open-Office-<br />
Dokuments zutage, »content.xml« enthält die Texte.<br />
E Abbildung 5: Die »_dump()«-Methode zeigt die interne Verschachtelung des<br />
XML-Dokuments.<br />
Die Variable »$row« zeigt auf ein Array,<br />
dessen Elemente die in der CSV-Datei<br />
durch Kommata getrennten Zeileneinträge<br />
repräsentieren. Um auf der linken<br />
Seite des Labels, auf dem der Texteintrag<br />
später landet, etwas Platz zu lassen, fügt<br />
das Ersetzungskommando in der For-<br />
Schleife ab Zeile 77 vor jeder Labelzeile<br />
ein Leerzeichen ein. Zeile 82 setzt die<br />
Adresszeilen zu einem String zusam-<br />
men und schiebt ihn ans Ende des Array<br />
»@addresses«, den die Funktion ans<br />
Hauptprogramm zurückreicht.<br />
Nichts verschwenden<br />
Um nicht unnötig Etiketten zu verschwenden,<br />
füllt das Skript eine A4-Seite immer<br />
vollständig aus, notfalls durch Wiederholen<br />
der ersten Adressen in der CSV-<br />
Datei. Andererseits muss Listing 2 bei<br />
einer Adressdatenbank, die mehr als 30<br />
Einträge hat, zusätzliche Seiten am Ende<br />
des Dokuments einfügen. Auch in diesem<br />
Fall füllt es eine eventuell nicht ganz ausgenutzte<br />
Seite durch die Wiederholunge<br />
von Datensätzen am Ende so auf, dass<br />
keine Etiketten leer bleiben.<br />
Zeile 16 ermittelt aus der Zahl der Adressen<br />
in der CSV-Datei und der vordefinier-<br />
Listing 2: »label-writer«<br />
01 #!/usr/local/bin/perl ‐w<br />
02 use strict;<br />
03 use OpenOffice::OODoc;<br />
04 use Sysadm::<strong>In</strong>stall qw( :all );<br />
05 use Text::CSV_XS;<br />
06 use POSIX qw(ceil);<br />
07<br />
08 my $template = "template.odt";<br />
09 my $file = "ready.odt";<br />
10 my $addr_book = "address‐book.csv";<br />
11 my $labels_per_page = 30;<br />
12<br />
13 my @addresses =<br />
14 addresses_scan( $addr_book);<br />
15<br />
16 my $addtl_pages =<br />
17 ceil( scalar @addresses /<br />
18 $labels_per_page ) ‐ 1;<br />
19<br />
20 # Put template in place<br />
21 cp $template, $file;<br />
22<br />
23 my $doc = ooDocument(<br />
24 file => $file,<br />
25 type => "content",<br />
26 local_encoding => "",<br />
27 );<br />
28<br />
29 # Extend document as necessary<br />
30 my @rows = $doc‐>selectElements(<br />
31 '//office:body/office:text/text:p'<br />
32 );<br />
33<br />
34 for ( 1 .. $addtl_pages ) {<br />
35 for my $row ( @rows ) {<br />
36 $doc‐>replicateElement( $row, "body" );<br />
37 }<br />
38 }<br />
39<br />
40 # All labels, including new ones<br />
41 my @labels = $doc‐>selectElements(<br />
42 '//office:body/office:text/text:p/' .<br />
43 'draw:frame/draw:text‐box/text:p'<br />
44 );<br />
45<br />
46 my $addr_idx = 0;<br />
47<br />
48 for my $label ( @labels ) {<br />
49 $doc‐>setStyle( $label, "P1" );<br />
50 $doc‐>setText( $label,<br />
51 $addresses[ $addr_idx ] );<br />
52 $addr_idx++;<br />
53 $addr_idx = 0 if<br />
54 $addr_idx > $#addresses;<br />
55 }<br />
56<br />
57 $doc‐>save();<br />
58<br />
59 ###########################################<br />
60 sub addresses_scan {<br />
61 ###########################################<br />
62 my( $addr_book ) = @_;<br />
63<br />
64 my @addresses = ();<br />
65<br />
66 open( my $fh, "