25.02.2014 Aufrufe

Linux-Magazin In Zockerhänden (Vorschau)

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, "

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!