01 #!/usr/local/bin/perl -w 02 use strict; 03 use OpenOffice::OODoc; 04 use Sysadm::Install qw( :all ); 05 use Text::CSV_XS; 06 use POSIX qw(ceil); 07 08 my $template = "template.odt"; 09 my $file = "ready.odt"; 10 my $addr_book = "address-book.csv"; 11 my $labels_per_page = 30; 12 13 my @addresses = 14 addresses_scan( $addr_book); 15 16 my $addtl_pages = 17 ceil( scalar @addresses / 18 $labels_per_page ) - 1; 19 20 # Put template in place 21 cp $template, $file; 22 23 my $doc = ooDocument( 24 file => $file, 25 type => "content", 26 local_encoding => "", 27 ); 28 29 # Extend document as necessary 30 my @rows = $doc->selectElements( 31 '//office:body/office:text/text:p' 32 ); 33 34 for ( 1 .. $addtl_pages ) { 35 for my $row ( @rows ) { 36 $doc->replicateElement( $row, "body" ); 37 } 38 } 39 40 # All labels, including new ones 41 my @labels = $doc->selectElements( 42 '//office:body/office:text/text:p/' . 43 'draw:frame/draw:text-box/text:p' 44 ); 45 46 my $addr_idx = 0; 47 48 for my $label ( @labels ) { 49 $doc->setStyle( $label, "P1" ); 50 $doc->setText( $label, 51 $addresses[ $addr_idx ] ); 52 $addr_idx++; 53 $addr_idx = 0 if 54 $addr_idx > $#addresses; 55 } 56 57 $doc->save(); 58 59 ########################################### 60 sub addresses_scan { 61 ########################################### 62 my( $addr_book ) = @_; 63 64 my @addresses = (); 65 66 open( my $fh, "<:encoding(utf8)", 67 $addr_book ) or die "$addr_book: $!"; 68 69 my $csv = Text::CSV_XS->new ( 70 { binary => 1 } ) or die 71 "Cannot use CSV: " . 72 Text::CSV->error_diag (); 73 74 while( my $row = $csv->getline( $fh ) ) { 75 unshift @$row, ""; 76 77 for ( @$row ) { 78 s/^/ /; 79 } 80 81 push @addresses, 82 join( "\n", @$row ); 83 } 84 close $fh; 85 86 return @addresses; 87 }