#!/usr/bin/perl =head1 NAME oobuild - OpenOffice.org file creation utility =head1 SYNOPSIS oobuild filename.sxw oobuild filename.sxw --title "My Document" --subject "Test" oobuild filename --class spreadsheet --source "data.csv" --tablesize "8x16" cat data.txt | oobuild filename.sxw - =head1 OPTIONS --class Document class (text, spreadsheet, drawing, presentation) Default: text --opendocument (no value). If this option is on, the document will be in OpenDocument format. Without this option, the format will be selected according to the general configuration of the OpenOffice::OODoc installation. --creator The author of the document. Default: the current user's login name. --date Creation date. Default is current local time. If provided, must be in YYYY-MM-DDTHH:MM:SS format (ISO-8601) --description The description (abstract) of the document. Default: none. --force (no value). If this option is on, any existing file with the same path as the target file will be replaced. Without this option, the program will fail if the target exists. --generator Software signature to be stored in the file (not visible for the end user). Default: "Genicorp OpenOffice::OODoc " --keywords A list of comma-separated keywords. Default: none. --source A text file, to be used as the content of the document. If the document class is 'text', each line is loaded as a new paragraph with the standard style. If the document class is 'spreadsheet', the file is processed as CSV data and loaded in one sheet. If the document class is neither 'text' nor 'spreadsheet', the file is not processed. If source = '-', or if a '-' argument is provided, the data file is read through the standard input. --subject The subject of the document. Default: none. --tablename The name of the sheet to be created if the document class is 'spreadsheet' and if a data file is provided. Default: the name of the data file, or "Unnamed Sheet" if the data is read from the standard input. --tablesize The size of the sheet to be created if the document class is 'spreadsheet' and if a data file is provided, in 'HxW' format where H is the number of lines and W the number of columns. Default: '16x8' --title The title of the document. Default: "Untitled". --readable_XML (no value). For debugging only. If this option is on, the XML content of the target file is indented, in order to be later edited. =cut #---------------------------------------------------------------------------------------- use OpenOffice::OODoc 2.005; use Getopt::Long; my $INPUT = undef; my $input = undef; my $generator = 'Genicorp OpenOffice::OODoc ' . $OpenOffice::OODoc::VERSION; my $title = "Generated document"; my $description = "This file has been created with OpenOffice::OODoc"; my $targetfile = $ARGV[0] or die "Usage: oobuild [--options]\n"; GetOptions ( '' => \(my $stdin = undef), 'class=s' => \(my $class = 'text'), 'date=s' => \(my $date = ooLocaltime), 'generator=s' => \$generator, 'title=s' => \$title, 'subject=s' => \(my $subject = ''), 'description=s' => \$description, 'keywords=s' => \(my $keywords = ''), 'creator=s' => \(my $creator = scalar getpwuid($<)), 'source=s' => \(my $source = undef), 'tablesize=s' => \(my $tablesize = '16x8'), 'tablename=s' => \(my $tablename = undef), 'force' => \(my $force = undef), 'opendocument' => \(my $odf = undef), 'readable_XML' => \(my $rxml = undef) ); if ( -e $targetfile && ! defined $force) { die "File $targetfile exists. I don't create it.\n" . "Use --force to replace it.\n"; } my $odf_flag = $odf ? 'on' : undef; my $rxml_flag = $rxml ? 'on' : undef; my $archive = ooFile ( $targetfile, create => $class, opendocument => $odf_flag ) or die "File creation failure\n"; #---------------------------------------------------------------------------------------- my $meta = ooMeta(archive => $archive, readable_XML => $rxml_flag); $meta->creation_date($date); $meta->date($date); $meta->generator($generator); $meta->initial_creator($creator); $meta->creator($creator); $meta->title($title); $meta->subject($subject); $meta->description($description); $meta->keywords(split ',', $keywords) if $keywords; #---------------------------------------------------------------------------------------- if ($stdin || $source) { my $INPUT = undef; if ($stdin || ($source eq '-')) { $INPUT = *STDIN; $source = '-'; } else { if ( -e $source && -r $source ) { open(SOURCE, "<", $source); $INPUT = *SOURCE; } } my $content = ooDocument(archive => $archive, readable_XML => $rxml_flag); if ($class eq 'text') { my $first_para = $content->getParagraph(0); while (my $para = <$INPUT>) { $content->appendParagraph(text => $para); } $content->removeElement($first_para) if $first_para; } elsif ($class eq 'spreadsheet') { my ($cols, $lns) = split 'x', $tablesize; unless ($tablename) { if ($source gt '-') { $tablename = $source; } else { $tablename = 'Unnamed Sheet'; } } my $first_sheet = $content->getTable(0); my $sheet = $content->appendTable($tablename, $cols, $lns); $content->removeElement($first_sheet) if $first_sheet; ROW: for (my $i = 0; my $record = <$INPUT>; $i++) { last ROW unless $record; chomp $record; my @data = split ';', $record; my $row = $content->getTableRow($sheet, $i); CELL: for (my $j = 0; my $value = shift @data; $j++) { last CELL unless defined $value; $content->cellValue($row, $j, $value); } } } else { warn "Source text loading not allowed for this class\n"; } close $INPUT unless ($source eq '-'); } #---------------------------------------------------------------------------------------- $archive->save; exit; #----------------------------------------------------------------------------------------