#!/usr/local/bin/perl -w use strict; use OpenOffice::OODoc; use Sysadm::Install qw( :all ); use Text::CSV_XS; use POSIX qw(ceil); my $template = "template.odt"; my $file = "ready.odt"; my $addr_book = "address-book.csv"; my $labels_per_page = 30; my @addresses = addresses_scan( $addr_book); my $addtl_pages = ceil( scalar @addresses / $labels_per_page ) - 1; # Put template in place cp $template, $file; my $doc = ooDocument( file => $file, type => "content", local_encoding => "", ); # Extend document as necessary my @rows = $doc->selectElements( '//office:body/office:text/text:p' ); for ( 1 .. $addtl_pages ) { for my $row ( @rows ) { $doc->replicateElement( $row, "body" ) } } # All labels, including new ones my @labels = $doc->selectElements( '//office:body/office:text/text:p/' . 'draw:frame/draw:text-box/text:p' ); my $addr_idx = 0; for my $label ( @labels ) { $doc->setStyle( $label, "P1" ); $doc->setText( $label, $addresses[ $addr_idx ] ); $addr_idx++; $addr_idx = 0 if $addr_idx > $#addresses; } $doc->save(); ########################################### sub addresses_scan { ########################################### my( $addr_book ) = @_; my @addresses = (); open( my $fh, "<:encoding(utf8)", $addr_book ) or die "$addr_book: $!"; my $csv = Text::CSV_XS->new ( { binary => 1 } ) or die "Cannot use CSV: " . Text::CSV->error_diag (); while( my $row = $csv->getline( $fh ) ) { unshift @$row, ""; for ( @$row ) { s/^/ /; } push @addresses, join( "\n", @$row ); } close $fh; return @addresses; }